mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
'v3.8.1.1'
This commit is contained in:
@@ -19,9 +19,6 @@ package gplx.xowa.parsers.xndes; import gplx.*; import gplx.xowa.*; import gplx.
|
||||
import gplx.core.primitives.*; import gplx.core.btries.*;
|
||||
import gplx.xowa.xtns.pfuncs.strings.*;
|
||||
class Xop_xnde_wkr_ {
|
||||
private static final Btrie_slim_mgr xtn_end_tag_trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci.ascii:MW_const.en; listed XML node names are en
|
||||
private static final int Find_xtn_end__tid__bgn = 0, Find_xtn_end__tid__end = 1, Find_xtn_end__tid__xtag = 2;
|
||||
private static final Int_obj_ref Find_xtn_end__key__bgn = Int_obj_ref.New(Find_xtn_end__tid__bgn), Find_xtn_end__key__end = Int_obj_ref.New(Find_xtn_end__tid__end), Find_xtn_end__key__xtag = Int_obj_ref.New(Find_xtn_end__tid__xtag);
|
||||
public static void AutoClose_handle_dangling_nde_in_caption(Xop_root_tkn root, Xop_tkn_itm owner) {
|
||||
int subs_bgn = -1, subs_len = owner.Subs_len();
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
@@ -35,39 +32,38 @@ class Xop_xnde_wkr_ {
|
||||
root.Subs_move(owner, subs_bgn, subs_len); // move everything after "|" back to root
|
||||
}
|
||||
public static int Find_xtn_end(Xop_ctx ctx, byte[] src, int open_end, int src_end, byte[] open_bry, byte[] close_bry) {
|
||||
synchronized (xtn_end_tag_trie) { // LOCK:static-obj; DATE:2016-07-06
|
||||
xtn_end_tag_trie.Clear();
|
||||
xtn_end_tag_trie.Add_obj(Pfunc_tag.Xtag_bgn_lhs, Find_xtn_end__key__xtag);
|
||||
xtn_end_tag_trie.Add_obj(open_bry, Find_xtn_end__key__bgn);
|
||||
xtn_end_tag_trie.Add_obj(close_bry, Find_xtn_end__key__end);
|
||||
int depth = 0;
|
||||
for (int i = open_end; i < src_end; ++i) {
|
||||
Object o = xtn_end_tag_trie.Match_bgn(src, i, src_end);
|
||||
if (o != null) {
|
||||
int tid = ((Int_obj_ref)o).Val();
|
||||
switch (tid) {
|
||||
case Find_xtn_end__tid__bgn: // handle nested refs; PAGE:en.w:UK; DATE:2015-12-26
|
||||
int angle_end_pos = Bry_find_.Find_fwd(src, Byte_ascii.Angle_end, i, src_end); if (angle_end_pos == Bry_find_.Not_found) {Xoa_app_.Usr_dlg().Warn_many("", "", "parser.xtn: could not find angle_end: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;}
|
||||
if (src[angle_end_pos -1] == Byte_ascii.Slash) {}
|
||||
else
|
||||
++depth;
|
||||
break;
|
||||
case Find_xtn_end__tid__end: // xtn_end found; use it
|
||||
if (depth == 0)
|
||||
return i;
|
||||
else
|
||||
--depth;
|
||||
break;
|
||||
case Find_xtn_end__tid__xtag: // xtag found; skip over it; PAGE:it.s:La_Secchia_rapita/Canto_primo DATE:2015-12-03
|
||||
int xtag_end = Find_xtag_end(ctx, src, i, src_end);
|
||||
int angle_end = Bry_find_.Find_fwd(src, Byte_ascii.Angle_end, xtag_end, src_end);
|
||||
i = angle_end;
|
||||
break;
|
||||
}
|
||||
Btrie_slim_mgr xtn_end_tag_trie = ctx.Tmp_mgr().Xnde__xtn_end();
|
||||
xtn_end_tag_trie.Clear();
|
||||
xtn_end_tag_trie.Add_obj(Pfunc_tag.Xtag_bgn_lhs, Find_xtn_end__key__xtag);
|
||||
xtn_end_tag_trie.Add_obj(open_bry, Find_xtn_end__key__bgn);
|
||||
xtn_end_tag_trie.Add_obj(close_bry, Find_xtn_end__key__end);
|
||||
int depth = 0;
|
||||
for (int i = open_end; i < src_end; ++i) {
|
||||
Object o = xtn_end_tag_trie.Match_at(ctx.Tmp_mgr().Xnde__trv(), src, i, src_end);
|
||||
if (o != null) {
|
||||
int tid = ((Int_obj_val)o).Val();
|
||||
switch (tid) {
|
||||
case Find_xtn_end__tid__bgn: // handle nested refs; PAGE:en.w:UK; DATE:2015-12-26
|
||||
int angle_end_pos = Bry_find_.Find_fwd(src, Byte_ascii.Angle_end, i, src_end); if (angle_end_pos == Bry_find_.Not_found) {Xoa_app_.Usr_dlg().Warn_many("", "", "parser.xtn: could not find angle_end: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;}
|
||||
if (src[angle_end_pos -1] == Byte_ascii.Slash) {}
|
||||
else
|
||||
++depth;
|
||||
break;
|
||||
case Find_xtn_end__tid__end: // xtn_end found; use it
|
||||
if (depth == 0)
|
||||
return i;
|
||||
else
|
||||
--depth;
|
||||
break;
|
||||
case Find_xtn_end__tid__xtag: // xtag found; skip over it; PAGE:it.s:La_Secchia_rapita/Canto_primo DATE:2015-12-03
|
||||
int xtag_end = Find_xtag_end(ctx, src, i, src_end);
|
||||
int angle_end = Bry_find_.Find_fwd(src, Byte_ascii.Angle_end, xtag_end, src_end);
|
||||
i = angle_end;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return Bry_find_.Not_found;
|
||||
}
|
||||
return Bry_find_.Not_found;
|
||||
}
|
||||
public static int Find_xtag_end(Xop_ctx ctx, byte[] src, int pos, int src_end) {
|
||||
int xtag_bgn = pos + Pfunc_tag.Xtag_bgn_lhs.length;
|
||||
@@ -80,4 +76,9 @@ class Xop_xnde_wkr_ {
|
||||
rv = Bry_find_.Find_bwd(src, Byte_ascii.Lt, rv - 1); if (rv == Bry_find_.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find <: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;}
|
||||
return rv;
|
||||
}
|
||||
private static final int Find_xtn_end__tid__bgn = 0, Find_xtn_end__tid__end = 1, Find_xtn_end__tid__xtag = 2;
|
||||
private static final Int_obj_val
|
||||
Find_xtn_end__key__bgn = new Int_obj_val(Find_xtn_end__tid__bgn)
|
||||
, Find_xtn_end__key__end = new Int_obj_val(Find_xtn_end__tid__end)
|
||||
, Find_xtn_end__key__xtag = new Int_obj_val(Find_xtn_end__tid__xtag);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user