diff --git a/400_xowa/src/gplx/langs/gfs/Gfs_parser.java b/400_xowa/src/gplx/langs/gfs/Gfs_parser.java
index dc6ee8576..2446e25df 100644
--- a/400_xowa/src/gplx/langs/gfs/Gfs_parser.java
+++ b/400_xowa/src/gplx/langs/gfs/Gfs_parser.java
@@ -77,6 +77,7 @@ class Gfs_parser_ {
trie_add_quote(rv, new byte[] {Byte_ascii.Quote});
trie_add_quote(rv, Bry_.new_a7("<:[\"\n"), Bry_.new_a7("\n\"]:>"));
trie_add_quote(rv, Bry_.new_a7("<:['\n"), Bry_.new_a7("\n']:>"));
+ trie_add_quote(rv, Bry_.new_a7("<:{'"), Bry_.new_a7("'}:>"));
trie_add_comment(rv, new byte[] {Byte_ascii.Slash, Byte_ascii.Slash}, new byte[] {Byte_ascii.Nl});
trie_add_comment(rv, new byte[] {Byte_ascii.Slash, Byte_ascii.Star}, new byte[] {Byte_ascii.Star, Byte_ascii.Slash});
rv.Add(Byte_ascii.Semic, Gfs_lxr_semic.Instance);
diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java
index 53c431948..9821ea78b 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.12.1.2";
+ public static final String Version = "3.12.1.3";
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/apps/cfgs/specials/maints/services/Xocfg_maint_parser.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/maints/services/Xocfg_maint_parser.java
index cd1ae4522..9589330b3 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/maints/services/Xocfg_maint_parser.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/maints/services/Xocfg_maint_parser.java
@@ -20,7 +20,6 @@ import gplx.langs.gfs.*;
class Xocfg_maint_parser {
public Xocfg_maint_nde[] Parse(String raw) {
GfoMsg root = Gfs_msg_bldr.Instance.ParseToMsg(raw);
- root = root.Subs_getAt(0); // NOTE: ignore fake root
int len = root.Subs_count();
Xocfg_maint_nde[] rv = new Xocfg_maint_nde[len];
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/maints/services/Xocfg_maint_parser__tst.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/maints/services/Xocfg_maint_parser__tst.java
index e27d465d1..10bfc44bd 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/maints/services/Xocfg_maint_parser__tst.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/maints/services/Xocfg_maint_parser__tst.java
@@ -20,12 +20,12 @@ import org.junit.*; import gplx.core.tests.*;
public class Xocfg_maint_parser__tst {
private final Xocfg_maint_parser__fxt fxt = new Xocfg_maint_parser__fxt();
@Test public void Parse_grp() {
- fxt.Exec__parse("root {grp {key='key_1'; owner='owner_1'; name='name_1'; help='help_1'}}"
+ fxt.Exec__parse("grp {key='key_1'; owner='owner_1'; name='name_1'; help='help_1'}"
, fxt.Make__grp("key_1", "owner_1", "name_1", "help_1")
);
}
@Test public void Parse_itm() {
- fxt.Exec__parse("root {itm {key='key_1'; owner='owner_1'; name='name_1'; help='help_1'; scope='scope_1'; db_type='db_type_1'; dflt='dflt_1'; gui_type='gui_type_1'; gui_args='gui_args_1'}}"
+ fxt.Exec__parse("itm {key='key_1'; owner='owner_1'; name='name_1'; help='help_1'; scope='scope_1'; db_type='db_type_1'; dflt='dflt_1'; gui_type='gui_type_1'; gui_args='gui_args_1'}"
, fxt.Make__itm("key_1", "owner_1", "name_1", "help_1", "scope_1", "db_type_1", "dflt_1", "gui_type_1", "gui_args_1")
);
}
diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java
index 4450b4746..812e9fd8b 100644
--- a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java
+++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java
@@ -226,7 +226,7 @@ public class Xoh_page_wtr_wkr {
data_raw = Gfs_php_converter.Xto_php(tmp_bfr, Bool_.N, data_raw);
int data_raw_len = data_raw.length;
if (mgr.Html_capable()) {
- data_raw = wiki.Parser_mgr().Hdr__section_editable__mgr().Extract_section(app, page.Url(), page.Ttl(), data_raw);
+ data_raw = wiki.Parser_mgr().Hdr__section_editable__mgr().Slice_section(page.Url(), page.Ttl(), data_raw);
data_raw_len = data_raw.length;
Xoh_html_wtr_escaper.Escape(page.Wikie().Appe().Parser_amp_mgr(), bfr, data_raw, 0, data_raw_len, false, false); // NOTE: must escape; assume that browser will automatically escape (<) (which Mozilla does)
}
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 44b19fc22..5206f35fd 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
@@ -31,6 +31,7 @@ public class Xoh_hdr_html {
// register hdr with TOC
byte[] hdr_text_bry = Bld_hdr_html(hdr_text_bfr, wtr, page, ctx, hctx, src, hdr);
+ hdr_text_bry = wiki.Parser_mgr().Uniq_mgr().Convert(hdr_text_bry); // need for math; DATE:2016-12-09
Xoh_toc_itm toc_itm = hdr_is_valid && hdr_text_bry.length > 0
? page.Html_data().Toc_mgr().Add(hdr_num, hdr_text_bry)
: invalid_toc_itm;
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html_tst.java
index 72f154173..20404e691 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html_tst.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html_tst.java
@@ -18,7 +18,7 @@ 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 org.junit.*; import gplx.xowa.htmls.core.makes.tests.*;
public class Xoh_hdr_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 Basic() {
fxt.Test__html(String_.Concat_lines_nl_skip_last
( "z"
@@ -36,4 +36,14 @@ public class Xoh_hdr_html_tst {
, "b"
));
}
+ @Test public void Uniq() {
+ byte[] uniq = fxt.Parser_fxt().Wiki().Parser_mgr().Uniq_mgr().Add(Bry_.new_a7("bcd"));
+ fxt.Test__html(String_.Concat_lines_nl_skip_last
+ ( "== a" + String_.new_u8(uniq) + "e =="
+ , "text"
+ ), String_.Concat_lines_nl_skip_last
+ ( "
abcde
"
+ , "text"
+ ));
+ }
}
diff --git a/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_itm.java b/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_itm.java
index 7dce7a639..c64ddc61f 100644
--- a/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_itm.java
+++ b/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_itm.java
@@ -17,13 +17,15 @@ along with this program. If not, see .
*/
package gplx.xowa.parsers.hdrs.sections; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.hdrs.*;
class Xop_section_itm {
- public Xop_section_itm(int idx, byte[] key, int src_bgn, int src_end) {
+ public Xop_section_itm(int idx, int num, byte[] key, int src_bgn, int src_end) {
this.idx = idx;
+ this.num = num;
this.key = key;
this.src_bgn = src_bgn;
this.src_end = src_end;
}
public int Idx() {return idx;} private final int idx;
+ public int Num() {return num;} private final int num;
public byte[] Key() {return key;} private final byte[] key;
public int Src_bgn() {return src_bgn;} private final int src_bgn;
public int Src_end() {return src_end;} private final int src_end;
diff --git a/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list.java b/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list.java
index 4cd2b302d..e39200c3f 100644
--- a/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list.java
+++ b/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list.java
@@ -17,19 +17,28 @@ along with this program. If not, see .
*/
package gplx.xowa.parsers.hdrs.sections; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.hdrs.*;
import gplx.xowa.parsers.mws.*; import gplx.xowa.parsers.mws.wkrs.*;
+import gplx.xowa.addons.htmls.tocs.*; import gplx.xowa.htmls.core.htmls.tidy.*;
class Xop_section_list implements Xomw_hdr_cbk {
private final Xomw_hdr_wkr hdr_wkr = new Xomw_hdr_wkr();
private final Ordered_hash hash = Ordered_hash_.New_bry();
+ private final Xoh_toc_mgr toc_mgr = new Xoh_toc_mgr();
private byte[] src;
+ private Xowe_wiki wiki;
- public Xop_section_list Parse(byte[] src) {
+ public Xop_section_list Parse(Xowe_wiki wiki, Xow_tidy_mgr_interface tidy_mgr, byte[] src) {
+ // clear
+ this.wiki = wiki;
this.src = src;
hash.Clear();
+ toc_mgr.Clear();
+ toc_mgr.Init(tidy_mgr, Bry_.Empty, Bry_.Empty);
+
+ // parse
Xomw_parser_ctx pctx = new Xomw_parser_ctx();
hdr_wkr.Parse(pctx, src, 0, src.length, this);
return this;
}
- public byte[] Extract_bry_or_null(byte[] key) {
+ public byte[] Slice_bry_or_null(byte[] key) {
// find section matching key
Xop_section_itm itm = (Xop_section_itm)hash.Get_by(key);
if (itm == null) return null;
@@ -60,23 +69,41 @@ class Xop_section_list implements Xomw_hdr_cbk {
return src_bgn;
}
private int Get_src_end(Xop_section_itm itm) {
- int src_end = src.length;
- if (itm.Idx() != hash.Len() - 1) { // if not last, get next
- Xop_section_itm nxt = (Xop_section_itm)hash.Get_at(itm.Idx() + 1);
+ int src_end = -1; // default to last
+ int hash_len = hash.Len();
+ for (int i = itm.Idx() + 1; i < hash_len; i++) {
+ Xop_section_itm nxt = (Xop_section_itm)hash.Get_at(i);
+ if (nxt.Num() > itm.Num()) continue; // skip headers that are at lower level; EX: == H2 == should skip === H3 ===
src_end = nxt.Src_bgn();
+ break;
}
+ if (src_end == -1) src_end = src.length; // no headers found; default to EOS
src_end = Bry_find_.Find_bwd__skip_ws(src, src_end, itm.Src_bgn());
return src_end;
}
public void On_hdr_seen(Xomw_parser_ctx pctx, Xomw_hdr_wkr wkr) {
+ // get key by taking everything between ==; EX: "== abc ==" -> " abc "
byte[] src = wkr.Src();
int hdr_txt_bgn = wkr.Hdr_lhs_end();
int hdr_txt_end = wkr.Hdr_rhs_bgn();
+
+ // trim ws
hdr_txt_bgn = Bry_find_.Find_fwd_while_ws(src, hdr_txt_bgn, hdr_txt_end);
hdr_txt_end = Bry_find_.Find_bwd__skip_ws(src, hdr_txt_end, hdr_txt_bgn);
+ byte[] key = Bry_.Mid(wkr.Src(), hdr_txt_bgn, hdr_txt_end);
+
+ // handle nested templates; EX: "== {{A}} ==" note that calling Parse_text_to_html is expensive (called per header) but should be as long as its not nested
+ key = wiki.Parser_mgr().Main().Parse_text_to_html(wiki.Parser_mgr().Ctx(), key);
+
+ // handle math; EX: "== =="
+ key = wiki.Parser_mgr().Uniq_mgr().Convert(key);
+
+ // convert key to toc_text to handle (a) XML ("a" -> "a"); (b) dupes ("text" -> "text_2")
+ int num = wkr.Hdr_num();
+ Xoh_toc_itm toc_itm = toc_mgr.Add(num, key);
+ key = toc_itm.Anch();
- byte[] key = Bry_.Mid(wkr.Src(), hdr_txt_bgn, hdr_txt_end);
- Xop_section_itm itm = new Xop_section_itm(hash.Count(), key, wkr.Hdr_bgn(), wkr.Hdr_end());
+ Xop_section_itm itm = new Xop_section_itm(hash.Count(), num, key, wkr.Hdr_bgn(), wkr.Hdr_end());
hash.Add(key, itm);
}
public void On_src_done(Xomw_parser_ctx pctx, Xomw_hdr_wkr wkr) {}
diff --git a/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list__merge__tst.java b/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list__merge__tst.java
index 33cd72be6..314523cad 100644
--- a/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list__merge__tst.java
+++ b/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list__merge__tst.java
@@ -30,7 +30,7 @@ public class Xop_section_list__merge__tst {
, "== Hdr 3 =="
, "Para 3"
);
- fxt.Test__merge_bry_or_null("Hdr 2", String_.Concat_lines_nl_skip_last
+ fxt.Test__merge_bry_or_null("Hdr_2", String_.Concat_lines_nl_skip_last
( "== Hdr 2 =="
, "Para 2a"
), String_.Concat_lines_nl_skip_last
@@ -60,7 +60,7 @@ public class Xop_section_list__merge__tst {
, "== Hdr 3 =="
, "Para 3"
);
- fxt.Test__merge_bry_or_null("Hdr 2", String_.Concat_lines_nl_skip_last
+ fxt.Test__merge_bry_or_null("Hdr_2", String_.Concat_lines_nl_skip_last
( "== Hdr 2 =="
, "Para 2a"
), String_.Concat_lines_nl_skip_last
@@ -87,7 +87,7 @@ public class Xop_section_list__merge__tst {
, "== Hdr 2 =="
, "Para 2"
);
- fxt.Test__merge_bry_or_null("Hdr 1", String_.Concat_lines_nl_skip_last
+ fxt.Test__merge_bry_or_null("Hdr_1", String_.Concat_lines_nl_skip_last
( "== Hdr 1 =="
, "Para 1a"
), String_.Concat_lines_nl_skip_last
@@ -108,7 +108,7 @@ public class Xop_section_list__merge__tst {
, "== Hdr 2 =="
, "Para 2"
);
- fxt.Test__merge_bry_or_null("Hdr 1", String_.Concat_lines_nl_skip_last
+ fxt.Test__merge_bry_or_null("Hdr_1", String_.Concat_lines_nl_skip_last
( "== Hdr 1 =="
, "Para 1a"
), String_.Concat_lines_nl_skip_last
@@ -129,7 +129,7 @@ public class Xop_section_list__merge__tst {
, "== Hdr 2 =="
, "Para 2"
);
- fxt.Test__merge_bry_or_null("Hdr 2", String_.Concat_lines_nl_skip_last
+ fxt.Test__merge_bry_or_null("Hdr_2", String_.Concat_lines_nl_skip_last
( "== Hdr 2 =="
, "Para 2a"
), String_.Concat_lines_nl_skip_last
diff --git a/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list__slice__tst.java b/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list__slice__tst.java
index 8df99953e..a4a1455d0 100644
--- a/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list__slice__tst.java
+++ b/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_list__slice__tst.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.parsers.hdrs.sections; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.hdrs.*;
-import org.junit.*; import gplx.core.tests.*;
+import org.junit.*; import gplx.core.tests.*; import gplx.xowa.htmls.core.htmls.tidy.*;
public class Xop_section_list__slice__tst {
private final Xop_section_list__fxt fxt = new Xop_section_list__fxt();
@Test public void Basic() {
@@ -30,28 +30,95 @@ public class Xop_section_list__slice__tst {
, "== Hdr 3 =="
, "Para 3"
);
- fxt.Test__slice_bry_or_null("Hdr 1"
+ fxt.Test__slice_bry_or_null("Hdr_1"
, "== Hdr 1 =="
, "Para 1"
);
- fxt.Test__slice_bry_or_null("Hdr 2"
+ fxt.Test__slice_bry_or_null("Hdr_2"
, "== Hdr 2 =="
, "Para 2"
);
- fxt.Test__slice_bry_or_null("Hdr 3"
+ fxt.Test__slice_bry_or_null("Hdr_3"
, "== Hdr 3 =="
, "Para 3"
);
}
+ @Test public void Covering() {
+ fxt.Exec__parse
+ ( "== Hdr 1 =="
+ , "Para 1"
+ , ""
+ , "=== Hdr 1a ==="
+ , "Para 1a"
+ , ""
+ , "=== Hdr 1b ==="
+ , "Para 1b"
+ , ""
+ , "== Hdr 2 =="
+ , "Para 2"
+ );
+ fxt.Test__slice_bry_or_null("Hdr_1"
+ , "== Hdr 1 =="
+ , "Para 1"
+ , ""
+ , "=== Hdr 1a ==="
+ , "Para 1a"
+ , ""
+ , "=== Hdr 1b ==="
+ , "Para 1b"
+ );
+ }
+ @Test public void Xml() {
+ fxt.Exec__parse
+ ( "== Hdr 1 =="
+ , "Para 1"
+ , ""
+ , "== Hdr 2 =="
+ , "Para 2"
+ );
+ fxt.Test__slice_bry_or_null("Hdr_1", String_.Concat_lines_nl_skip_last
+ ( "== Hdr 1 =="
+ , "Para 1"
+ ));
+ }
+ @Test public void Math() {
+ fxt.Exec__parse
+ ( "== =="
+ , "Para 1"
+ , ""
+ , "== Hdr 2 =="
+ , "Para 2"
+ );
+ fxt.Test__slice_bry_or_null(".5Cdelta", String_.Concat_lines_nl_skip_last
+ ( "== =="
+ , "Para 1"
+ ));
+ }
+ @Test public void Template() {
+ fxt.Init__template("mock", "''{{{1}}}''");
+ fxt.Exec__parse
+ ( "== {{mock|a}} =="
+ , "Para 1"
+ , ""
+ , "== Hdr 2 =="
+ , "Para 2"
+ );
+ fxt.Test__slice_bry_or_null("a", String_.Concat_lines_nl_skip_last
+ ( "== {{mock|a}} =="
+ , "Para 1"
+ ));
+ }
}
class Xop_section_list__fxt {
private final Xop_section_list list = new Xop_section_list();
+ private final Xop_fxt parser_fxt = new Xop_fxt();
+ public void Init__template(String page, String text) {parser_fxt.Init_defn_add(page, text);}
public void Exec__parse(String... lines) {
- list.Parse(Bry_.new_u8(String_.Concat_lines_nl_skip_last(lines)));
+ list.Parse(parser_fxt.Wiki(), Xow_tidy_mgr_interface_.Noop, Bry_.new_u8(String_.Concat_lines_nl_skip_last(lines)));
}
public void Test__slice_bry_or_null(String key, String... lines) {
String expd = String_.Concat_lines_nl_skip_last(lines);
- byte[] actl = list.Extract_bry_or_null(Bry_.new_u8(key));
+ byte[] actl = list.Slice_bry_or_null(Bry_.new_u8(key));
Gftest.Eq__ary__lines(expd, actl, key);
}
public void Test__merge_bry_or_null(String key, String edit, String expd) {
diff --git a/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_mgr.java b/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_mgr.java
index 3c23f8796..6006e0824 100644
--- a/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_mgr.java
+++ b/400_xowa/src/gplx/xowa/parsers/hdrs/sections/Xop_section_mgr.java
@@ -17,18 +17,22 @@ along with this program. If not, see .
*/
package gplx.xowa.parsers.hdrs.sections; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.hdrs.*;
import gplx.langs.htmls.*;
-import gplx.xowa.parsers.mws.*; import gplx.xowa.parsers.mws.wkrs.*; import gplx.xowa.parsers.hdrs.*;
+import gplx.xowa.parsers.mws.*; import gplx.xowa.parsers.mws.wkrs.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.htmls.core.htmls.tidy.*;
public class Xop_section_mgr implements Gfo_invk {
- public boolean Enabled() {return enabled;} private boolean enabled;
+ private Xoae_app app; private Xowe_wiki wiki;
+ private Xow_tidy_mgr_interface tidy_mgr;
private final Bry_fmt section_editable_fmt = Bry_fmt.Auto_nl_apos
( "[edit]"
);
- private static final byte[] Qarg__section_key = Bry_.new_u8("section_key");
+ public boolean Enabled() {return enabled;} private boolean enabled;
public void Init_by_wiki(Xowe_wiki wiki) {
- enabled = wiki.App().Cfg().Bind_bool(wiki, gplx.xowa.htmls.core.wkrs.hdrs.Xoh_section_editable_.Cfg__section_editing__enabled, this); // SECTION_EDIT
+ this.app = wiki.Appe();
+ this.wiki = wiki;
+ this.enabled = wiki.App().Cfg().Bind_bool(wiki, gplx.xowa.htmls.core.wkrs.hdrs.Xoh_section_editable_.Cfg__section_editing__enabled, this); // SECTION_EDIT
+ this.tidy_mgr = wiki.Html_mgr().Tidy_mgr();
}
- public byte[] Extract_section(Xoae_app app, Xoa_url url, Xoa_ttl ttl, byte[] src) {
+ public byte[] Slice_section(Xoa_url url, Xoa_ttl ttl, byte[] src) {
// return orig if section_editing not enabled
if (!enabled) return src;
@@ -37,8 +41,8 @@ public class Xop_section_mgr implements Gfo_invk {
if (section_key == null) return src;
// parse wikitext into list of headers
- Xop_section_list section_list = new Xop_section_list().Parse(src);
- byte[] rv = section_list.Extract_bry_or_null(section_key);
+ Xop_section_list section_list = new Xop_section_list().Parse(wiki, tidy_mgr, src);
+ byte[] rv = section_list.Slice_bry_or_null(section_key);
if (rv == null) {
app.Gui_mgr().Kit().Ask_ok("", "", String_.Format("Section extraction failed!\nPlease do not edit this page else data will be lost!!\n\nwiki={0}\npage={1}\nsection={2}", url.Wiki_bry(), ttl.Full_db(), section_key));
throw Err_.new_wo_type("section_key not found", "wiki", url.Wiki_bry(), "page", ttl.Full_db(), "section_key", section_key);
@@ -54,23 +58,15 @@ public class Xop_section_mgr implements Gfo_invk {
if (section_key == null) return edit;
// parse orig
- Xop_section_list section_list = new Xop_section_list().Parse(orig);
+ Xop_section_list section_list = new Xop_section_list().Parse(wiki, tidy_mgr, orig);
byte[] rv = section_list.Merge_bry_or_null(section_key, edit);
if (rv == null)
throw Err_.new_wo_type("could not merge section_key", "page", url.To_str(), "section_key", section_key);
return rv;
}
public void Write_html(Bry_bfr bfr, byte[] src, byte[] page_ttl, Xop_hdr_tkn hdr, byte[] name) {
- // make key by (a) taking 1st and nth sub; (b) skipping ws at both ends
- Xop_tkn_itm[] subs = hdr.Subs();
- if (subs.length == 0) return; // GUARD:should not happen, but avoid array-index error
- int key_bgn = subs[0].Src_bgn();
- int key_end = subs[hdr.Subs_len() - 1].Src_end();
- key_bgn = Bry_find_.Find_fwd_while_ws(src, key_bgn, key_end);
- key_end = Bry_find_.Find_bwd__skip_ws(src, key_end, key_bgn);
- byte[] key = Bry_.Mid(src, key_bgn, key_end);
-
- section_editable_fmt.Bld_many(bfr, page_ttl, key, name);
+ name = wiki.Parser_mgr().Uniq_mgr().Convert(name); // need to swap out uniqs for Math; DATE:2016-12-09
+ section_editable_fmt.Bld_many(bfr, page_ttl, name, name);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, gplx.xowa.htmls.core.wkrs.hdrs.Xoh_section_editable_.Cfg__section_editing__enabled)) enabled = m.ReadBool("v");
@@ -80,4 +76,5 @@ public class Xop_section_mgr implements Gfo_invk {
public static final byte[] Bry__meta = Bry_.new_a7("