/*
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.mediawiki.includes.parsers.hrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; import gplx.xowa.mediawiki.includes.*; import gplx.xowa.mediawiki.includes.parsers.*;
public class Xomw_hr_wkr {// THREAD.UNSAFE: caching for repeated calls
private Bry_bfr bfr;
public void replaceHrs(XomwParserCtx pctx, XomwParserBfr pbfr) { // REF.MW: text = preg_replace('/(^|\n)-----*/', '\\1<hr />', text);
// XO.PBFR
Bry_bfr src_bfr = pbfr.Src();
byte[] src = src_bfr.Bfr();
int src_bgn = 0;
int src_end = src_bfr.Len();
this.bfr = pbfr.Trg();
boolean dirty = false;
// do separate check for "-----" at start of String;
int cur = 0;
if (Bry_.Eq(src, 0, Len__wtxt__hr__bos, Bry__wtxt__hr__bos)) {
cur = Replace_hr(Bool_.N, src, src_bgn, src_end, 0, Len__wtxt__hr__bos);
dirty = true;
}
// loop
while (true) {
// find next "\n-----"
int find_bgn = Bry_find_.Find_fwd(src, Bry__wtxt__hr__mid, cur, src_end);
// nothing found; exit
if (find_bgn == Bry_find_.Not_found) {
if (dirty) {
bfr.Add_mid(src, cur, src_end);
}
break;
}
// something found
cur = Replace_hr(Bool_.Y, src, cur, src_end, find_bgn, Len__wtxt__hr__mid);
dirty = true;
}
if (dirty)
pbfr.Switch();
}
private int Replace_hr(boolean mid, byte[] src, int cur, int src_end, int find_bgn, int tkn_len) {
// something found; add to bfr
if (mid) {
bfr.Add_mid(src, cur, find_bgn); // add everything before "\n-----"
bfr.Add_byte_nl();
}
bfr.Add(Bry__html__hr);
// set dirty / cur and continue
cur = find_bgn + tkn_len;
cur = Bry_find_.Find_fwd_while(src, cur, src_end, Byte_ascii.Dash); // gobble up trailing "-"; the "*" in "-----*" from the regex above
return cur;
}
private static final byte[]
Bry__wtxt__hr__mid = Bry_.new_a7("\n-----")
, Bry__wtxt__hr__bos = Bry_.new_a7("-----")
, Bry__html__hr = Bry_.new_a7("<hr />")
;
private static final int
Len__wtxt__hr__mid = Bry__wtxt__hr__mid.length
, Len__wtxt__hr__bos = Bry__wtxt__hr__bos.length
;
}