diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java index dce8062d7..fe5e5267f 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java @@ -25,6 +25,7 @@ public class Xoapi_addon implements Gfo_invk { public boolean App__scripting__enabled() {return app__scripting__enabled;} private boolean app__scripting__enabled = false; public String App__update__restart_cmd() {return app__update__restart_cmd;} private String app__update__restart_cmd = ""; public String App__update__update_db_src() {return app__update__update_db_src;} private String app__update__update_db_src = "http://xowa.org"; + public boolean Parser__hdr__section_editable() {return parser__hdr__section_editable;} private boolean parser__hdr__section_editable = false; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk__search)) return search; else if (ctx.Match(k, Invk__bldr)) return bldr; @@ -38,6 +39,8 @@ public class Xoapi_addon implements Gfo_invk { else if (ctx.Match(k, Invk__app__update__restart_cmd_)) app__update__restart_cmd = m.ReadStr("v"); else if (ctx.Match(k, Invk__app__update__update_db_src)) return app__update__update_db_src; else if (ctx.Match(k, Invk__app__update__update_db_src_)) app__update__update_db_src = m.ReadStr("v"); + else if (ctx.Match(k, Invk__parser__hdr__section_editable)) return Yn.To_str(parser__hdr__section_editable); + else if (ctx.Match(k, Invk__parser__hdr__section_editable_)) parser__hdr__section_editable = m.ReadBool("v"); else return Gfo_invk_.Rv_unhandled; return this; } @@ -52,6 +55,8 @@ public class Xoapi_addon implements Gfo_invk { , Invk__app__update__restart_cmd_ = "app__update__restart_cmd_" , Invk__app__update__update_db_src = "app__update__update_db_src" , Invk__app__update__update_db_src_ = "app__update__update_db_src_" + , Invk__parser__hdr__section_editable = "parser__hdr__section_editable" + , Invk__parser__hdr__section_editable_ = "parser__hdr__section_editable_" ; public static boolean app__page_history__log_all; } 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 d03d829e3..a6c1188db 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 @@ -40,7 +40,8 @@ public class Xoh_html_wtr { public Ref_html_wtr Ref_wtr() {return ref_wtr;} private final Ref_html_wtr ref_wtr; public void Init_by_wiki(Xowe_wiki wiki) { - cfg.Toc__show_(Bool_.Y).Lnki__title_(true).Lnki_visited_y_().Lnki__id_(Bool_.Y); // NOTE: set during Init_by_wiki, b/c all tests assume these are false + cfg.Toc__show_(Bool_.Y).Lnki__title_(true).Lnki__visited_y_().Lnki__id_(Bool_.Y); // NOTE: set during Init_by_wiki, b/c all tests assume these are false + cfg.Section_editable_(wiki.Appe().Api_root().Addon().Parser__hdr__section_editable()); ref_wtr.Init_by_wiki(wiki); } public void Init_by_page(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xoae_page page) { diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_cfg.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_cfg.java index 367b6ab3e..c810be361 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_cfg.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr_cfg.java @@ -20,5 +20,6 @@ public class Xoh_html_wtr_cfg { public boolean Toc__show() {return toc__show;} public Xoh_html_wtr_cfg Toc__show_(boolean v) {toc__show = v; return this;} private boolean toc__show; public boolean Lnki__id() {return lnki__id;} public Xoh_html_wtr_cfg Lnki__id_(boolean v) {lnki__id = v; return this;} private boolean lnki__id; public boolean Lnki__title() {return lnki__title;} public Xoh_html_wtr_cfg Lnki__title_(boolean v) {lnki__title = v; return this;} private boolean lnki__title; - public boolean Lnki__visited() {return lnki__visited;} public Xoh_html_wtr_cfg Lnki_visited_y_() {lnki__visited = true; return this;} private boolean lnki__visited; + public boolean Lnki__visited() {return lnki__visited;} public Xoh_html_wtr_cfg Lnki__visited_y_() {lnki__visited = true; return this;} private boolean lnki__visited; + public boolean Section_editable() {return section_editable;} public Xoh_html_wtr_cfg Section_editable_(boolean v) {section_editable = v; return this;} private boolean section_editable; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html.java index 8b33a95d6..5815e4832 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html.java @@ -16,12 +16,16 @@ 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.hdrs; 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.langs.htmls.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.addons.htmls.tocs.*; public class Xoh_hdr_html { private final Bry_bfr hdr_text_bfr = Bry_bfr_.New(); private final Xoh_toc_itm invalid_toc_itm = new Xoh_toc_itm().Set__txt(Bry_.Empty, Bry_.Empty); + private final Bry_fmt section_editable_fmt = Bry_fmt.Auto_nl_apos + ( "[edit]" + ); public void Write_html(Bry_bfr bfr, Xoh_html_wtr wtr, Xowe_wiki wiki, Xoae_page page, Xop_ctx ctx, Xoh_wtr_ctx hctx, Xoh_html_wtr_cfg cfg, Xop_tkn_grp grp, int sub_idx, byte[] src, Xop_hdr_tkn hdr) { // init @@ -48,7 +52,7 @@ public class Xoh_hdr_html { bfr.Add_byte(Byte_ascii.Angle_end); // '>' if (cfg.Toc__show()) { bfr.Add(Bry__span_lhs_bgn); // "" } } @@ -64,6 +68,11 @@ public class Xoh_hdr_html { bfr.Add(Gfh_tag_.Span_rhs); // '' bfr.Add(Bry__hdr_rhs_bgn).Add_int(hdr_num, 1, 1); // '\n' + + // write section editable + if (cfg.Section_editable()) { + section_editable_fmt.Bld_many(bfr, hdr.Section_editable_page(), hdr.Section_editable_idx(), toc_itm.Anch()); + } } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_section_editable_.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_section_editable_.java new file mode 100644 index 000000000..fabe50f16 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_section_editable_.java @@ -0,0 +1,25 @@ +/* +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.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import gplx.xowa.parsers.*; import gplx.xowa.parsers.tmpls.*; import gplx.xowa.parsers.hdrs.*; +public class Xoh_section_editable_ { + public static void Write_imt1(Bry_bfr bfr, Xop_ctx ctx, Xop_tkn_itm tkn) { + Xop_hdr_tkn hdr_tkn = (Xop_hdr_tkn)tkn; + ctx.Wiki().Parser_mgr().Hdr__section_editable__imt_fmt().Bld_many_to_bry(bfr, hdr_tkn.Section_editable_page(), hdr_tkn.Section_editable_idx()); + } +} diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_parser.java b/400_xowa/src/gplx/xowa/parsers/Xop_parser.java index ca54a91d0..487735e56 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xop_parser.java +++ b/400_xowa/src/gplx/xowa/parsers/Xop_parser.java @@ -22,6 +22,7 @@ import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.tmpls.*; public class Xop_parser { // NOTE: parsers are reused; do not keep any read-write state private final Xowe_wiki wiki; private final Btrie_fast_mgr tmpl_trie, wtxt_trie; + private Xot_compile_data tmpl_props = new Xot_compile_data(); // NOTE: probably should not be a member variable, but leave for now; DATE:2016-12-02 Xop_parser(Xowe_wiki wiki, Xop_lxr_mgr tmpl_lxr_mgr, Xop_lxr_mgr wtxt_lxr_mgr) { this.wiki = wiki; this.tmpl_lxr_mgr = tmpl_lxr_mgr; this.tmpl_trie = tmpl_lxr_mgr.Trie(); @@ -82,7 +83,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ boolean only_include_chk = Bry_find_.Find_fwd(src, Xop_xnde_tag_.Bry__onlyinclude, 0, src.length) != Bry_find_.Not_found; if (only_include_chk) tmpl_props.OnlyInclude_exists = true; tmpl.Init_by_new(ns, name, src, root, tmpl_props.OnlyInclude_exists); - } private Xot_compile_data tmpl_props = new Xot_compile_data(); + } public void Parse_page_all_clear(Xop_root_tkn root, Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, byte[] src) { ctx.Page().Clear_all(); ctx.App().Msg_log().Clear(); Parse_text_to_wdom(root, ctx, tkn_mkr, src, Xop_parser_.Doc_bgn_bos); diff --git a/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java b/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java index 8560c38ad..541e37330 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java @@ -42,6 +42,7 @@ public class Xow_parser_mgr { public boolean Lst__recursing() {return lst_recursing;} private boolean lst_recursing; public void Lst__recursing_(boolean v) {lst_recursing = v;} public Bry_bfr Wbase__time__bfr() {return wbase__time__bfr;} private final Bry_bfr wbase__time__bfr = Bry_bfr_.New(); public Bry_fmtr Wbase__time__fmtr() {return wbase__time__fmtr;} private final Bry_fmtr wbase__time__fmtr = Bry_fmtr.new_(); + public Bry_fmt Hdr__section_editable__imt_fmt() {return hdr__section_editable__imt_fmt;} private final Bry_fmt hdr__section_editable__imt_fmt = Bry_fmt.New(""); public Wdata_hwtr_msgs Wbase__time__msgs() { if (wbase__time__msgs == null) wbase__time__msgs = Wdata_hwtr_msgs.new_(wiki.Msg_mgr()); diff --git a/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_tkn.java b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_tkn.java index 18fe134dc..bbc99e44a 100644 --- a/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_tkn.java @@ -18,17 +18,24 @@ along with this program. If not, see . package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_hdr_tkn extends Xop_tkn_itm_base { public Xop_hdr_tkn(int bgn, int end, int num) {this.Tkn_ini_pos(false, bgn, end); this.num = num;} - @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_hdr;} - public int Num() {return num;} private int num = -1; // EX: 4 for

- public int Manual_bgn() {return manual_bgn;} private int manual_bgn; // unbalanced count; EX: === A == -> 1 - public int Manual_end() {return manual_end;} private int manual_end; // unbalanced count; EX: == A === -> 1 - public boolean First_in_doc() {return first_in_doc;} private boolean first_in_doc; // true if 1st hdr in doc - public void First_in_doc_y_() {first_in_doc = true;} + @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_hdr;} + public int Num() {return num;} private int num = -1; // EX: 2 for

+ public int Manual_bgn() {return manual_bgn;} private int manual_bgn; // unbalanced count; EX: === A == -> 1 + public int Manual_end() {return manual_end;} private int manual_end; // unbalanced count; EX: == A === -> 1 + public boolean First_in_doc() {return first_in_doc;} private boolean first_in_doc; // true if 1st hdr in doc + public void First_in_doc_y_() {first_in_doc = true;} + public int Section_editable_idx() {return section_editable_idx;} private int section_editable_idx; // EX: 1 as in "section=1" + public byte[] Section_editable_page() {return section_editable_page;} private byte[] section_editable_page; // EX: Earth as in 'href="/wiki/Earth"' + public void Init_by_parse(int num, int manual_bgn, int manual_end) { this.num = num; this.manual_bgn = manual_bgn; this.manual_end = manual_end; } + public void Init_by_section_editable(int section_editable_idx, byte[] section_editable_page) { + this.section_editable_idx = section_editable_idx; + this.section_editable_page = section_editable_page; + } public static final Xop_hdr_tkn[] Ary_empty = new Xop_hdr_tkn[0]; } diff --git a/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java index 6c504146a..1bac8ceb2 100644 --- a/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java @@ -48,8 +48,12 @@ public class Xop_hdr_wkr implements Xop_ctx_wkr { } public int Make_tkn_end(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, int stackPos, int end_hdr_len) {// REF.MW: Parser|doHeadings if (ctx.Cur_tkn_tid() == Xop_tkn_itm_.Tid_tmpl_curly_bgn) return ctx.Lxr_make_txt_(cur_pos); + + // end frame Xop_hdr_tkn hdr = (Xop_hdr_tkn)ctx.Stack_pop_til(root, src, stackPos, false, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_hdr); ctx.Apos().End_frame(ctx, root, src, bgn_pos, false); // end any apos; EX: ==''a== + + // handle asymmetrical "="; EX: "== A ===" int hdr_len = hdr.Num(), bgn_manual = 0, end_manual = 0; boolean dirty = false; if (end_hdr_len < hdr_len) { // mismatch: end has more; adjust hdr @@ -71,8 +75,12 @@ public class Xop_hdr_wkr implements Xop_ctx_wkr { } if (dirty) hdr.Init_by_parse(hdr_len, bgn_manual, end_manual); - cur_pos = Find_fwd_while_ws_hdr_version(src, cur_pos, src_len); // NOTE: hdr gobbles up trailing ws; EX: "==a== \n\t \n \nb" gobbles up all 3 "\n"s; otherwise para_wkr will process
+ + // gobble ws; hdr gobbles up trailing ws; EX: "==a== \n\t \n \nb" gobbles up all 3 "\n"s; otherwise para_wkr will process
+ cur_pos = Find_fwd_while_ws_hdr_version(src, cur_pos, src_len); ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__h2); + + // add to root tkn; other post-processing hdr.Subs_move(root); hdr.Src_end_(cur_pos); if (ctx.Parse_tid() == Xop_parser_tid_.Tid__wtxt) { // do not add if defn / tmpl mode diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__basic_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__basic_tst.java index 3ea5909f6..9107f840d 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__basic_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__basic_tst.java @@ -310,7 +310,7 @@ public class Xop_lnki_wkr__basic_tst { Xoae_page previous_page = Xoae_page.New_test(wiki, ttl); previous_page.Redirect_trail().Itms__add__article(previous_page.Url(), ttl, null); // simulate redirect from "Src" fxt.App().Usere().History_mgr().Add(previous_page); // simulate "Src" already being clicked once; this is the key call - fxt.Wtr_cfg().Lnki_visited_y_(); + fxt.Wtr_cfg().Lnki__visited_y_(); fxt.Test_parse_page_all_str("[[Src]]" , "Src"); // show [[Src]] as visited since it exists in history fxt.Test_parse_page_all_str("[[Other]]" , "Other"); // show other pages as not visited } diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_tmpl_log.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_tmpl_log.java index 7ddcdca77..b2ed2830d 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_tmpl_log.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_tmpl_log.java @@ -18,13 +18,13 @@ along with this program. If not, see . package gplx.xowa.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.core.log_msgs.*; public class Xop_tmpl_log { - private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "tmpl"); - public static final Gfo_msg_itm - Escaped_tmpl = Gfo_msg_itm_.new_warn_(owner, "Escaped_tmpl") - , Escaped_end = Gfo_msg_itm_.new_warn_(owner, "Escaped_end") - , Key_is_empty = Gfo_msg_itm_.new_note_(owner, "Key_is_empty") - , Dangling = Gfo_msg_itm_.new_note_(owner, "Dangling_tmpl") - , Tmpl_end_autoCloses_something = Gfo_msg_itm_.new_note_(owner, "Tmpl_end_autoCloses_something") - , Tmpl_is_empty = Gfo_msg_itm_.new_note_(owner, "Tmpl_is_empty") - ; + private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "tmpl"); + public static final Gfo_msg_itm + Escaped_tmpl = Gfo_msg_itm_.new_warn_(owner, "Escaped_tmpl") + , Escaped_end = Gfo_msg_itm_.new_warn_(owner, "Escaped_end") + , Key_is_empty = Gfo_msg_itm_.new_note_(owner, "Key_is_empty") + , Dangling = Gfo_msg_itm_.new_note_(owner, "Dangling_tmpl") + , Tmpl_end_autoCloses_something = Gfo_msg_itm_.new_note_(owner, "Tmpl_end_autoCloses_something") + , Tmpl_is_empty = Gfo_msg_itm_.new_note_(owner, "Tmpl_is_empty") + ; } diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_compile_data.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_compile_data.java index 64be44196..c796828a6 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_compile_data.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_compile_data.java @@ -18,6 +18,8 @@ along with this program. If not, see . package gplx.xowa.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xot_compile_data { public boolean OnlyInclude_exists; - public boolean Arg_nde_has_key() {return arg_nde_has_key;} public Xot_compile_data Arg_nde_has_key_(boolean v) {arg_nde_has_key = v; return this;} private boolean arg_nde_has_key; + public boolean Arg_nde_has_key() {return arg_nde_has_key;} private boolean arg_nde_has_key; + public Xot_compile_data Arg_nde_has_key_(boolean v) {arg_nde_has_key = v; return this;} + public static final Xot_compile_data Noop = new Xot_compile_data(); } diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_defn_tmpl.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_defn_tmpl.java index a3aad20c8..d7fa72e13 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_defn_tmpl.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_defn_tmpl.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.core.brys.*; import gplx.xowa.wikis.nss.*; public class Xot_defn_tmpl implements Xot_defn { + private boolean onlyinclude_parsed = false; public byte Defn_tid() {return Xot_defn_.Tid_tmpl;} public boolean Defn_require_colon_arg() {return false;} public int Cache_size() {return data_raw.length;} @@ -60,7 +61,7 @@ public class Xot_defn_tmpl implements Xot_defn { if (root != null) root.Clear(); root = null; } - public void Parse_tmpl(Xop_ctx ctx) {ctx.Wiki().Parser_mgr().Main().Parse_text_to_defn(this, ctx, ctx.Tkn_mkr(), ns, name, data_raw);} boolean onlyinclude_parsed = false; + public void Parse_tmpl(Xop_ctx ctx) {ctx.Wiki().Parser_mgr().Main().Parse_text_to_defn(this, ctx, ctx.Tkn_mkr(), ns, name, data_raw);} public boolean Tmpl_evaluate(Xop_ctx ctx, Xot_invk caller, Bry_bfr bfr) { if (root == null) Parse_tmpl(ctx); Xoae_page page = ctx.Page(); diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java index 7190ecd14..2efbaaebf 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_tmpl_wtr.java @@ -20,21 +20,19 @@ import gplx.core.envs.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.miscs.*; public class Xot_tmpl_wtr { public byte[] Write_all(Xop_ctx ctx, Xop_root_tkn root, byte[] src) { -// synchronized (this) { // THREAD:added synchronized after "failed to write tkn" DATE:2015-04-29 - Bry_bfr rslt_bfr = ctx.Wiki().Utl__bfr_mkr().Get_m001(); - rslt_bfr.Reset_if_gt(Io_mgr.Len_mb); - Write_tkn(ctx, src, src.length, rslt_bfr, root); - return rslt_bfr.To_bry_and_rls(); -// } + Bry_bfr rslt_bfr = ctx.Wiki().Utl__bfr_mkr().Get_m001(); + rslt_bfr.Reset_if_gt(Io_mgr.Len_mb); + Write_tkn(rslt_bfr, ctx, src, src.length, root); + return rslt_bfr.To_bry_and_rls(); } - private void Write_tkn(Xop_ctx ctx, byte[] src, int src_len, Bry_bfr rslt_bfr, Xop_tkn_itm tkn) { + private void Write_tkn(Bry_bfr rslt_bfr, Xop_ctx ctx, byte[] src, int src_len, Xop_tkn_itm tkn) { switch (tkn.Tkn_tid()) { case Xop_tkn_itm_.Tid_root: // write each sub int subs_len = tkn.Subs_len(); for (int i = 0; i < subs_len; i++) { Xop_tkn_itm sub_tkn = tkn.Subs_get(i); if (!sub_tkn.Ignore()) - Write_tkn(ctx, src, src_len, rslt_bfr, sub_tkn); + Write_tkn(rslt_bfr, ctx, src, src_len, sub_tkn); } break; case Xop_tkn_itm_.Tid_bry: