From 1ebc9d3488b65b4a65627e6751edf9be407eff8e Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Sun, 17 May 2020 11:25:23 -0400 Subject: [PATCH] Luaj: Make anypos captures base-1, not base-0 [#726] --- .../libs/Scrib_lib_ustring__gsub__tst.java | 112 +++++++++++------- .../libs/Scrib_lib_ustring_gsub_mgr.java | 32 ++--- .../patterns/Scrib_pattern_matcher__xowa.java | 73 +++++++----- res/bin/any/java/luaj/luaj_xowa.jar | Bin 389985 -> 390047 bytes 4 files changed, 125 insertions(+), 92 deletions(-) diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring__gsub__tst.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring__gsub__tst.java index 3d4767937..752052dbd 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring__gsub__tst.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring__gsub__tst.java @@ -1,28 +1,46 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012-2017 gnosygnu@gmail.com - -XOWA is licensed under the terms of the General Public License (GPL) Version 3, -or alternatively under the terms of the Apache License Version 2.0. - -You may use XOWA according to either of these licenses as is most appropriate -for your project on a case-by-case basis. - -The terms of each license can be found in the source code repository: - -GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt -Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt -*/ -package gplx.xowa.xtns.scribunto.libs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; -import org.junit.*; import gplx.core.tests.*; -import gplx.langs.regxs.*; import gplx.xowa.xtns.scribunto.engines.mocks.*; +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2020 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ +package gplx.xowa.xtns.scribunto.libs; + +import gplx.Array_; +import gplx.Bool_; +import gplx.Bry_bfr; +import gplx.Bry_bfr_; +import gplx.Err_; +import gplx.Int_; +import gplx.Keyval; +import gplx.Keyval_; +import gplx.Object_; +import gplx.String_; +import gplx.Tfds; +import gplx.core.tests.Gftest; +import gplx.langs.regxs.Regx_adp_; +import gplx.xowa.xtns.scribunto.Scrib_kv_utl_; +import gplx.xowa.xtns.scribunto.Scrib_lib; +import gplx.xowa.xtns.scribunto.engines.mocks.Mock_proc_stub; +import gplx.xowa.xtns.scribunto.engines.mocks.Mock_scrib_fxt; +import org.junit.Before; +import org.junit.Test; public class Scrib_lib_ustring__gsub__tst { - private final Mock_scrib_fxt fxt = new Mock_scrib_fxt(); private Scrib_lib lib; + private final Mock_scrib_fxt fxt = new Mock_scrib_fxt(); private Scrib_lib lib; @Before public void init() { fxt.Clear(); lib = fxt.Core().Lib_ustring().Init(); } - @Test public void Replace__basic() { + @Test public void Replace__basic() { Exec_gsub("abcd", "[a]" , -1, "A" , "Abcd;1"); Exec_gsub("aaaa", "[a]" , 2, "A" , "AAaa;2"); Exec_gsub("a" , "(a)" , 1, "%%%1" , "%a;1"); @@ -31,38 +49,38 @@ public class Scrib_lib_ustring__gsub__tst { // TOMBSTONE: tested with local MW and {{#invoke:Test|test16|a|[^]|b}} -> Lua error: Missing close-bracket for character set beginning at pattern character 1.; DATE:2018-07-02 // Exec_gsub("a" , "[^]" , 1, "b" , "a;0"); // invalid regx should not fail; should return self; DATE:2013-10-20 } - @Test public void Find__int() {// PURPOSE: gsub with integer arg should not fail; DATE:2013-11-06 + @Test public void Find__int() {// PURPOSE: gsub with integer arg should not fail; DATE:2013-11-06 fxt.Test__proc__kvps__flat(lib, Scrib_lib_ustring.Invk_gsub, Scrib_kv_utl_.base1_many_(1, "[1]", "2", 1), "2;1"); // NOTE: text is integer (lua / php are type-less) } - @Test public void Replace__none() {// PURPOSE: gsub with no replace argument should not fail; EX:d:'orse; DATE:2013-10-14 + @Test public void Replace__none() {// PURPOSE: gsub with no replace argument should not fail; EX:d:'orse; DATE:2013-10-14 fxt.Test__proc__objs__flat(lib, Scrib_lib_ustring.Invk_gsub, Object_.Ary("text", "regx") , "text"); // NOTE: repl, limit deliberately omitted } - @Test public void Replace__int() { // PURPOSE: do not fail if integer is passed in for @replace; PAGE:en.d:λύω DATE:2014-09-02 + @Test public void Replace__int() { // PURPOSE: do not fail if integer is passed in for @replace; PAGE:en.d:λύω DATE:2014-09-02 Exec_gsub("abcd", 1 , -1, 1 , "abcd;0"); } - @Test public void Replace__double() { // PURPOSE: do not fail if double is passed in for @replace; PAGE:de.v:Wikivoyage:Wikidata/Test_Modul:Wikidata2 DATE:2016-04-21 + @Test public void Replace__double() { // PURPOSE: do not fail if double is passed in for @replace; PAGE:de.v:Wikivoyage:Wikidata/Test_Modul:Wikidata2 DATE:2016-04-21 Exec_gsub("abcd", 1 , -1, 1.23d , "abcd;0"); } - @Test public void Replace__anypos() { // PURPOSE:LUAJ_PATTERN_REPLACEMENT; DATE:2019-04-16 + @Test public void Replace__anypos() { // PURPOSE:LUAJ_PATTERN_REPLACEMENT; DATE:2019-04-16 Exec_gsub("'''a'''b", "()'''(.-'*)'''", 1, "z", "zb;1"); } - @Test public void Replace__balanced_and_grouping() { // PURPOSE:LUAJ_PATTERN_REPLACEMENT; DATE:2019-04-16 + @Test public void Replace__balanced_and_grouping() { // PURPOSE:LUAJ_PATTERN_REPLACEMENT; DATE:2019-04-16 Exec_gsub("[[b]]", "%[(%b[])%]" , -1, "z" , "z;1"); // NOTE: not "[z]" } - @Test public void Replace__initial() { // PURPOSE:whitespace being replaced during gsub replacement; DATE:2019-04-21 + @Test public void Replace__initial() { // PURPOSE:whitespace being replaced during gsub replacement; DATE:2019-04-21 Exec_gsub("a b c", "^%s*", -1, "x", "xa b c;1"); // fails if xabxc } - @Test public void Replace__digit__superscript() {// PURPOSE: ¹ is not a \d; PAGE:en.w:Vilnius ISSUE#:617; DATE:2019-11-24; + @Test public void Replace__digit__superscript() {// PURPOSE: ¹ is not a \d; PAGE:en.w:Vilnius ISSUE#:617; DATE:2019-11-24; Exec_gsub("1796¹", "([%d]+).*", 1, "%1", "1796;1"); } - @Test public void Replace__table() { + @Test public void Replace__table() { Exec_gsub("abcd", "[ac]" , -1, Scrib_kv_utl_.flat_many_("a", "A", "c", "C") , "AbCd;2"); Exec_gsub("abc" , "[ab]" , -1, Scrib_kv_utl_.flat_many_("a", "A") , "Abc;2"); // PURPOSE: match not in regex should still print itself; in this case [c] is not in tbl regex; DATE:2014-03-31 } - @Test public void Replace__table__match() {// PURPOSE: replace using group, not found term; EX:"b" not "%b%" PAGE:en.w:Bannered_routes_of_U.S._Route_60; DATE:2014-08-15 + @Test public void Replace__table__match() {// PURPOSE: replace using group, not found term; EX:"b" not "%b%" PAGE:en.w:Bannered_routes_of_U.S._Route_60; DATE:2014-08-15 Exec_gsub("a%b%c", "%%(%w+)%%" , -1, Scrib_kv_utl_.flat_many_("b", "B") , "aBc;1"); } - @Test public void Replace__proc__recursive() { // PURPOSE:handle recursive gsub calls; PAGE:en.d:כלב; DATE:2016-01-22 + @Test public void Replace__proc__recursive() { // PURPOSE:handle recursive gsub calls; PAGE:en.d:כלב; DATE:2016-01-22 Bry_bfr bfr = Bry_bfr_.New(); Mock_proc__recursive proc_lvl2 = new Mock_proc__recursive(fxt, lib, bfr, 2, null); Mock_proc__recursive proc_lvl1 = new Mock_proc__recursive(fxt, lib, bfr, 1, proc_lvl2); @@ -71,48 +89,48 @@ public class Scrib_lib_ustring__gsub__tst { Exec_gsub("ab", ".", -1, proc_root.To_scrib_lua_proc(), "ab;2"); // fails if "ab;4" Tfds.Eq_str("0;1;2;0;1;2;", bfr.To_str_and_clear()); // fails if "0;1;1;1" } - @Test public void Replace__proc__number() { // PURPOSE:handle replace-as-number in gproc; PAGE:en.d:seven; DATE:2016-04-27 + @Test public void Replace__proc__number() { // PURPOSE:handle replace-as-number in gproc; PAGE:en.d:seven; DATE:2016-04-27 Mock_proc__number proc = new Mock_proc__number(0); fxt.Init__cbk(proc); Exec_gsub("ab", ".", -1, proc.To_scrib_lua_proc(), "12;2"); // fails if "ab;4" } - @Test public void Replace__proc__empty__once() { // PURPOSE:if a proc returns null, do not replace anything; PAGE:en.d:tracer; DATE:2017-04-22 + @Test public void Replace__proc__empty__once() { // PURPOSE:if a proc returns null, do not replace anything; PAGE:en.d:tracer; DATE:2017-04-22 Mock_proc__empty proc = new Mock_proc__empty(0, "z", "Z"); fxt.Init__cbk(proc); Exec_gsub("ab", ".", -1, proc.To_scrib_lua_proc(), "ab;2"); // fails if ";2" whic means each letter (".") replaced with null } - @Test public void Replace__proc__empty__many() { // PURPOSE:replace all matches, not just first; PAGE:en.d:שלום; DATE:2017-04-24 + @Test public void Replace__proc__empty__many() { // PURPOSE:replace all matches, not just first; PAGE:en.d:שלום; DATE:2017-04-24 Mock_proc__empty proc = new Mock_proc__empty(0, "a", "A"); fxt.Init__cbk(proc); Exec_gsub("aba", ".", -1, proc.To_scrib_lua_proc(), "AbA;3"); // fails if "Aba;3" whic means each that A was only matched once } - @Test public void Regx__int() { // PURPOSE: do not fail if integer is passed in for @regx; PAGE:en.d:λύω DATE:2014-09-02 + @Test public void Regx__int() { // PURPOSE: do not fail if integer is passed in for @regx; PAGE:en.d:λύω DATE:2014-09-02 Exec_gsub("abcd", 1 , -1, "A" , "abcd;0"); } - @Test public void Regx__dash() { // PURPOSE: "-" at end of regx should be literal; EX:[A-]; PAGE:en.d:frei DATE:2016-01-23 + @Test public void Regx__dash() { // PURPOSE: "-" at end of regx should be literal; EX:[A-]; PAGE:en.d:frei DATE:2016-01-23 Exec_gsub("abc", "[a-]", -1, "d", "dbc;1"); } - @Test public void Regx__word_class() { // PURPOSE: handle %w in extended regex; PAGE:en.w:A♯_(musical_note) DATE:2015-06-10 + @Test public void Regx__word_class() { // PURPOSE: handle %w in extended regex; PAGE:en.w:A♯_(musical_note) DATE:2015-06-10 Exec_gsub("(a b)", "[^%w%p%s]", -1, "x", "(a b);0"); // was returning "(x x)" b/c ^%w was incorrectly matching "a" and "b" } - @Test public void Regx__balanced_group() { // PURPOSE: handle balanced group regex; EX:"%b()"; NOTE:test will fail if run in 1.6 environment; DATE:2013-12-20 + @Test public void Regx__balanced_group() { // PURPOSE: handle balanced group regex; EX:"%b()"; NOTE:test will fail if run in 1.6 environment; DATE:2013-12-20 Exec_gsub("(a)", "%b()", 1, "c", "c;1"); } - @Test public void Regx__capture() { + @Test public void Regx__capture() { Exec_gsub("aa" , "(a)%1" , 1, "%0z", "aaz;1"); // capture; handle %0; PAGE:en.w:Wikipedia:Wikipedia_Signpost/Templates/Voter/testcases; DATE:2015-08-02 Exec_gsub("aa" , "(a)%1" , 1, "%1z", "az;1"); // capture; handle %1+; PAGE:en.w:Wikipedia:Wikipedia_Signpost/Templates/Voter/testcases; DATE:2015-08-02 Exec_gsub("a\"b'c\"d" , "([\"'])(.-)%1" , 1, "%1z", "a\"zd;1"); // capture; http://www.lua.org/pil/20.3.html; {{#invoke:test|gsub_string|a"b'c"d|(["'])(.-)%1|%1z}} } - @Test public void Regx__capture_wo_group() { + @Test public void Regx__capture_wo_group() { Exec_gsub("Ab", "%u", 1, "<%0>", "b;1"); Exec_gsub("Ab", "%u", 1, "<%1>", "b;1"); // NOTE: %1 should be same as %0 if no matches; ISSUE#:393; DATE:2019-03-20 Exec_gsub_fail("Ab", "%u", 1, "<%2>", "invalid capture index %2 in replacement String"); } - @Test public void Regx__frontier_pattern() { // PURPOSE: handle frontier pattern; EX:"%f[%a]"; DATE:2015-07-21 + @Test public void Regx__frontier_pattern() { // PURPOSE: handle frontier pattern; EX:"%f[%a]"; DATE:2015-07-21 Exec_gsub("a b c", "%f[%W]", 5, "()", "a() b() c();3"); Exec_gsub("abC DEF gHI JKm NOP", "%f[%a]%u+%f[%A]", Int_.Max_value, "()", "abC () gHI JKm ();2"); // based on http://lua-users.org/wiki/FrontierPattern } - @Test public void Regx__frontier_pattern_utl() {// PURPOSE: standalone test for \0 logic in frontier pattern; note that verified against PHP: echo(preg_match( "/[\w]/us", "\0" )); DATE:2015-07-21 + @Test public void Regx__frontier_pattern_utl() {// PURPOSE: standalone test for \0 logic in frontier pattern; note that verified against PHP: echo(preg_match( "/[\w]/us", "\0" )); DATE:2015-07-21 Tfds.Eq(Bool_.N, Regx_adp_.Match("\0", "a")); // \0 not matched by a Tfds.Eq(Bool_.N, Regx_adp_.Match("\0", "0")); // \0 not matched by numeric 0 Tfds.Eq(Bool_.N, Regx_adp_.Match("\0", "[\\w]")); // \0 not matched by word_char @@ -120,21 +138,23 @@ public class Scrib_lib_ustring__gsub__tst { Tfds.Eq(Bool_.Y, Regx_adp_.Match("\0", "[\\x]")); // \0 matched by any_char Tfds.Eq(Bool_.Y, Regx_adp_.Match("\0", "[\\X]")); // \0 matched by !any_char } - @Test public void Luacbk__basic() { + @Test public void Luacbk__basic() { String text = "ad2f1e3z"; String regx = "([1d])([2e])([3f])"; Mock_proc__verify_args proc = new Mock_proc__verify_args(0, new Object[]{"B", "d", "2", "f"}, new Object[]{"Y", "1", "e", "3"}); fxt.Init__cbk(proc); Exec_gsub(text, regx, -1, proc.To_scrib_lua_proc(), "aBYz;2"); } - @Test public void Luacbk__anypos() { + @Test public void Luacbk__anypos() { String text = "ad2f1e3z"; String regx = "()([1d])([2e])([3f])"; // "()" is anypos, which inserts find_pos to results - Mock_proc__verify_args proc = new Mock_proc__verify_args(0, new Object[]{"B", 1, "d", "2", "f"}, new Object[]{"Y", 4, "1", "e", "3"}); + Mock_proc__verify_args proc = new Mock_proc__verify_args(0 + , new Object[]{"B", 2, "d", "2", "f"} // NOTE: changed from 1 to 2 b/c of base-1 issues;ISSUE#:726; DATE:2020-05-17; + , new Object[]{"Y", 4, "1", "e", "3"}); // NOTE: changed from 4 to 5 b/c of base-1 issues;ISSUE#:726; DATE:2020-05-17; fxt.Init__cbk(proc); Exec_gsub(text, regx, -1, proc.To_scrib_lua_proc(), "aBYz;2"); } - @Test public void Luacbk__balanced() { // PURPOSE:LUAJ_PATTERN_REPLACEMENT; DATE:2019-04-16 + @Test public void Luacbk__balanced() { // PURPOSE:LUAJ_PATTERN_REPLACEMENT; DATE:2019-04-16 String text = "}a{{b}}c{{d}}"; String regx = "%b{}"; // "()" is anypos, which inserts find_pos to results Mock_proc__verify_args proc = new Mock_proc__verify_args(0, new Object[]{"x", "{{b}}"}, new Object[]{"y", "{{d}}"}); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring_gsub_mgr.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring_gsub_mgr.java index 438a3a37b..6606926aa 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring_gsub_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring_gsub_mgr.java @@ -1,18 +1,18 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012-2017 gnosygnu@gmail.com - -XOWA is licensed under the terms of the General Public License (GPL) Version 3, -or alternatively under the terms of the Apache License Version 2.0. - -You may use XOWA according to either of these licenses as is most appropriate -for your project on a case-by-case basis. - -The terms of each license can be found in the source code repository: - -GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt -Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt -*/ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2017 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ package gplx.xowa.xtns.scribunto.libs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; import gplx.langs.regxs.*; import gplx.objects.strings.unicodes.*; @@ -178,7 +178,7 @@ public class Scrib_lib_ustring_gsub_mgr { // THREAD.UNSAFE:LOCAL_VALUES // anypos will create @offset arg; everything else creates a @match arg based on grp Object val = any_pos && i < capt_ary_len && Bool_.Cast(capt_ary[i].Val()) - ? (Object)grp.Bgn() + ? (Object)(grp.Bgn() + List_adp_.Base1) // NOTE: must normalize to base-1 b/c lua callbacks expect base-1 arguments, not base-0; ISSUE#:726; DATE:2020-05-17; : (Object)String_.Mid(src_str, grp.Bgn(), grp.End()); luacbk_args[i] = Keyval_.int_(i + Scrib_core.Base_1, val); } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/patterns/Scrib_pattern_matcher__xowa.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/patterns/Scrib_pattern_matcher__xowa.java index f30199b66..cfc06399c 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/patterns/Scrib_pattern_matcher__xowa.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/patterns/Scrib_pattern_matcher__xowa.java @@ -1,31 +1,37 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012-2017 gnosygnu@gmail.com - -XOWA is licensed under the terms of the General Public License (GPL) Version 3, -or alternatively under the terms of the Apache License Version 2.0. - -You may use XOWA according to either of these licenses as is most appropriate -for your project on a case-by-case basis. - -The terms of each license can be found in the source code repository: - -GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt -Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt -*/ -package gplx.xowa.xtns.scribunto.libs.patterns; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.scribunto.libs.*; -import gplx.objects.strings.unicodes.*; -import gplx.langs.regxs.*; -import gplx.objects.strings.unicodes.*; -import org.luaj.vm2.lib.StringLib; -import org.luaj.vm2.Buffer; -import org.luaj.vm2.LuaValue; +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2020 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ +package gplx.xowa.xtns.scribunto.libs.patterns; + +import gplx.Bry_bfr; +import gplx.Bry_bfr_; +import gplx.String_; +import gplx.langs.regxs.Regx_group; +import gplx.langs.regxs.Regx_match; +import gplx.objects.strings.unicodes.Ustring; +import gplx.objects.strings.unicodes.Ustring_; +import gplx.xowa.xtns.scribunto.libs.Scrib_lib_ustring_gsub_mgr; +import gplx.xowa.xtns.scribunto.libs.Scrib_regx_converter; import org.luaj.vm2.lib.Match_state; -import org.luaj.vm2.lib.Str_find_mgr; import org.luaj.vm2.lib.Str_find_mgr__xowa; -class Scrib_pattern_matcher__xowa extends Scrib_pattern_matcher { public Scrib_pattern_matcher__xowa(byte[] page_url) {} + +class Scrib_pattern_matcher__xowa extends Scrib_pattern_matcher { + public Scrib_pattern_matcher__xowa(byte[] page_url) {} + @Override public Regx_match Match_one(Ustring src_ucs, String pat_str, int bgn_as_codes, boolean replace) { - regx_converter.patternToRegex(pat_str, Scrib_regx_converter.Anchor_pow, true); + regx_converter.patternToRegex(pat_str, Scrib_regx_converter.Anchor_pow, true); Str_find_mgr__xowa mgr = new Str_find_mgr__xowa(src_ucs, Ustring_.New_codepoints(pat_str), bgn_as_codes, false, false); mgr.Process(false); @@ -40,9 +46,10 @@ class Scrib_pattern_matcher__xowa extends Scrib_pattern_matcher { public Scrib Regx_group[] groups = Make_groups(src_ucs, mgr.Captures_ary()); return new Regx_match(found, find_bgn, find_end, groups); - } + } + @Override public String Gsub(Scrib_lib_ustring_gsub_mgr gsub_mgr, Ustring src_ucs, String pat_str, int bgn_as_codes) { - // get src vars + // get src vars String src_str = src_ucs.Src(); int src_len = src_ucs.Len_in_data(); if (src_len == 0) { @@ -103,8 +110,9 @@ class Scrib_pattern_matcher__xowa extends Scrib_pattern_matcher { public Scrib tmp_bfr.Add_str_u8(src_ucs.Substring(src_pos, src_len)); return tmp_bfr.To_str_and_clear(); - } - private Regx_group[] Make_groups(Ustring src_ucs, int[] captures) { + } + + private Regx_group[] Make_groups(Ustring src_ucs, int[] captures) { if (captures == null) { return Regx_group.Ary_empty; } @@ -114,10 +122,15 @@ class Scrib_pattern_matcher__xowa extends Scrib_pattern_matcher { public Scrib for (int i = 0; i < captures_len; i += 2) { int capture_bgn = captures[i]; int capture_end = captures[i + 1]; + // ISSUE#:726; DATE:2020-05-17; + // NOTE: capture values are base-0 and are added by any pattern captures, including: + // * standard captures EX: `a(bc)d` for `abcd` will have 1, 3 + // * empty captures EX: `()bc` for `abcd` will have 1, 2 + // Note that empty captures will be normalized to base-1 in Scrib_lib_ustring_gsub_mgr inside the any_pos code capture_bgn = src_ucs.Map_data_to_char(capture_bgn); capture_end = src_ucs.Map_data_to_char(capture_end); groups[i / 2] = new Regx_group(true, capture_bgn, capture_end, String_.Mid(src_ucs.Src(), capture_bgn, capture_end)); } return groups; } - } +} diff --git a/res/bin/any/java/luaj/luaj_xowa.jar b/res/bin/any/java/luaj/luaj_xowa.jar index 580e4bf4252c7ea3da84e5e1f0249c84b7b7dc3c..ac429a4df51f86dbd49f91c5ee1c182874a59f06 100644 GIT binary patch delta 18618 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 IC*U*vAKPFk$p8QV delta 18336 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 aL3-$p@xMp4NMGEsUGGu7B_1Atli`0l0eh_g