diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index b104ca535..51bd1ede6 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -34,7 +34,7 @@ public class Xoa_app_ { } } public static final String Name = "xowa"; - public static final String Version = "3.6.3.3"; + public static final String Version = "3.6.3.4"; 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/addons/Xoax_addon_mgr.java b/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java index f4d8afcfe..43ef25cad 100644 --- a/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java @@ -40,21 +40,23 @@ public class Xoax_addon_mgr { ( 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.utils_rankings .Xoax_builds_utils_rankings_addon() - , new gplx.xowa.addons.wikis.searchs .Xoax_builds_search_addon() + , new gplx.xowa.addons.wikis.searchs .Xoax_builds_search_addon() , new gplx.xowa.addons.bldrs.updates.files .Xoax_updates_files_addon() , new gplx.xowa.addons.bldrs.htmls .Html__dump_to_fsys__addon() , new gplx.xowa.addons.bldrs.exports .Export_addon() , new gplx.xowa.addons.wikis.pages.randoms .Rndm_addon() // specials - , new gplx.xowa.addons.wikis.registrys .Wiki_registry_addon() - , new gplx.xowa.addons.wikis.imports .Xow_import_addon() + , new gplx.xowa.addons.wikis.registrys .Wiki_registry_addon() + , new gplx.xowa.addons.wikis.imports .Xow_import_addon() , new gplx.xowa.addons.bldrs.centrals .Xobc_task_addon() , new gplx.xowa.addons.apps.helps.logs .Xolog_addon() // jsons - , new gplx.xowa.addons.servers.https .Xoax_long_poll_addon() ); + if (app.Mode().Tid_is_http()) { + app.Addon_mgr().Itms__add_many(new gplx.xowa.addons.servers.https.Xoax_long_poll_addon()); + } return this; } public void Run_by_app(Xoa_app app) { @@ -83,6 +85,5 @@ public class Xoax_addon_mgr { } } } - // app.Gui__cbk_mgr().Reg(gplx.xowa.addons.servers.https.Xog_cbk_wkr__http.Instance); } } diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/centrals/Xobc_task_html.java b/400_xowa/src/gplx/xowa/addons/bldrs/centrals/Xobc_task_html.java index 9e3bd2309..ba7e4eb81 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/centrals/Xobc_task_html.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/centrals/Xobc_task_html.java @@ -38,7 +38,7 @@ class Xobc_task_html extends Xow_special_wtr__base { head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("js", "xo.log.js"))); head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("js", "xo.ajax.listener.js"))); head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("js", "xo.app.js"))); - head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("js", "xo.app." + (gplx.core.envs.Op_sys.Cur().Tid_is_drd() ? "drd" : "swt") + ".js"))); + head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("js", Get_app_js_file(app)))); head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("js", "xo.elem.js"))); head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("js", "xo.tmpl.js"))); head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("js", "xo.notify.js"))); @@ -46,4 +46,8 @@ class Xobc_task_html extends Xow_special_wtr__base { head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("js", "xobc.util.js"))); head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("js", "xobc.js"))); } + private static String Get_app_js_file(Xoa_app app) { + if (app.Mode().Tid_is_http()) return "xo.app.http_server.js"; + return gplx.core.envs.Op_sys.Cur().Tid_is_drd() ? "xo.app.drd.js" : "xo.app.swt.js"; + } } diff --git a/400_xowa/src/gplx/xowa/addons/servers/https/Http_long_poll_cmd.java b/400_xowa/src/gplx/xowa/addons/servers/https/Http_long_poll_cmd.java index 1649098d5..a8851e51e 100644 --- a/400_xowa/src/gplx/xowa/addons/servers/https/Http_long_poll_cmd.java +++ b/400_xowa/src/gplx/xowa/addons/servers/https/Http_long_poll_cmd.java @@ -22,7 +22,9 @@ public class Http_long_poll_cmd implements gplx.xowa.htmls.bridges.Bridge_cmd_it public int Sleep_interval = 100; public int Send_interval = 1000; - public void Init_by_app(Xoa_app app) {} + public void Init_by_app(Xoa_app app) { + app.Gui__cbk_mgr().Reg(Xog_cbk_wkr__http.Instance); + } public void Send_msg(String msg) { msgs.Add(msg); } @@ -42,7 +44,6 @@ public class Http_long_poll_cmd implements gplx.xowa.htmls.bridges.Bridge_cmd_it return String_.Concat_lines_nl(msgs.To_str_ary_and_clear()); } - public byte[] Key() {return BRIDGE_KEY;} - public static final byte[] BRIDGE_KEY = Bry_.new_a7("long_poll"); + public byte[] Key() {return BRIDGE_KEY;} private static final byte[] BRIDGE_KEY = Bry_.new_a7("long_poll"); public static final Http_long_poll_cmd Instance = new Http_long_poll_cmd(); Http_long_poll_cmd() {} } diff --git a/400_xowa/src/gplx/xowa/addons/servers/https/Xog_cbk_wkr__http.java b/400_xowa/src/gplx/xowa/addons/servers/https/Xog_cbk_wkr__http.java index eb1de8422..52cb8be47 100644 --- a/400_xowa/src/gplx/xowa/addons/servers/https/Xog_cbk_wkr__http.java +++ b/400_xowa/src/gplx/xowa/addons/servers/https/Xog_cbk_wkr__http.java @@ -16,9 +16,14 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.addons.servers.https; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.servers.*; -import gplx.xowa.guis.cbks.*; import gplx.core.gfobjs.*; +import gplx.xowa.guis.cbks.*; import gplx.core.gfobjs.*; import gplx.xowa.guis.cbks.swts.*; public class Xog_cbk_wkr__http implements Xog_cbk_wkr { - public Object Send_json(Xog_cbk_trg trg, String func, Gfobj_nde data) {return null;} + private final Gfobj_wtr__json__browser json_wtr = new Gfobj_wtr__json__browser(); + public Object Send_json(Xog_cbk_trg trg, String func, Gfobj_nde data) { + String script = json_wtr.Write_as_func__drd(func, data); + Http_long_poll_cmd.Instance.Send_msg(script); + return null; + } public void Send_prog(String head) { Http_long_poll_cmd.Instance.Send_msg(head); } diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/Http_file_utl.java b/400_xowa/src/gplx/xowa/apps/servers/http/Http_file_utl.java new file mode 100644 index 000000000..d4c5a8901 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/servers/http/Http_file_utl.java @@ -0,0 +1,50 @@ +/* +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.servers.http; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*; +import gplx.xowa.files.*; +class Http_file_utl { + public static byte[] To_mime_type_by_path_as_bry(byte[] path_bry) { + int dot_pos = Bry_find_.Find_bwd(path_bry, Byte_ascii.Dot); + return dot_pos == Bry_find_.Not_found ? Mime_octet_stream : To_mime_type_by_ext_as_bry(path_bry, dot_pos, path_bry.length); + } + public static byte[] To_mime_type_by_ext_as_bry(byte[] ext_bry, int bgn, int end) { + Object o = mime_hash.Get_by_mid(ext_bry, bgn, end); + return o == null ? Mime_octet_stream : (byte[])o; + } + private static final byte[] + Mime_octet_stream = Xof_ext_.Mime_type__ary[Xof_ext_.Id_unknown] + , Mime_html = Bry_.new_a7("text/html") + , Mime_css = Bry_.new_a7("text/css") + , Mime_js = Bry_.new_a7("application/javascript") + ; + private static final Hash_adp_bry mime_hash = Mime_hash__new(); + private static Hash_adp_bry Mime_hash__new() { + Hash_adp_bry rv = Hash_adp_bry.ci_a7(); + int len = Xof_ext_.Id__max; + for (int i = 0; i < len; ++i) { + rv.Add_bry_obj + ( Bry_.Add(Byte_ascii.Dot, Xof_ext_.Bry__ary[i]) + , Xof_ext_.Mime_type__ary[i]); + } + rv.Add_str_obj(".htm" , Mime_html); + rv.Add_str_obj(".html" , Mime_html); + rv.Add_str_obj(".css" , Mime_css); + rv.Add_str_obj(".js" , Mime_js); + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_socket.java b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_socket.java index ad4435cf3..05205216b 100644 --- a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_socket.java +++ b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_socket.java @@ -51,9 +51,9 @@ class Http_server_socket implements Gfo_invk { wkr_pool.Add(wkr_uid); // server_wtr.Write_str_w_nl("added new worker; uid=" + wkr_uid); } - Http_server_wkr_v2 wkr = new Http_server_wkr_v2(server_mgr, wkr_uid); + Http_server_wkr wkr = new Http_server_wkr(server_mgr, wkr_uid); wkr.Init_by_thread(client_socket); - Thread_adp_.Start_by_key("thread:xowa.http_server.client", wkr, Http_server_wkr_v2.Invk_run); + Thread_adp_.Start_by_key("thread:xowa.http_server.client", wkr, Http_server_wkr.Invk_run); } } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr_v2.java b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java similarity index 85% rename from 400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr_v2.java rename to 400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java index 56d743da3..1228e2187 100644 --- a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr_v2.java +++ b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java @@ -20,7 +20,7 @@ import gplx.core.ios.*; import gplx.core.ios.streams.*; import gplx.core.primitives.*; import gplx.core.net.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.apps.*; import gplx.xowa.htmls.js.*; -class Http_server_wkr_v2 implements Gfo_invk { +class Http_server_wkr implements Gfo_invk { private final int uid; private final Http_server_mgr server_mgr; private final Http_server_wtr server_wtr; @@ -34,7 +34,7 @@ class Http_server_wkr_v2 implements Gfo_invk { private final Bry_bfr tmp_bfr = Bry_bfr_.New_w_size(64); private Socket_adp socket; private Http_data__client data__client; - public Http_server_wkr_v2(Http_server_mgr server_mgr, int uid){ + public Http_server_wkr(Http_server_mgr server_mgr, int uid){ this.server_mgr = server_mgr; this.uid = uid; this.app = server_mgr.App(); this.server_wtr = server_mgr.Server_wtr(); this.url_encoder = server_mgr.Encoder(); this.root_dir_http = app.Fsys_mgr().Root_dir().To_http_file_str(); @@ -84,6 +84,7 @@ class Http_server_wkr_v2 implements Gfo_invk { int url_end = question_pos == Bry_find_.Not_found ? url.length : question_pos; // ignore files with query params; EX: /file/A.png?key=val url_encoder.Decode(tmp_bfr, Bool_.N, url, url_bgn, url_end); // decode url to actual chars; note that XOWA stores on fsys in UTF-8 chars; "�" not "%C3" byte[] path = tmp_bfr.To_bry_and_clear(); + if (gplx.core.envs.Op_sys.Cur().Tid_is_wnt()) path = Bry_.Replace(path, Byte_ascii.Backslash, Byte_ascii.Slash); client_wtr.Write_bry(Xosrv_http_wkr_.Rsp__http_ok); // client_wtr.Write_str("Expires: Sun, 17-Jan-2038 19:14:07 GMT\n"); String mime_type = String_.new_u8(Http_file_utl.To_mime_type_by_path_as_bry(path)); @@ -179,33 +180,3 @@ class Xosrv_http_wkr_ { , Rsp__content_type_html = Bry_.new_a7("Content-Type: text/html; charset=utf-8\n") ; } -class Http_file_utl { - public static byte[] To_mime_type_by_path_as_bry(byte[] path_bry) { - int dot_pos = Bry_find_.Find_bwd(path_bry, Byte_ascii.Dot); - return dot_pos == Bry_find_.Not_found ? Mime_octet_stream : To_mime_type_by_ext_as_bry(path_bry, dot_pos, path_bry.length); - } - public static byte[] To_mime_type_by_ext_as_bry(byte[] ext_bry, int bgn, int end) { - Object o = mime_hash.Get_by_mid(ext_bry, bgn, end); - return o == null ? Mime_octet_stream : (byte[])o; - } - private static final byte[] - Mime_html = Bry_.new_a7("text/html") - , Mime_jpg = Bry_.new_a7("image/jpeg") - , Mime_png = Bry_.new_a7("image/png") - , Mime_gif = Bry_.new_a7("image/gif") - , Mime_svg = Bry_.new_a7("image/svg+xml") - , Mime_css = Bry_.new_a7("text/css") - , Mime_js = Bry_.new_a7("application/javascript") - , Mime_octet_stream = Bry_.new_a7("application/octet-stream") - ; - private static final Hash_adp_bry mime_hash = Hash_adp_bry.ci_a7() - .Add_str_obj(".htm" , Mime_html) - .Add_str_obj(".html" , Mime_html) - .Add_str_obj(".jpg" , Mime_jpg) - .Add_str_obj(".png" , Mime_png) - .Add_str_obj(".gif" , Mime_gif) - .Add_str_obj(".svg" , Mime_svg) - .Add_str_obj(".css" , Mime_css) - .Add_str_obj(".js" , Mime_js) - ; -} diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr_v1.java b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr_v1.java deleted file mode 100644 index d632ce9c4..000000000 --- a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr_v1.java +++ /dev/null @@ -1,174 +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.apps.servers.http; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*; -import gplx.core.envs.Op_sys; -import gplx.core.net.*; import gplx.core.threads.*; import gplx.langs.htmls.encoders.*; -import java.io.*; -import java.net.*; -import java.nio.charset.Charset; -class Http_server_wkr_v1 implements Runnable{ - private static final String CRLF = "\r\n"; - private Socket socket; - private Xoae_app app; - private String app_root_dir; - public Http_server_wkr_v1(Socket socket, Xoae_app app){ - this.socket = socket; - this.app = app; - this.app_root_dir = app.Fsys_mgr().Root_dir().To_http_file_str(); - } - public void run(){ - String err_line = "00"; - try { - InputStream is = socket.getInputStream(); err_line = "01"; - DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); err_line = "02"; - BufferedReader br = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); err_line = "03"; - String request = br.readLine(); err_line = "04"; - //System.out.println(request); err_line = "03"; - String req = request.substring(4, request.length() - 9).trim(); err_line = "05"; - String wiki_domain = "home"; err_line = "06"; - String page_name = "Main_Page"; err_line = "07"; - - if(!req.contains("%file%")){ - if(req.equals("/")) { // no page; EX:"localhost:8080" vs "localhost:8080/en.wikipedia.org/wiki/Earth" - String home_url = String_.new_u8(app.Http_server().Home()); err_line = "08"; - if (String_.Has_at_bgn(home_url, "file://")) { - Io_url file_url = Io_url_.http_any_(home_url, Op_sys.Cur().Tid_is_wnt()); err_line = "09"; - String page_html = Io_mgr.Instance.LoadFilStr(file_url); err_line = "10"; - Write_page(dos, page_html, app_root_dir, wiki_domain); err_line = "11"; - } - else { - req += app.Http_server().Home(); err_line = "12"; - } - } - req = Http_server_wkr_.Assert_main_page(app, req); err_line = "13"; - } - - if(req.contains("%xowa-cmd%") || req.contains("/xowa-cmd:")){ - System.out.println("Command output:"); err_line = "14"; - String cmd = ""; err_line = "15"; - if (req.contains("%xowa-cmd%")) - cmd = req.substring(req.indexOf("%xowa-cmd%")+20); - else - cmd = req.substring(req.indexOf("/xowa-cmd:")+10); - System.out.println(cmd); err_line = "15"; - app.Http_server().Run_xowa_cmd(app, cmd); err_line = "16"; - dos.writeBytes("Command sent, see console log for more details."); err_line = "17"; - dos.close(); err_line = "18"; - } - else if(req.contains("%file%")){ - String path = req.replace("/%file%/", app_root_dir); err_line = "19"; - path = path.substring(path.indexOf(app_root_dir)+5); err_line = "20"; - Gfo_url_encoder url_converter = Gfo_url_encoder_.Http_url; err_line = "21"; - path = url_converter.Decode_str(path); err_line = "22"; - if(path.contains("?")){ - path = path.substring(0, path.indexOf("?")); err_line = "23"; - } - - FileInputStream fis = new FileInputStream(path); err_line = "24"; - - dos.writeBytes("HTTP/1.1 200 OK: "); err_line = "25"; - dos.writeBytes("Content-Type: " + contentType(path) + CRLF); err_line = "26"; - dos.writeBytes(CRLF); err_line = "27"; - - sendBytes(fis, dos); err_line = "28"; - fis.close(); err_line = "28"; - dos.close(); err_line = "29"; - br.close(); err_line = "30"; - socket.close(); err_line = "31"; - }else{ - String[] req_split = req.split("/"); err_line = "32"; - System.out.println("Request: " +request); err_line = "33"; - if(req_split.length >= 1){ - wiki_domain = req_split[1]; err_line = "34"; - } - if(req_split.length >= 4){ - page_name = req_split[3]; err_line = "35"; - for(int i = 4; i <= req_split.length-1; i++){ - page_name += "/"+req_split[i]; err_line = "36"; - } - Gfo_url_encoder url_converter = Gfo_url_encoder_.Http_url; err_line = "37"; - page_name = url_converter.Decode_str(page_name); err_line = "38"; - //page_name = app.Url_converter_url().Decode_str(page_name); - } - try{ -// String page_html = app.Http_server().Parse_page_to_html(app, wiki_domain, page_name); err_line = "39"; -// Write_page(dos, page_html, app_root_dir, wiki_domain); err_line = "40"; - }catch(Exception err) { - dos.writeBytes("Site not found. Check address please, or see console log.\n"+err.getMessage()); err_line = "41"; - dos.close(); err_line = "42"; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - catch (Exception e) { - String err_msg = String_.Format("error retrieving page. Please make sure your url is of the form: http://localhost:8080/home/wiki/Main_Page; err_msg={0} err_line={1}", e.toString(), err_line); - System.out.println(err_msg); - e.printStackTrace(); - } - } - private static void Write_page(DataOutputStream strm, String page_html, String app_file_dir, String wiki_domain) { - page_html = Convert_page(page_html, app_file_dir, wiki_domain); - Write_to_stream(strm, page_html); - } - private static String Convert_page(String page_html, String app_file_dir, String wiki_domain) { - page_html = page_html.replaceAll(app_file_dir , "%file%/"); - page_html = page_html.replaceAll("xowa-cmd" , "%xowa-cmd%/xowa-cmd"); - page_html = page_html.replaceAll(". +*/ +package gplx.xowa.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; +class Xoh_toc_wtr { + private final Bry_bfr bfr = Bry_bfr_.New(); + public void Clear() { + bfr.Clear(); + } + public void Add(byte[] hdr_text) { // text within hdr; EX:

Abc

-> Abc + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/tocs/Xoh_toc_wtr_tst.java b/400_xowa/src/gplx/xowa/htmls/tocs/Xoh_toc_wtr_tst.java new file mode 100644 index 000000000..d8c33c925 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/tocs/Xoh_toc_wtr_tst.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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; +import org.junit.*; +public class Xoh_toc_wtr_tst { + @Before public void init() {fxt.Clear();} private final Xoh_toc_wtr_fxt fxt = new Xoh_toc_wtr_fxt(); + @Test public void Ws() { + fxt.Test__add(" a b ", "a b"); + } + @Test public void Apos__italic() { + fxt.Test__add("a", "a"); + } + @Test public void Xnde__small() { + fxt.Test__add("a", "a"); + } + @Test public void Xnde__nest__xnde() { // removed but not + fxt.Test__add("a bcd e", "a bcd e"); + } + @Test public void Xnde__nest__lnki() { // and
removed + fxt.Test__add("b", "b"); + } + @Test public void Xnde__nest__inline() { // PURPOSE: do not render inline xndes; EX: Magnetic_resonance_imaging + fxt.Test__add("ab
", "ab"); + } + @Test public void Lnki__caption() { + fxt.Test__add("b", "b"); + } + @Test public void Lnki__caption__nest() { + fxt.Test__add("bcd", "bcd"); + } + @Test public void Amp__ncr() { + fxt.Test__add("[a]", "[a]"); + } + @Test public void Ref() { // PURPOSE: ref contents should not print in TOC; DATE:2013-07-23 + fxt.Test__add("a[1]", "a"); + } + @Test public void Category__literal() { // PURPOSE: literal Category should show in in TOC; EX: de.w:1234; DATE:2014-01-21 + fxt.Test__add("ACategory:B", "ACategory:B"); + } + @Test public void File() { // PURPOSE: file should show in in TOC; EX: tr.w:D�nya_Miraslari; DATE:2014-06-06 + fxt.Test__add + ( "\"\" b" + , " b"); + } + @Test public void Translate_w_comment() { // PURPOSE: is an xtn and parses its innerText separately; meanwhile, toc_mgr defaults to using the innerText to build toc; EX:Wikidata:Introduction; DATE:2013-07-16 + fxt.Test__add("ac", "ac"); + } +} +class Xoh_toc_wtr_fxt { + private final Xoh_toc_wtr wtr = new Xoh_toc_wtr(); + public void Clear() {wtr.Clear();} + public void Test__add(String html, String expd_text) { + } +} diff --git a/400_xowa/src/gplx/xowa/langs/Xol_lang_stub_.java b/400_xowa/src/gplx/xowa/langs/Xol_lang_stub_.java index 71d4be8a3..0943fad0d 100644 --- a/400_xowa/src/gplx/xowa/langs/Xol_lang_stub_.java +++ b/400_xowa/src/gplx/xowa/langs/Xol_lang_stub_.java @@ -223,248 +223,249 @@ public class Xol_lang_stub_ { // lists all known stub_ary supported by MW , Id_ko = 197 , Id_ko_kp = 198 , Id_koi = 199 -, Id_kr = 200 -, Id_krc = 201 -, Id_kri = 202 -, Id_krj = 203 -, Id_krl = 204 -, Id_ks = 205 -, Id_ks_arab = 206 -, Id_ks_deva = 207 -, Id_ksh = 208 -, Id_ku = 209 -, Id_ku_arab = 210 -, Id_ku_latn = 211 -, Id_kv = 212 -, Id_kw = 213 -, Id_ky = 214 -, Id_la = 215 -, Id_lad = 216 -, Id_lb = 217 -, Id_lbe = 218 -, Id_lez = 219 -, Id_lfn = 220 -, Id_lg = 221 -, Id_li = 222 -, Id_lij = 223 -, Id_liv = 224 -, Id_lmo = 225 -, Id_ln = 226 -, Id_lo = 227 -, Id_loz = 228 -, Id_lrc = 229 -, Id_lt = 230 -, Id_ltg = 231 -, Id_lus = 232 -, Id_luz = 233 -, Id_lv = 234 -, Id_lzh = 235 -, Id_lzz = 236 -, Id_mai = 237 -, Id_map_bms = 238 -, Id_mdf = 239 -, Id_mg = 240 -, Id_mh = 241 -, Id_mhr = 242 -, Id_mi = 243 -, Id_mic = 244 -, Id_min = 245 -, Id_mk = 246 -, Id_ml = 247 -, Id_mn = 248 -, Id_mnc = 249 -, Id_mo = 250 -, Id_mr = 251 -, Id_mrj = 252 -, Id_ms = 253 -, Id_mt = 254 -, Id_mui = 255 -, Id_mus = 256 -, Id_mwl = 257 -, Id_mwv = 258 -, Id_my = 259 -, Id_myv = 260 -, Id_mzn = 261 -, Id_na = 262 -, Id_nah = 263 -, Id_nan = 264 -, Id_nap = 265 -, Id_nb = 266 -, Id_nds = 267 -, Id_nds_nl = 268 -, Id_ne = 269 -, Id_new = 270 -, Id_ng = 271 -, Id_niu = 272 -, Id_nl = 273 -, Id_nl_informal = 274 -, Id_nn = 275 -, Id_no = 276 -, Id_nov = 277 -, Id_nrm = 278 -, Id_nso = 279 -, Id_nv = 280 -, Id_ny = 281 -, Id_oc = 282 -, Id_om = 283 -, Id_or = 284 -, Id_os = 285 -, Id_pa = 286 -, Id_pag = 287 -, Id_pam = 288 -, Id_pap = 289 -, Id_pbb = 290 -, Id_pcd = 291 -, Id_pdc = 292 -, Id_pdt = 293 -, Id_pfl = 294 -, Id_pi = 295 -, Id_pih = 296 -, Id_pl = 297 -, Id_pms = 298 -, Id_pnb = 299 -, Id_pnt = 300 -, Id_ppl = 301 -, Id_prg = 302 -, Id_ps = 303 -, Id_pt = 304 -, Id_pt_br = 305 -, Id_qqq = 306 -, Id_qu = 307 -, Id_qug = 308 -, Id_rap = 309 -, Id_rgn = 310 -, Id_rif = 311 -, Id_rm = 312 -, Id_rmf = 313 -, Id_rmy = 314 -, Id_rn = 315 -, Id_ro = 316 -, Id_roa_rup = 317 -, Id_roa_tara = 318 -, Id_ru = 319 -, Id_rue = 320 -, Id_rup = 321 -, Id_ruq = 322 -, Id_ruq_cyrl = 323 -, Id_ruq_latn = 324 -, Id_rw = 325 -, Id_ryu = 326 -, Id_sa = 327 -, Id_sah = 328 -, Id_sat = 329 -, Id_saz = 330 -, Id_sc = 331 -, Id_scn = 332 -, Id_sco = 333 -, Id_sd = 334 -, Id_sdc = 335 -, Id_sdh = 336 -, Id_se = 337 -, Id_sei = 338 -, Id_ses = 339 -, Id_sg = 340 -, Id_sgs = 341 -, Id_sh = 342 -, Id_shi = 343 -, Id_shn = 344 -, Id_si = 345 -, Id_simple = 346 -, Id_sk = 347 -, Id_sl = 348 -, Id_sli = 349 -, Id_sly = 350 -, Id_sm = 351 -, Id_sma = 352 -, Id_sn = 353 -, Id_so = 354 -, Id_sq = 355 -, Id_sr = 356 -, Id_sr_ec = 357 -, Id_sr_el = 358 -, Id_srn = 359 -, Id_ss = 360 -, Id_st = 361 -, Id_stq = 362 -, Id_su = 363 -, Id_sv = 364 -, Id_sw = 365 -, Id_sxu = 366 -, Id_szl = 367 -, Id_ta = 368 -, Id_tcy = 369 -, Id_te = 370 -, Id_test = 371 -, Id_tet = 372 -, Id_tg = 373 -, Id_tg_cyrl = 374 -, Id_tg_latn = 375 -, Id_th = 376 -, Id_ti = 377 -, Id_tk = 378 -, Id_tl = 379 -, Id_tly = 380 -, Id_tn = 381 -, Id_to = 382 -, Id_tokipona = 383 -, Id_tp = 384 -, Id_tpi = 385 -, Id_tr = 386 -, Id_tru = 387 -, Id_ts = 388 -, Id_tt = 389 -, Id_tt_cyrl = 390 -, Id_tt_latn = 391 -, Id_ttt = 392 -, Id_tum = 393 -, Id_tw = 394 -, Id_ty = 395 -, Id_tyv = 396 -, Id_tzm = 397 -, Id_ua = 398 -, Id_udm = 399 -, Id_ug = 400 -, Id_ug_arab = 401 -, Id_ug_latn = 402 -, Id_uk = 403 -, Id_ur = 404 -, Id_uz = 405 -, Id_ve = 406 -, Id_vec = 407 -, Id_vep = 408 -, Id_vi = 409 -, Id_vls = 410 -, Id_vmf = 411 -, Id_vo = 412 -, Id_vot = 413 -, Id_vro = 414 -, Id_wa = 415 -, Id_war = 416 -, Id_wo = 417 -, Id_wuu = 418 -, Id_xal = 419 -, Id_xh = 420 -, Id_xmf = 421 -, Id_yi = 422 -, Id_yo = 423 -, Id_yue = 424 -, Id_za = 425 -, Id_zea = 426 -, Id_zh = 427 -, Id_zh_classical = 428 -, Id_zh_cn = 429 -, Id_zh_hans = 430 -, Id_zh_hant = 431 -, Id_zh_hk = 432 -, Id_zh_min_nan = 433 -, Id_zh_mo = 434 -, Id_zh_my = 435 -, Id_zh_sg = 436 -, Id_zh_tw = 437 -, Id_zh_yue = 438 -, Id_zu = 439 +, Id_kok = 200 +, Id_kr = 201 +, Id_krc = 202 +, Id_kri = 203 +, Id_krj = 204 +, Id_krl = 205 +, Id_ks = 206 +, Id_ks_arab = 207 +, Id_ks_deva = 208 +, Id_ksh = 209 +, Id_ku = 210 +, Id_ku_arab = 211 +, Id_ku_latn = 212 +, Id_kv = 213 +, Id_kw = 214 +, Id_ky = 215 +, Id_la = 216 +, Id_lad = 217 +, Id_lb = 218 +, Id_lbe = 219 +, Id_lez = 220 +, Id_lfn = 221 +, Id_lg = 222 +, Id_li = 223 +, Id_lij = 224 +, Id_liv = 225 +, Id_lmo = 226 +, Id_ln = 227 +, Id_lo = 228 +, Id_loz = 229 +, Id_lrc = 230 +, Id_lt = 231 +, Id_ltg = 232 +, Id_lus = 233 +, Id_luz = 234 +, Id_lv = 235 +, Id_lzh = 236 +, Id_lzz = 237 +, Id_mai = 238 +, Id_map_bms = 239 +, Id_mdf = 240 +, Id_mg = 241 +, Id_mh = 242 +, Id_mhr = 243 +, Id_mi = 244 +, Id_mic = 245 +, Id_min = 246 +, Id_mk = 247 +, Id_ml = 248 +, Id_mn = 249 +, Id_mnc = 250 +, Id_mo = 251 +, Id_mr = 252 +, Id_mrj = 253 +, Id_ms = 254 +, Id_mt = 255 +, Id_mui = 256 +, Id_mus = 257 +, Id_mwl = 258 +, Id_mwv = 259 +, Id_my = 260 +, Id_myv = 261 +, Id_mzn = 262 +, Id_na = 263 +, Id_nah = 264 +, Id_nan = 265 +, Id_nap = 266 +, Id_nb = 267 +, Id_nds = 268 +, Id_nds_nl = 269 +, Id_ne = 270 +, Id_new = 271 +, Id_ng = 272 +, Id_niu = 273 +, Id_nl = 274 +, Id_nl_informal = 275 +, Id_nn = 276 +, Id_no = 277 +, Id_nov = 278 +, Id_nrm = 279 +, Id_nso = 280 +, Id_nv = 281 +, Id_ny = 282 +, Id_oc = 283 +, Id_om = 284 +, Id_or = 285 +, Id_os = 286 +, Id_pa = 287 +, Id_pag = 288 +, Id_pam = 289 +, Id_pap = 290 +, Id_pbb = 291 +, Id_pcd = 292 +, Id_pdc = 293 +, Id_pdt = 294 +, Id_pfl = 295 +, Id_pi = 296 +, Id_pih = 297 +, Id_pl = 298 +, Id_pms = 299 +, Id_pnb = 300 +, Id_pnt = 301 +, Id_ppl = 302 +, Id_prg = 303 +, Id_ps = 304 +, Id_pt = 305 +, Id_pt_br = 306 +, Id_qqq = 307 +, Id_qu = 308 +, Id_qug = 309 +, Id_rap = 310 +, Id_rgn = 311 +, Id_rif = 312 +, Id_rm = 313 +, Id_rmf = 314 +, Id_rmy = 315 +, Id_rn = 316 +, Id_ro = 317 +, Id_roa_rup = 318 +, Id_roa_tara = 319 +, Id_ru = 320 +, Id_rue = 321 +, Id_rup = 322 +, Id_ruq = 323 +, Id_ruq_cyrl = 324 +, Id_ruq_latn = 325 +, Id_rw = 326 +, Id_ryu = 327 +, Id_sa = 328 +, Id_sah = 329 +, Id_sat = 330 +, Id_saz = 331 +, Id_sc = 332 +, Id_scn = 333 +, Id_sco = 334 +, Id_sd = 335 +, Id_sdc = 336 +, Id_sdh = 337 +, Id_se = 338 +, Id_sei = 339 +, Id_ses = 340 +, Id_sg = 341 +, Id_sgs = 342 +, Id_sh = 343 +, Id_shi = 344 +, Id_shn = 345 +, Id_si = 346 +, Id_simple = 347 +, Id_sk = 348 +, Id_sl = 349 +, Id_sli = 350 +, Id_sly = 351 +, Id_sm = 352 +, Id_sma = 353 +, Id_sn = 354 +, Id_so = 355 +, Id_sq = 356 +, Id_sr = 357 +, Id_sr_ec = 358 +, Id_sr_el = 359 +, Id_srn = 360 +, Id_ss = 361 +, Id_st = 362 +, Id_stq = 363 +, Id_su = 364 +, Id_sv = 365 +, Id_sw = 366 +, Id_sxu = 367 +, Id_szl = 368 +, Id_ta = 369 +, Id_tcy = 370 +, Id_te = 371 +, Id_test = 372 +, Id_tet = 373 +, Id_tg = 374 +, Id_tg_cyrl = 375 +, Id_tg_latn = 376 +, Id_th = 377 +, Id_ti = 378 +, Id_tk = 379 +, Id_tl = 380 +, Id_tly = 381 +, Id_tn = 382 +, Id_to = 383 +, Id_tokipona = 384 +, Id_tp = 385 +, Id_tpi = 386 +, Id_tr = 387 +, Id_tru = 388 +, Id_ts = 389 +, Id_tt = 390 +, Id_tt_cyrl = 391 +, Id_tt_latn = 392 +, Id_ttt = 393 +, Id_tum = 394 +, Id_tw = 395 +, Id_ty = 396 +, Id_tyv = 397 +, Id_tzm = 398 +, Id_ua = 399 +, Id_udm = 400 +, Id_ug = 401 +, Id_ug_arab = 402 +, Id_ug_latn = 403 +, Id_uk = 404 +, Id_ur = 405 +, Id_uz = 406 +, Id_ve = 407 +, Id_vec = 408 +, Id_vep = 409 +, Id_vi = 410 +, Id_vls = 411 +, Id_vmf = 412 +, Id_vo = 413 +, Id_vot = 414 +, Id_vro = 415 +, Id_wa = 416 +, Id_war = 417 +, Id_wo = 418 +, Id_wuu = 419 +, Id_xal = 420 +, Id_xh = 421 +, Id_xmf = 422 +, Id_yi = 423 +, Id_yo = 424 +, Id_yue = 425 +, Id_za = 426 +, Id_zea = 427 +, Id_zh = 428 +, Id_zh_classical = 429 +, Id_zh_cn = 430 +, Id_zh_hans = 431 +, Id_zh_hant = 432 +, Id_zh_hk = 433 +, Id_zh_min_nan = 434 +, Id_zh_mo = 435 +, Id_zh_my = 436 +, Id_zh_sg = 437 +, Id_zh_tw = 438 +, Id_zh_yue = 439 +, Id_zu = 440 ; - public static final int Id__max = 440; + public static final int Id__max = 441; public static Hash_adp_bry Regy() { if (stub_hash == null) { // NOTE: any parenthetical String below will have an "unseen" character of "\xE2\x80\xAA" at the begining and "\xE2\x80\xAC" at the end. They are responsible for parentheses-orientation in RTL stub_ary. stub_hash = Hash_adp_bry.ci_a7(); // ASCII:lang_code; NOTE: must be ci; EX: {{#languages:FR}} @@ -668,6 +669,7 @@ Regy_add(stub_hash, Id_kn, "kn", "ಕನ್ನಡ"); Regy_add(stub_hash, Id_ko, "ko", "한국어"); Regy_add(stub_hash, Id_ko_kp, "ko-kp", "한국어 (조선)"); Regy_add(stub_hash, Id_koi, "koi", "Перем Коми"); +Regy_add(stub_hash, Id_kok, "kok", ""); Regy_add(stub_hash, Id_kr, "kr", "Kanuri"); Regy_add(stub_hash, Id_krc, "krc", "Къарачай-Малкъар"); Regy_add(stub_hash, Id_kri, "kri", "Krio"); @@ -814,7 +816,7 @@ Regy_add(stub_hash, Id_sh, "sh", "Srpskohrvatski / Српскохрватски" Regy_add(stub_hash, Id_shi, "shi", "Tašlḥiyt"); Regy_add(stub_hash, Id_shn, "shn", "Shan"); Regy_add(stub_hash, Id_si, "si", "Sinhalese"); -Regy_add(stub_hash, Id_simple, "simple", "Simple"); // NOTE: changed from "Simple English"; DATE:2016-06-11 +Regy_add(stub_hash, Id_simple, "simple", "Simple English"); Regy_add(stub_hash, Id_sk, "sk", "Slovenčina"); Regy_add(stub_hash, Id_sl, "sl", "Slovenščina"); Regy_add(stub_hash, Id_sli, "sli", "Schläsch"); diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_tkn.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_tkn.java index ab553cd35..d61de9f99 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_tkn.java @@ -176,13 +176,29 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk { if (name_ary_len != 0 ) { // name_ary_len != 0 for direct template inclusions; PAGE:en.w:Human evolution and {{:Human evolution/Species chart}}; && ctx.Tmpl_whitelist().Has(name_ary) Xoa_ttl ttl = Xoa_ttl.parse(wiki, Bry_.Add(wiki.Ns_mgr().Ns_template().Name_db_w_colon(), name_ary)); if (ttl == null) { // ttl is not valid; just output orig; REF.MW:Parser.php|braceSubstitution|if ( !$found ) $text = $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args ); - byte[] missing_ttl - = subst_found || template_prefix_found // if "subst:" or "Template:" found, use orig name; DATE:2014-03-31 - ? name_ary_orig - : name_ary - ; - bfr.Add(Xop_curly_bgn_lxr.Hook).Add(missing_ttl).Add(Xop_curly_end_lxr.Hook); - return false; + if (subst_found || template_prefix_found) { // if "subst:" or "Template:" found, use orig name; DATE:2014-03-31 + bfr.Add(Xop_curly_bgn_lxr.Hook).Add(name_ary_orig).Add(Xop_curly_end_lxr.Hook); + return false; + } + else { // output entire tmpl_src WITH args; used to output name only which broke pages; PAGE:en.w:Flag_of_Greenland; DATE:2016-06-21 + bfr.Add(Xop_curly_bgn_lxr.Hook); + bfr.Add(name_ary); + for (int i = 0; i < args_len; ++i) { + Arg_nde_tkn nde = this.Args_get_by_idx(i); + bfr.Add_byte(Byte_ascii.Pipe); + bfr.Add_mid(src, nde.Src_bgn(), nde.Src_end()); + } + bfr.Add(Xop_curly_end_lxr.Hook); + return false; + } + // DELETE:v3.6.4 +// byte[] missing_ttl +// = subst_found || template_prefix_found // if "subst:" or "Template:" found, use orig name; DATE:2014-03-31 +// ? name_ary_orig +// : name_ary +// ; +// bfr.Add(Xop_curly_bgn_lxr.Hook).Add(missing_ttl).Add(Xop_curly_end_lxr.Hook); +// return false; } else { // some templates produce null ttls; EX: "Citation needed{{subst" defn = wiki.Cache_mgr().Defn_cache().Get_by_key(ttl.Page_db()); diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_wkr__missing__tst.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_wkr__missing__tst.java new file mode 100644 index 000000000..d6d8b9989 --- /dev/null +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_wkr__missing__tst.java @@ -0,0 +1,41 @@ +/* +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.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +import org.junit.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.nss.*; +public class Xot_invk_wkr__missing__tst { + @Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt(); + @Test public void Missing() { + fxt.Init_defn_clear(); + fxt.Init_defn_add("test_template", "{{[[Template:{{{1}}}|{{{1}}}]]}}"); + fxt.Init_log_(Xop_ttl_log.Invalid_char).Test_parse_tmpl_str("{{test_template|a}}", "{{[[Template:a|a]]}}"); + fxt.Init_defn_clear(); + } + @Test public void Missing__name_and_args() { // PURPOSE: missing title should return name + args; used to only return name; PAGE:en.w:Flag_of_Greenland; DATE:2016-06-21 + fxt.Init_defn_clear(); + fxt.Init_defn_add("test_template", "{{ {{{1}}} | a | b }}"); + fxt.Init_log_(Xop_ttl_log.Invalid_char).Test_parse_tmpl_str("{{test_template}}", "{{{{{1}}}| a | b }}"); // NOTE: this should include spaces (" {{{1}}} "), but for now, ignore + fxt.Init_defn_clear(); + } + @Test public void Missing_foreign() { + Xow_ns ns = fxt.Wiki().Ns_mgr().Ns_template(); + byte[] old_ns = ns.Name_db(); + ns.Name_bry_(Bry_.new_a7("Template_foreign")); + fxt.Test_parse_tmpl_str("{{Missing}}", "[[:Template_foreign:Missing]]"); + ns.Name_bry_(old_ns); + } +} diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_wkr_basic_tst.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_wkr_basic_tst.java index e89ccc708..563bab3f9 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_wkr_basic_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_invk_wkr_basic_tst.java @@ -201,19 +201,6 @@ public class Xot_invk_wkr_basic_tst { fxt.Init_defn_add("temp_2", "{{{key1}}}"); fxt.Test_parse_tmpl_str("{{temp_1}}", "val1"); } - @Test public void Missing() { - fxt.Init_defn_clear(); - fxt.Init_defn_add("test_template", "{{[[Template:{{{1}}}|{{{1}}}]]}}"); - fxt.Init_log_(Xop_ttl_log.Invalid_char).Test_parse_tmpl_str("{{test_template|a}}", "{{[[Template:a|a]]}}"); - fxt.Init_defn_clear(); - } - @Test public void Missing_foreign() { - Xow_ns ns = fxt.Wiki().Ns_mgr().Ns_template(); - byte[] old_ns = ns.Name_db(); - ns.Name_bry_(Bry_.new_a7("Template_foreign")); - fxt.Test_parse_tmpl_str("{{Missing}}", "[[:Template_foreign:Missing]]"); - ns.Name_bry_(old_ns); - } @Test public void Xnde_xtn_preserved() { // PURPOSE: tmpl was dropping .Xtn ndes; fxt.Init_defn_clear(); fxt.Init_defn_add("test_template", "{{{1}}}"); diff --git a/400_xowa/src/gplx/xowa/wikis/pages/Xowe_page_mgr.java b/400_xowa/src/gplx/xowa/wikis/pages/Xowe_page_mgr.java index f0da4686a..78c93a97b 100644 --- a/400_xowa/src/gplx/xowa/wikis/pages/Xowe_page_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/pages/Xowe_page_mgr.java @@ -32,9 +32,12 @@ public class Xowe_page_mgr { Wait_for_popups(); // load page text - if (hdump_exists) + boolean parse = true; + if (hdump_exists) { wiki.Html__hdump_mgr().Load_mgr().Load_by_edit(page); - else + parse = Bry_.Len_eq_0(page.Hdump_data().Body()); // NOTE: need to check if actually empty for archive.org wikis which included html_db_id without html_dbs; DATE:2016-06-22 + } + if (parse) wiki.Parser_mgr().Parse(page, false); return page; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_redlink_utl.java b/400_xowa/src/gplx/xowa/wikis/pages/lnkis/Xoh_redlink_utl.java similarity index 69% rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_redlink_utl.java rename to 400_xowa/src/gplx/xowa/wikis/pages/lnkis/Xoh_redlink_utl.java index 7ec418b2a..451675d6b 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_redlink_utl.java +++ b/400_xowa/src/gplx/xowa/wikis/pages/lnkis/Xoh_redlink_utl.java @@ -15,8 +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.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.*; +package gplx.xowa.wikis.pages.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.pages.*; public class Xoh_redlink_utl { - public static final byte[] Cls_bry = Bry_.new_a7("class='new'"); - public static final String New_str = "new"; + public static final byte[] Cls_bry = Bry_.new_a7("class='new'"); + public static final String New_str = "new"; } diff --git a/400_xowa/src/gplx/xowa/wikis/pages/lnkis/Xopg_lnki_list.java b/400_xowa/src/gplx/xowa/wikis/pages/lnkis/Xopg_lnki_list.java index 6b34931f5..01c9bcce3 100644 --- a/400_xowa/src/gplx/xowa/wikis/pages/lnkis/Xopg_lnki_list.java +++ b/400_xowa/src/gplx/xowa/wikis/pages/lnkis/Xopg_lnki_list.java @@ -43,7 +43,7 @@ public class Xopg_lnki_list { list.Add(lnki); } public void Clear() { - lnki_idx = gplx.xowa.htmls.core.wkrs.lnkis.htmls.Xoh_lnki_wtr.Lnki_id_min; // NOTE: must start at 0, so that ++lnki_idx is > 0; html_wtr checks for > 0; DATE:2014-10-09 + lnki_idx = gplx.xowa.htmls.core.wkrs.lnkis.htmls.Xoh_lnki_wtr.Lnki_id_min; // NOTE: must start at 0, so that ++lnki_idx is > 0; html_wtr checks for > 0; DATE:2014-10-09; OLD_COMMENT: NOTE: should be 0, but for historical reasons, 1st lnki starts at 2; EX: id='xowa_lnki_2' list.Clear(); } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_language.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_language.java index 7b2f2b3e7..f604bfbd6 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_language.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_language.java @@ -131,7 +131,7 @@ public class Scrib_lib_language implements Scrib_lib { } public boolean FetchLanguageName(Scrib_proc_args args, Scrib_proc_rslt rslt) { byte[] lang_code = args.Pull_bry(0); - // byte[] trans_code = args.Get_bry_or_null(1); // TODO_OLD: FetchLanguageName("en", "fr") -> Anglais; WHEN: needs global database of languages; + // byte[] trans_code = args.Get_bry_or_null(1); // TODO_OLD: FetchLanguageName("en", "fr") -> Anglais; WHEN: needs global database of languages; cldr Xol_lang_stub lang_itm = Xol_lang_stub_.Get_by_key_or_null(lang_code); return rslt.Init_obj(lang_itm == null ? String_.Empty : String_.new_u8(lang_itm.Canonical_name())); }