/*
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.parsers.tblws; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
public class Xop_tblw_lxr_ws {
public static int Make(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, byte wlxr_type, boolean called_from_pre) {
int rv = Xop_tblw_lxr.Handle_bang(wlxr_type, ctx, ctx.Tkn_mkr(), root, src, src_len, bgn_pos, cur_pos);
if (rv != Xop_tblw_lxr.Continue) return rv;
rv = Xop_tblw_lxr.Handle_lnki(wlxr_type, ctx, ctx.Tkn_mkr(), root, src, src_len, bgn_pos, cur_pos);
if (rv != Xop_tblw_lxr.Continue) return rv;
if (!called_from_pre) { // skip if called from pre, else will return text, since pre_lxr has not created \n tkn yet; EX: "\n ! a"; DATE:2014-02-14
// find first non-ws tkn; check if nl or para
int root_subs_len = root.Subs_len();
int tkn_idx = root_subs_len - 1;
boolean loop = true, nl_found = false;
while (loop) {
if (tkn_idx < 0) break;
Xop_tkn_itm tkn = root.Subs_get(tkn_idx);
switch (tkn.Tkn_tid()) {
case Xop_tkn_itm_.Tid_space: case Xop_tkn_itm_.Tid_tab: // ws: keep moving backwards
tkn_idx--;
break;
case Xop_tkn_itm_.Tid_newLine:
case Xop_tkn_itm_.Tid_para:
loop = false;
nl_found = true;
break;
default:
loop = false;
break;
}
}
if (tkn_idx == -1) { // bos reached; all tkns are ws;
if (wlxr_type == Xop_tblw_wkr.Tblw_type_tb) { // wlxr_type is {|;
root.Subs_del_after(0); // trim
return ctx.Tblw().Make_tkn_bgn(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, false, wlxr_type, Xop_tblw_wkr.Called_from_general, -1, -1); // process {|
}
else // wlxr_type is something else, but invalid since no containing {|
return ctx.Lxr_make_txt_(cur_pos);
}
if (!nl_found && wlxr_type == Xop_tblw_wkr.Tblw_type_td) // | but no nl; return control to pipe_lxr for further processing
return Tblw_ws_cell_pipe;
if (nl_found)
root.Subs_del_after(tkn_idx);
}
return ctx.Tblw().Make_tkn_bgn(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, false, wlxr_type, Xop_tblw_wkr.Called_from_general, -1, -1);
}
public static final byte[] Hook_tb = Bry_.new_a7("{|"), Hook_te = Bry_.new_a7("|}"), Hook_tr = Bry_.new_a7("|-")
, Hook_th = Bry_.new_a7("!"), Hook_tc = Bry_.new_a7("|+");
public static final int Tblw_ws_cell_pipe = -1;
}