From 5f1609a86902e15628b91593e0e896ec780ba9ef Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Thu, 12 Jan 2017 15:17:14 -0500 Subject: [PATCH] Mw_parse.Table: Add tests for basic functionality --- 100_core/src/gplx/Bry_.java | 9 +- .../src/gplx/langs/phps/utls/Php_ary_.java | 22 + .../gplx/langs/phps/{ => utls}/Php_str_.java | 2 +- .../langs/phps/{ => utls}/Php_str___tst.java | 2 +- .../parses/mgrs/Xomp_prog_mgr.java | 1 + .../pages/syncs/core/Xosync_update_mgr.java | 2 +- .../parsers/mws/blocks/Xomw_block_wkr.java | 2 +- .../parsers/mws/prepros/Xomw_prepro_wkr.java | 2 +- .../parsers/mws/tables/Xomw_table_wkr.java | 388 +++++++++--------- .../mws/tables/Xomw_table_wkr__tst.java | 37 +- 10 files changed, 268 insertions(+), 199 deletions(-) create mode 100644 400_xowa/src/gplx/langs/phps/utls/Php_ary_.java rename 400_xowa/src/gplx/langs/phps/{ => utls}/Php_str_.java (93%) rename 400_xowa/src/gplx/langs/phps/{ => utls}/Php_str___tst.java (95%) diff --git a/100_core/src/gplx/Bry_.java b/100_core/src/gplx/Bry_.java index 67444bbc7..e9fff3ca4 100644 --- a/100_core/src/gplx/Bry_.java +++ b/100_core/src/gplx/Bry_.java @@ -448,7 +448,14 @@ public class Bry_ { } if (all_ws) return Bry_.Empty; } - return Bry_.Mid(src, txt_bgn, txt_end); + + if ( bgn == 0 && end == src.length // Trim is called on entire bry, not subset + && bgn == txt_bgn && end == txt_end // Trim hasn't trimmed anything + ) { + return src; + } + else + return Bry_.Mid(src, txt_bgn, txt_end); } public static byte[] Trim_end(byte[] v, byte trim, int end) { boolean trimmed = false; diff --git a/400_xowa/src/gplx/langs/phps/utls/Php_ary_.java b/400_xowa/src/gplx/langs/phps/utls/Php_ary_.java new file mode 100644 index 000000000..81c8dd9b1 --- /dev/null +++ b/400_xowa/src/gplx/langs/phps/utls/Php_ary_.java @@ -0,0 +1,22 @@ +/* +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.langs.phps.utls; import gplx.*; import gplx.langs.*; import gplx.langs.phps.*; +public class Php_ary_ { + public static boolean Pop_bool_or_n(List_adp list) {return (boolean)List_adp_.Pop_or(list, false);} + public static byte[] Pop_bry_or_null(List_adp list) {return (byte[])List_adp_.Pop_or(list, null);} +} diff --git a/400_xowa/src/gplx/langs/phps/Php_str_.java b/400_xowa/src/gplx/langs/phps/utls/Php_str_.java similarity index 93% rename from 400_xowa/src/gplx/langs/phps/Php_str_.java rename to 400_xowa/src/gplx/langs/phps/utls/Php_str_.java index 9b0964d38..be95e004f 100644 --- a/400_xowa/src/gplx/langs/phps/Php_str_.java +++ b/400_xowa/src/gplx/langs/phps/utls/Php_str_.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.langs.phps; import gplx.*; import gplx.langs.*; +package gplx.langs.phps.utls; import gplx.*; import gplx.langs.*; import gplx.langs.phps.*; public class Php_str_ { public static byte[] Substr(byte[] src, int bgn, int len) {return Bry_.Mid(src, bgn, bgn + len);} public static int Strspn_fwd__byte(byte[] src, byte find, int bgn, int max, int src_len) { diff --git a/400_xowa/src/gplx/langs/phps/Php_str___tst.java b/400_xowa/src/gplx/langs/phps/utls/Php_str___tst.java similarity index 95% rename from 400_xowa/src/gplx/langs/phps/Php_str___tst.java rename to 400_xowa/src/gplx/langs/phps/utls/Php_str___tst.java index b654e37f0..b1a23c0b0 100644 --- a/400_xowa/src/gplx/langs/phps/Php_str___tst.java +++ b/400_xowa/src/gplx/langs/phps/utls/Php_str___tst.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.langs.phps; import gplx.*; import gplx.langs.*; +package gplx.langs.phps.utls; import gplx.*; import gplx.langs.*; import gplx.langs.phps.*; import org.junit.*; import gplx.core.tests.*; public class Php_str___tst { private final Php_str___fxt fxt = new Php_str___fxt(); diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/mgrs/Xomp_prog_mgr.java b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/mgrs/Xomp_prog_mgr.java index 62656e3fb..3ea41cac9 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/mgrs/Xomp_prog_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/mgrs/Xomp_prog_mgr.java @@ -29,6 +29,7 @@ public class Xomp_prog_mgr { this.perf_interval = perf_interval; this.perf_url = perf_url; this.prog_bgn = this.prog_prv = this.perf_prv = gplx.core.envs.System_.Ticks(); + Io_mgr.Instance.DeleteFil(perf_url); } public void Mark_done(int id) { synchronized (thread_lock) { diff --git a/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/Xosync_update_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/Xosync_update_mgr.java index 5d8130b3b..3ffefc637 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/Xosync_update_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/Xosync_update_mgr.java @@ -24,7 +24,7 @@ import gplx.xowa.htmls.core.dbs.*; import gplx.xowa.addons.wikis.pages.syncs.wmapis.*; import gplx.xowa.addons.wikis.pages.syncs.core.parsers.*; public class Xosync_update_mgr { - private final Xoh_hzip_bfr bfr = new Xoh_hzip_bfr(Io_mgr.Len_mb, Bool_.N, Byte_.Max_value_127); + private final Xoh_hzip_bfr bfr = new Xoh_hzip_bfr(Io_mgr.Len_kb, Bool_.N, Byte_.Max_value_127); private final Gfh_doc_parser hdoc_parser_mgr; private final Xoh_hdoc_ctx hctx = new Xoh_hdoc_ctx(); private final Xosync_hdoc_wtr hdoc_bldr = new Xosync_hdoc_wtr(); diff --git a/400_xowa/src/gplx/xowa/parsers/mws/blocks/Xomw_block_wkr.java b/400_xowa/src/gplx/xowa/parsers/mws/blocks/Xomw_block_wkr.java index 2c18b858d..3665e4ead 100644 --- a/400_xowa/src/gplx/xowa/parsers/mws/blocks/Xomw_block_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/mws/blocks/Xomw_block_wkr.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.mws.blocks; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.mws.*; -import gplx.langs.phps.*; +import gplx.langs.phps.utls.*; public class Xomw_block_wkr implements gplx.core.brys.Bry_split_wkr {// THREAD.UNSAFE: caching for repeated calls private final Bry_bfr bfr = Bry_bfr_.New(); private byte[] last_prefix, last_section; diff --git a/400_xowa/src/gplx/xowa/parsers/mws/prepros/Xomw_prepro_wkr.java b/400_xowa/src/gplx/xowa/parsers/mws/prepros/Xomw_prepro_wkr.java index e9abed2b2..1bb59841a 100644 --- a/400_xowa/src/gplx/xowa/parsers/mws/prepros/Xomw_prepro_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/mws/prepros/Xomw_prepro_wkr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.parsers.mws.prepros; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.mws.*; import gplx.core.btries.*; -import gplx.langs.phps.*; +import gplx.langs.phps.utls.*; public class Xomw_prepro_wkr { // THREAD.UNSAFE: caching for repeated calls private final Bry_bfr tmp_bfr = Bry_bfr_.New(); private final List_adp comments_list = List_adp_.New(); diff --git a/400_xowa/src/gplx/xowa/parsers/mws/tables/Xomw_table_wkr.java b/400_xowa/src/gplx/xowa/parsers/mws/tables/Xomw_table_wkr.java index bff7ea69d..478125dbc 100644 --- a/400_xowa/src/gplx/xowa/parsers/mws/tables/Xomw_table_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/mws/tables/Xomw_table_wkr.java @@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.mws.tables; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.mws.*; -public class Xomw_table_wkr { +import gplx.langs.phps.utls.*; +public class Xomw_table_wkr implements gplx.core.brys.Bry_split_wkr {// THREAD.UNSAFE: caching for repeated calls private final Bry_bfr bfr = Bry_bfr_.New(), tmp_bfr = Bry_bfr_.New(); private final List_adp td_history = List_adp_.New() @@ -25,19 +26,10 @@ public class Xomw_table_wkr { , tr_attributes = List_adp_.New() , has_opened_tr = List_adp_.New() ; - private static final byte[] - Bry__tblw_bgn = Bry_.new_a7("{|"), Bry__tblw_end = Bry_.new_a7("|}"), Bry__tr = Bry_.new_a7("|-"), Bry__th = Bry_.new_a7("|+"), Bry__td2 = Bry_.new_a7("||") - , Bry__lnki = Bry_.new_a7("[[") - , Bry__special_case = Bry_.new_a7("\n\n
") - , Bry__tag__td = Bry_.new_a7("td"), Bry__tag__th = Bry_.new_a7("th"), Bry__tag__caption = Bry_.new_a7("caption") - , Bry__elem_end__tr = Bry_.new_a7("") - , Bry__dl_dd = Bry_.new_a7("
") - ; - private static final int Len__special_case = Bry__special_case.length; + private int indent_level = 0; // indent level of the table + private byte[] first_2 = new byte[2]; public byte[] Do_table_stuff(byte[] src) { - int src_len = src.length; - byte[][] lines = Bry_split_.Split(src, 0, src_len, Byte_ascii.Nl_bry); // PORTED: $lines = StringUtils::explode("\n", $text); - int lines_len = lines.length; + indent_level = 0; // PORTED:member variables // $td_history = []; // Is currently a td tag open? @@ -46,214 +38,230 @@ public class Xomw_table_wkr { // $tr_attributes = []; // history of tr attributes // $has_opened_tr = []; // Did this table open a element? - int indent_level = 0; // indent level of the table - byte[] chars_2 = new byte[2]; - for (int i = 0; i < lines_len; i++) { - byte[] line_orig = lines[i]; - byte[] line = Bry_.Trim(line_orig); + // PORTED.SPLIT: $lines = StringUtils::explode("\n", $text); + Bry_split_.Split(src, 0, src.length, Byte_ascii.Nl, Bool_.N, this); - int line_len = line.length; - if (line_len == 0) { // empty line, go to next line - bfr.Add(line_orig).Add_byte_nl(); - continue; + // Closing open td, tr && table + while (td_history.Len() > 0) { + if (Php_ary_.Pop_bool_or_n(td_history)) { + bfr.Add_str_a7("\n"); + } + if (Php_ary_.Pop_bool_or_n(tr_history)) { + bfr.Add_str_a7("\n"); } + if (!Php_ary_.Pop_bool_or_n(has_opened_tr)) { + bfr.Add_str_a7("\n"); + } + bfr.Add_str_a7("\n"); + } - byte char_0 = line[0]; - chars_2[0] = line[0]; - if (line_len > 1) chars_2[1] = line[1]; + // Remove trailing line-ending (b/c) + if (bfr.Get_at_last_or_nil_if_empty() == Byte_ascii.Nl) { + bfr.Del_by_1(); + } - // PORTED: preg_match('/^(:*)\s*\{\|(.*)$/', $line, $matches) - byte[] colon_atrs = null; - int colons_end = Bry_find_.Find_fwd(src, Byte_ascii.Pipe, 0, line_len); - if (colons_end > 0) { - int atrs_bgn = Bry_find_.Find_fwd_while(line, colons_end, line_len, Byte_ascii.Space); - if (Bry_.Eq(line, atrs_bgn, atrs_bgn + 2, Bry__tblw_bgn)) { - colon_atrs = Bry_.Mid(line, atrs_bgn, line_len); - } - } - // ":*" , "\s*" , "{|" , ".*" - if (colon_atrs != null) { - // First check if we are starting a new table - indent_level = colons_end; + // special case: don't return empty table + if ( bfr.Len() == Len__special_case + && Bry_.Eq(bfr.Bfr(), 0, Len__special_case, Bry__special_case)) { + bfr.Clear(); + return Bry_.Empty; + } + return bfr.To_bry_and_clear(); + } + public int Split(byte[] src, int itm_bgn, int itm_end) { + byte[] out_line = Bry_.Mid(src, itm_bgn, itm_end); // MW: "$outLine" + byte[] line = Bry_.Trim(out_line); // MW: "$line" -// atrs = $this->mStripState->unstripBoth(matches[2]); -// atrs = Sanitizer::fixTagAttributes(attributes, 'table'); + int line_temp_len = line.length; + if (line_temp_len == 0) { // empty line, go to next line + bfr.Add(out_line).Add_byte_nl(); + return Bry_split_.Rv__ok; + } - // PORTED: line_orig = str_repeat('
', $indent_level) . ""; - for (int j = 0; j < indent_level; j++) - tmp_bfr.Add(Bry__dl_dd); - line_orig = tmp_bfr.Add_str_a7("").Add_mid(line, 2, line.length).To_bry_and_clear(); - byte[] last_tag = (byte[])List_adp_.Pop(last_tag_history); + byte first_char = line[0]; + first_2[0] = line[0]; + if (line_temp_len > 1) first_2[1] = line[1]; - if (has_opened_tr.Len() == 0) { - line = tmp_bfr.Add_str_a7("").Add(line).To_bry_and_clear(); - } + // PORTED: preg_match('/^(:*)\s*\{\|(.*)$/', $line, $matches) + byte[] tblw_atrs = null; + boolean tblw_bgn_found = false; + int colons_end = Bry_find_.Find_fwd_while(src, 0, line_temp_len, Byte_ascii.Colon); + int tblw_bgn = Bry_find_.Find_fwd_while(line, colons_end, line_temp_len, Byte_ascii.Space); + int tblw_atrs_bgn = tblw_bgn + 2; + if (Bry_.Eq(line, tblw_bgn, tblw_atrs_bgn, Bry__tblw_bgn)) { + tblw_bgn_found = true; + tblw_atrs = (tblw_atrs_bgn == line_temp_len) ? Bry_.Empty : Bry_.Mid(line, tblw_atrs_bgn, line_temp_len); + } + if (tblw_bgn_found) { + // First check if we are starting a new table + indent_level = colons_end; - if (tr_history.Len() > 0) { - List_adp_.Pop(tr_history); - line = tmp_bfr.Add_str_a7("").Add(line).To_bry_and_clear(); - } +// atrs = $this->mStripState->unstripBoth(matches[2]); +// atrs = Sanitizer::fixTagAttributes(attributes, 'table'); - if (td_history.Len() > 0) { - List_adp_.Pop(td_history); - line = tmp_bfr.Add_str_a7("").Add(line).To_bry_and_clear(); - } - List_adp_.Pop(tr_attributes); - line_orig = tmp_bfr.Add(line).Add(Bry_.Repeat_bry(Bry_.new_a7("
"), indent_level)).To_bry_and_clear(); + // PORTED: out_line = str_repeat('
', $indent_level) . ""; + for (int j = 0; j < indent_level; j++) + tmp_bfr.Add(Bry__dl_dd); + out_line = tmp_bfr.Add_str_a7("").Add_mid(line, 2, line.length).To_bry_and_clear(); + byte[] last_tag = Php_ary_.Pop_bry_or_null(last_tag_history); + + if (!Php_ary_.Pop_bool_or_n(has_opened_tr)) { + line = tmp_bfr.Add_str_a7("").Add(line).To_bry_and_clear(); } - else if (Bry_.Eq(chars_2, Bry__tr)) { - // Now we have a table row - line = Bry_.Mid(line, 2); // PORTED: $line = preg_replace('#^\|-+#', '', $line); - // Whats after the tag is now only attributes - byte[] atrs = Bry_.Empty; -// atrs = $this->mStripState->unstripBoth(line); -// atrs = Sanitizer::fixTagAttributes(attributes, 'tr'); - List_adp_.Pop(tr_attributes); - tr_attributes.Add(atrs); + if (Php_ary_.Pop_bool_or_n(tr_history)) { + line = tmp_bfr.Add_str_a7("").Add(line).To_bry_and_clear(); + } - line = Bry_.Empty; - byte[] last_tag = (byte[])List_adp_.Pop(last_tag_history); - List_adp_.Pop(has_opened_tr); - has_opened_tr.Add(true); + if (Php_ary_.Pop_bool_or_n(td_history)) { + line = tmp_bfr.Add_str_a7("
', $indent_level ); + tmp_bfr.Add(line); + for (int j = 0; j < indent_level; j++) + tmp_bfr.Add(Bry__dl_dd_end); + out_line = tmp_bfr.To_bry_and_clear(); + } + else if (Bry_.Eq(first_2, Bry__tr)) { + // Now we have a table row + line = Bry_.Mid(line, 2); // PORTED: $line = preg_replace('#^\|-+#', '', $line); - if ((boolean)List_adp_.Pop(tr_history)) { - line = Bry__elem_end__tr; - } + // Whats after the tag is now only attributes + byte[] atrs = line; +// atrs = $this->mStripState->unstripBoth(line); +// atrs = Sanitizer::fixTagAttributes(attributes, 'tr'); + Php_ary_.Pop_bry_or_null(tr_attributes); + tr_attributes.Add(atrs); - if ((boolean)List_adp_.Pop(td_history)) { - line = tmp_bfr.Add_str_a7("\n").To_bry_and_clear(); - } - tr_history.Add(true); - tr_attributes.Add(Bry_.Empty); - List_adp_.Pop(has_opened_tr); - has_opened_tr.Add(true); - } + // Split up multiple cells on the same line. + // FIXME : This can result in improper nesting of tags processed + // by earlier parser steps. + byte[][] cells = Bry_split_.Split(line, Bry__td2); - byte[] last_tag = (byte[])List_adp_.Pop(last_tag_history); + out_line = Bry_.Empty; - if ((boolean)List_adp_.Pop(td_history)) { - previous = tmp_bfr.Add_str_a7("\n").Add(previous).To_bry_and_clear(); + byte[] previous = null; + // Loop through each table cell + int cells_len = cells.length; + for (int j = 0; j < cells_len; j++) { + byte[] cell = cells[j]; + previous = Bry_.Empty; + if (first_char != Byte_ascii.Plus) { + byte[] tr_after = Php_ary_.Pop_bry_or_null(tr_attributes); + if (!Php_ary_.Pop_bool_or_n(tr_history)) { + previous = tmp_bfr.Add_str_a7("\n").To_bry_and_clear(); } + tr_history.Add(true); + tr_attributes.Add(Bry_.Empty); + Php_ary_.Pop_bool_or_n(has_opened_tr); + has_opened_tr.Add(true); + } - if (char_0 == Byte_ascii.Pipe) { - last_tag = Bry__tag__td; - } - else if (char_0 == Byte_ascii.Bang) { - last_tag = Bry__tag__th; - } - else if (char_0 == Byte_ascii.Plus) { - last_tag = Bry__tag__caption; - } - else { - last_tag = Bry_.Empty; - } + byte[] last_tag = Php_ary_.Pop_bry_or_null(last_tag_history); + + if (Php_ary_.Pop_bool_or_n(td_history)) { + previous = tmp_bfr.Add_str_a7("\n").Add(previous).To_bry_and_clear(); + } - last_tag_history.Add(last_tag); + if (first_char == Byte_ascii.Pipe) { + last_tag = Bry__tag__td; + } + else if (first_char == Byte_ascii.Bang) { + last_tag = Bry__tag__th; + } + else if (first_char == Byte_ascii.Plus) { + last_tag = Bry__tag__caption; + } + else { + last_tag = Bry_.Empty; + } - // A cell could contain both parameters and data - byte[][] cell_data = Bry_split_.Split_w_max(cell, Byte_ascii.Pipe, 2); + last_tag_history.Add(last_tag); - // Bug 553: Note that a '|' inside an invalid link should not - // be mistaken as delimiting cell parameters - byte[] cell_data_0 = cell_data[0]; - byte[] cell_data_1 = cell_data[1]; - if (Bry_find_.Find_fwd(cell_data_0, Bry__lnki) != Bry_find_.Not_found) { - cell = tmp_bfr.Add(previous).Add_str_a7("<").Add(last_tag).Add_str_a7(">").Add(cell).To_bry_and_clear(); - } - else if (cell_data_1 == null) { - cell = tmp_bfr.Add(previous).Add_str_a7("<").Add(last_tag).Add_str_a7(">").Add(cell_data_0).To_bry_and_clear(); - } - else { -// atrs = $this->mStripState->unstripBoth(cell_data[0]); -// atrs = Sanitizer::fixTagAttributes(attributes, $last_tag); - cell = tmp_bfr.Add(previous).Add_str_a7("<").Add(last_tag).Add_str_a7(">").Add(cell_data_1).To_bry_and_clear(); - } + // A cell could contain both parameters and data + byte[][] cell_data = Bry_split_.Split_w_max(cell, Byte_ascii.Pipe, 2); - line_orig = Bry_.Add(line_orig, cell); - td_history.Add(true); + // Bug 553: Note that a '|' inside an invalid link should not + // be mistaken as delimiting cell parameters + byte[] cell_data_0 = cell_data[0]; + byte[] cell_data_1 = cell_data[1]; + if (Bry_find_.Find_fwd(cell_data_0, Bry__lnki) != Bry_find_.Not_found) { + cell = tmp_bfr.Add(previous).Add_byte(Byte_ascii.Angle_bgn).Add(last_tag).Add_byte(Byte_ascii.Angle_end).Add(cell).To_bry_and_clear(); + } + else if (cell_data_1 == null) { + cell = tmp_bfr.Add(previous).Add_byte(Byte_ascii.Angle_bgn).Add(last_tag).Add_byte(Byte_ascii.Angle_end).Add(cell_data_0).To_bry_and_clear(); + } + else { +// atrs = $this->mStripState->unstripBoth(cell_data_0); +// atrs = Sanitizer::fixTagAttributes(attributes, $last_tag); + cell = tmp_bfr.Add(previous).Add_byte(Byte_ascii.Angle_bgn).Add(last_tag).Add(cell_data_0).Add_byte(Byte_ascii.Angle_end).Add(cell_data_1).To_bry_and_clear(); } - } - bfr.Add(line_orig).Add_byte_nl(); - } - // Closing open td, tr && table - while (td_history.Len() > 0) { - if (tr_history.Len() > 0) { - List_adp_.Del_at_last(tr_history); - bfr.Add_str_a7("\n"); + out_line = Bry_.Add(out_line, cell); + td_history.Add(true); } - if (has_opened_tr.Len() == 0) { - bfr.Add_str_a7("\n"); - } - bfr.Add_str_a7("\n"); - } - - // Remove trailing line-ending (b/c) - if (bfr.Get_at_last_or_nil_if_empty() == Byte_ascii.Nl) { - bfr.Del_by_1(); - } - - // special case: don't return empty table - if ( bfr.Len() == Len__special_case - && Bry_.Eq(bfr.Bfr(), 0, Len__special_case, Bry__special_case)) { - return Bry_.Empty; } - return bfr.To_bry_and_clear(); + bfr.Add(out_line).Add_byte_nl(); + return Bry_split_.Rv__ok; } + private static final byte[] + Bry__tblw_bgn = Bry_.new_a7("{|"), Bry__tblw_end = Bry_.new_a7("|}"), Bry__tr = Bry_.new_a7("|-"), Bry__th = Bry_.new_a7("|+"), Bry__td2 = Bry_.new_a7("||") + , Bry__lnki = Bry_.new_a7("[[") + , Bry__special_case = Bry_.new_a7("\n\n
") + , Bry__tag__td = Bry_.new_a7("td"), Bry__tag__th = Bry_.new_a7("th"), Bry__tag__caption = Bry_.new_a7("caption") + , Bry__elem_end__tr = Bry_.new_a7("") + , Bry__dl_dd = Bry_.new_a7("
") + , Bry__dl_dd_end = Bry_.new_a7("
") + ; + private static final int Len__special_case = Bry__special_case.length; } diff --git a/400_xowa/src/gplx/xowa/parsers/mws/tables/Xomw_table_wkr__tst.java b/400_xowa/src/gplx/xowa/parsers/mws/tables/Xomw_table_wkr__tst.java index 0a969ff1c..71a073c60 100644 --- a/400_xowa/src/gplx/xowa/parsers/mws/tables/Xomw_table_wkr__tst.java +++ b/400_xowa/src/gplx/xowa/parsers/mws/tables/Xomw_table_wkr__tst.java @@ -19,19 +19,50 @@ package gplx.xowa.parsers.mws.tables; import gplx.*; import gplx.xowa.*; import import org.junit.*; public class Xomw_table_wkr__tst { private final Xomw_table_wkr__fxt fxt = new Xomw_table_wkr__fxt(); - @Test public void Table() { + @Test public void Basic() { fxt.Test__parse(String_.Concat_lines_nl_skip_last ( "{|" , "|-" , "|a" , "|}" ), String_.Concat_lines_nl_skip_last - ( "{|" + ( "" + , "" + , "" + , "
a" + , "
" + )); + } + @Test public void Blank() { // COVERS: "empty line, go to next line" + fxt.Test__parse(String_.Concat_lines_nl_skip_last + ( " " + ), String_.Concat_lines_nl_skip_last + ( " " + )); + } + @Test public void Indent() { + fxt.Test__parse(String_.Concat_lines_nl_skip_last + ( "::{|" , "|-" , "|a" , "|}" + ), String_.Concat_lines_nl_skip_last + ( "
" + , "" + , "" + , "
a" + , "
" )); - } + } + @Test public void End__no_rows() { // COVERS: "if (has_opened_tr.Len() == 0) {" + fxt.Test__parse(String_.Concat_lines_nl_skip_last + ( "{|" + , "|}" + ), String_.Concat_lines_nl_skip_last + ( "" + , "
" + )); + } } class Xomw_table_wkr__fxt { private final Xomw_table_wkr wkr = new Xomw_table_wkr();