1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00

'v3.7.3.1'

This commit is contained in:
gnosygnu
2016-07-17 21:10:59 -04:00
parent b333db45f8
commit 7a851a41a5
290 changed files with 3048 additions and 2124 deletions

View File

@@ -18,28 +18,28 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers; import gplx.*; import gplx.xowa.*;
import gplx.core.btries.*; import gplx.core.log_msgs.*;
import gplx.xowa.langs.*;
import gplx.xowa.guis.*; import gplx.xowa.xtns.lst.*;
import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.wdatas.*;
import gplx.xowa.guis.*;
import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.xtns.lst.*;
import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.lists.*; import gplx.xowa.parsers.tblws.*; import gplx.xowa.parsers.paras.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*;
import gplx.xowa.parsers.logs.*; import gplx.xowa.htmls.modules.popups.keeplists.*;
public class Xop_ctx {
private Xop_ctx_wkr[] wkrs = new Xop_ctx_wkr[] {};
Xop_ctx(Xowe_wiki wiki, Xow_parser_mgr parser_mgr, Xoae_page page) {
private final Xop_ctx_wkr[] wkrs;
Xop_ctx(Xowe_wiki wiki, Xoae_page page) {
this.wiki = wiki; this.cur_page = page;
this.app = wiki.Appe(); this.msg_log = app.Msg_log(); this.tkn_mkr = app.Parser_mgr().Tkn_mkr();
this.wiki = wiki; this.cur_page = page; this.lang = wiki.Lang();
this.parser_mgr = parser_mgr;
this.lang = wiki.Lang();
this.wkrs = new Xop_ctx_wkr[] {para, apos, xnde, list, lnki, hdr, amp, lnke, tblw, invk};
for (Xop_ctx_wkr wkr : wkrs) wkr.Ctor_ctx(this);
for (Xop_ctx_wkr wkr : wkrs)
wkr.Ctor_ctx(this);
this.xnde_tag_regy = wiki.Mw_parser_mgr().Xnde_tag_regy();
}
// public boolean Scribunto; // CHART
public Xoae_app App() {return app;} private final Xoae_app app;
public Xowe_wiki Wiki() {return wiki;} private final Xowe_wiki wiki;
public Xol_lang_itm Lang() {return lang;} private final Xol_lang_itm lang;
public Xop_tkn_mkr Tkn_mkr() {return tkn_mkr;} private final Xop_tkn_mkr tkn_mkr;
public Xoae_page Page() {return cur_page;} public void Page_(Xoae_page v) {cur_page = v;} private Xoae_page cur_page;
public byte Parse_tid() {return parse_tid;} public Xop_ctx Parse_tid_(byte v) {parse_tid = v; xnde_names_tid = v; return this;} private byte parse_tid = Xop_parser_.Parse_tid_null;
public byte Xnde_names_tid() {return xnde_names_tid;} public Xop_ctx Xnde_names_tid_(byte v) {xnde_names_tid = v; return this;} private byte xnde_names_tid = Xop_parser_.Parse_tid_null;
public Xol_lang_itm Lang() {return lang;} private final Xol_lang_itm lang;
public Xoae_app App() {return app;} private final Xoae_app app;
public Xop_tkn_mkr Tkn_mkr() {return tkn_mkr;} private final Xop_tkn_mkr tkn_mkr;
public Gfo_msg_log Msg_log() {return msg_log;} private final Gfo_msg_log msg_log;
public Xop_amp_wkr Amp() {return amp;} private final Xop_amp_wkr amp = new Xop_amp_wkr();
public Xop_apos_wkr Apos() {return apos;} private final Xop_apos_wkr apos = new Xop_apos_wkr();
public Xop_lnke_wkr Lnke() {return lnke;} private final Xop_lnke_wkr lnke = new Xop_lnke_wkr();
@@ -52,28 +52,33 @@ public class Xop_ctx {
public Xot_invk_wkr Invk() {return invk;} private final Xot_invk_wkr invk = new Xot_invk_wkr();
public Xop_curly_wkr Curly() {return curly;} private final Xop_curly_wkr curly = new Xop_curly_wkr();
public Xop_xnde_tag_regy Xnde_tag_regy() {return xnde_tag_regy;} private final Xop_xnde_tag_regy xnde_tag_regy; // PERF:demeter
public Xow_parser_mgr Parser_mgr() {return parser_mgr;} private Xow_parser_mgr parser_mgr;
public boolean Tmpl_load_enabled() {return tmpl_load_enabled;} public void Tmpl_load_enabled_(boolean v) {tmpl_load_enabled = v;} private boolean tmpl_load_enabled = true;
public byte Xnde_names_tid() {return xnde_names_tid;} public Xop_ctx Xnde_names_tid_(byte v) {xnde_names_tid = v; return this;} private byte xnde_names_tid = Xop_parser_tid_.Tid__null;
public byte Parse_tid() {return parse_tid;} public Xop_ctx Parse_tid_(byte v) {parse_tid = v; xnde_names_tid = v; return this;} private byte parse_tid = Xop_parser_tid_.Tid__null;
public boolean Tid_is_popup() {return tid_is_popup;} public void Tid_is_popup_(boolean v) {tid_is_popup = v;} private boolean tid_is_popup = false;
public boolean Tid_is_image_map() {return tid_is_image_map;} public Xop_ctx Tid_is_image_map_(boolean v) {tid_is_image_map = v; return this;} private boolean tid_is_image_map;
public boolean Tmpl_load_enabled() {return tmpl_load_enabled;} public void Tmpl_load_enabled_(boolean v) {tmpl_load_enabled = v;} private boolean tmpl_load_enabled = true;
public int Tmpl_tkn_max() {return tmpl_tkn_max;} public void Tmpl_tkn_max_(int v) {tmpl_tkn_max = v;} private int tmpl_tkn_max = Int_.Max_value;
public Xop_keeplist_wiki Tmpl_keeplist() {return tmpl_keeplist;} public void Tmpl_keeplist_(Xop_keeplist_wiki v) {this.tmpl_keeplist = v;} private Xop_keeplist_wiki tmpl_keeplist;
public boolean Tmpl_args_parsing() {return tmpl_args_parsing;} public Xop_ctx Tmpl_args_parsing_(boolean v) {tmpl_args_parsing = v; return this;} private boolean tmpl_args_parsing;
public Bry_bfr Tmpl_output() {return tmpl_output;} public Xop_ctx Tmpl_output_(Bry_bfr v) {tmpl_output = v; return this;} private Bry_bfr tmpl_output; // OBSOLETE: after tmpl_prepend_nl rewrite; DATE:2014-08-21
public boolean Tmpl_args_parsing() {return tmpl_args_parsing;} public Xop_ctx Tmpl_args_parsing_(boolean v) {tmpl_args_parsing = v; return this;} private boolean tmpl_args_parsing;
public Bry_bfr Tmpl_output() {return tmpl_output;} public Xop_ctx Tmpl_output_(Bry_bfr v) {tmpl_output = v; return this;} private Bry_bfr tmpl_output; // OBSOLETE: after tmpl_prepend_nl rewrite; DATE:2014-08-21
public Xot_defn_trace Defn_trace() {return defn_trace;} public Xop_ctx Defn_trace_(Xot_defn_trace v) {defn_trace = v; return this;} private Xot_defn_trace defn_trace = Xot_defn_trace_null.Instance;
public boolean Only_include_evaluate() {return only_include_evaluate;} public Xop_ctx Only_include_evaluate_(boolean v) {only_include_evaluate = v; return this;} private boolean only_include_evaluate;
public boolean Only_include_evaluate() {return only_include_evaluate;} public Xop_ctx Only_include_evaluate_(boolean v) {only_include_evaluate = v; return this;} private boolean only_include_evaluate;
public Lst_section_nde_mgr Lst_section_mgr() {if (lst_section_mgr == null) lst_section_mgr = new Lst_section_nde_mgr(); return lst_section_mgr;} private Lst_section_nde_mgr lst_section_mgr;
public Hash_adp_bry Lst_page_regy() {return lst_page_regy;} private Hash_adp_bry lst_page_regy;
public boolean Ref_ignore() {return ref_ignore;} public Xop_ctx Ref_ignore_(boolean v) {ref_ignore = v; return this;} private boolean ref_ignore; // NOTE: only applies to sub_ctx's created by <pages> and {{#lst}}; if true, does not add <ref> to page.Ref_mgr; DATE:2014-04-24
public boolean Ref_ignore() {return ref_ignore;} public Xop_ctx Ref_ignore_(boolean v) {ref_ignore = v; return this;} private boolean ref_ignore; // NOTE: only applies to sub_ctx's created by <pages> and {{#lst}}; if true, does not add <ref> to page.Ref_mgr; DATE:2014-04-24
public byte[] References_group() {return references_group;} public Xop_ctx References_group_(byte[] v) {references_group = v; return this;} private byte[] references_group;
public boolean Tid_is_popup() {return tid_is_popup;} public void Tid_is_popup_(boolean v) {tid_is_popup = v;} private boolean tid_is_popup = false;
public boolean Tid_is_image_map() {return tid_is_image_map;} public Xop_ctx Tid_is_image_map_(boolean v) {tid_is_image_map = v; return this;} private boolean tid_is_image_map;
public Xop_log_property_wkr Xtn__wikidata__property_wkr() {return app.Wiki_mgr().Wdata_mgr().Property_wkr();}
public Xop_log_invoke_wkr Xtn__scribunto__invoke_wkr() {
if (scrib_invoke_wkr == null)
scrib_invoke_wkr = ((Scrib_xtn_mgr)(app.Xtn_mgr().Get_or_fail(Scrib_xtn_mgr.XTN_KEY))).Invoke_wkr();
return scrib_invoke_wkr;
} private Xop_log_invoke_wkr scrib_invoke_wkr;
public Xop_log_property_wkr Xtn__wikidata__property_wkr() {return app.Wiki_mgr().Wdata_mgr().Property_wkr();}
public Gfo_msg_log Msg_log() {return msg_log;} private Gfo_msg_log msg_log;
public Xop_ctx Clear_all() {return Clear(true);}
public Xop_ctx Clear(boolean clear_scrib) {
cur_page.Clear(clear_scrib);
@@ -105,7 +110,7 @@ public class Xop_ctx {
public boolean Empty_ignored() {return empty_ignored;}
public void Empty_ignored_y_() {empty_ignored = Bool_.Y;} private boolean empty_ignored = false;
public void Empty_ignored_n_() {empty_ignored = Bool_.N;}
public void Empty_ignore(Xop_root_tkn root, int empty_bgn) {
public void Empty_ignore(Xop_root_tkn root, int empty_bgn) {
int empty_end = root.Subs_len();
for (int i = empty_bgn; i < empty_end; i++) {
Xop_tkn_itm sub_tkn = root.Subs_get(i);
@@ -113,7 +118,8 @@ public class Xop_ctx {
}
empty_ignored = false;
}
public byte Cur_tkn_tid() {return cur_tkn_tid;} private byte cur_tkn_tid = Xop_tkn_itm_.Tid_null;
public byte Cur_tkn_tid() {return cur_tkn_tid;} private byte cur_tkn_tid = Xop_tkn_itm_.Tid_null;
public void Subs_add_and_stack_tblw(Xop_root_tkn root, Xop_tblw_tkn owner_tkn, Xop_tkn_itm sub) {
if (owner_tkn != null) owner_tkn.Tblw_subs_len_add_(); // owner_tkn can be null;EX: "{|" -> prv_tkn is null
Subs_add_and_stack(root, sub);
@@ -306,28 +312,29 @@ public class Xop_ctx {
if (stack_pos == -1) return;
ctx.Stack_pop_til(root, src, stack_pos, true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_txt);
}
public static Xop_ctx new_main_page(Xowe_wiki wiki) {return new_(wiki, wiki.Parser_mgr(), Xoa_page_.Main_page_bry);} // HACK: use "Main_Page" to put in valid page title
public static Xop_ctx new_(Xowe_wiki wiki, Xow_parser_mgr parser_mgr, byte[] ttl_bry) {return new Xop_ctx(wiki, parser_mgr, Xoae_page.New(wiki, wiki.Ttl_parse(ttl_bry)));}
public static Xop_ctx new_sub_(Xop_ctx ctx) {return new_sub_(ctx.wiki, ctx, ctx.cur_page);}
public static Xop_ctx new_sub_(Xowe_wiki wiki, Xop_ctx ctx) {return new_sub_(wiki, ctx, ctx.cur_page);}
public static Xop_ctx new_sub_(Xowe_wiki wiki, Xop_ctx ctx, Xoae_page page) { // TODO_OLD: new_sub_ should reuse ctx's page; callers who want new_page should call new_sub_page_; DATE:2014-04-10
Xop_ctx rv = new Xop_ctx(wiki, ctx.parser_mgr, page);
new_copy(ctx, rv);
public static Xop_ctx New__top(Xowe_wiki wiki) {return New__top(wiki, Xoa_page_.Main_page_bry);} // HACK: use "Main_Page" to put in valid page title
public static Xop_ctx New__top(Xowe_wiki wiki, byte[] ttl_bry) {return new Xop_ctx(wiki, Xoae_page.New(wiki, wiki.Ttl_parse(ttl_bry)));}
public static Xop_ctx New__sub__reuse_page(Xop_ctx ctx) {return New__sub(ctx.wiki, ctx, ctx.cur_page);} // CALLED: many
public static Xop_ctx New__sub__reuse_lst(Xowe_wiki wiki, Xop_ctx ctx, Hash_adp_bry lst_page_regy) {
Xop_ctx rv = new Xop_ctx(wiki, ctx.cur_page);
Share_ctx_vars(ctx, rv);
rv.lst_page_regy = lst_page_regy; // NOTE: must share ref for callers of New__sub__reuse_lst only (do not share for New__sub(), else stack overflow)
return rv;
}
public static Xop_ctx new_sub_page_(Xowe_wiki wiki, Xop_ctx ctx, Hash_adp_bry lst_page_regy) {
Xop_ctx rv = new Xop_ctx(wiki, ctx.parser_mgr, ctx.cur_page);
new_copy(ctx, rv);
rv.lst_page_regy = lst_page_regy; // NOTE: must share ref for lst only (do not share for sub_(), else stack overflow)
public static Xop_ctx New__sub(Xowe_wiki wiki, Xop_ctx ctx, Xoae_page page) {// TODO_OLD: new_sub_ should reuse ctx's page; callers who want new_page should call new_sub_page_; DATE:2014-04-10
Xop_ctx rv = new Xop_ctx(wiki, page);
Share_ctx_vars(ctx, rv);
return rv;
}
public static Xop_ctx New_sub_by_ctx(Xop_ctx ctx) {
Xowe_wiki wiki = ctx.Wiki();
Xop_ctx rv = new Xop_ctx(wiki, ctx.parser_mgr, Xoae_page.New(wiki, wiki.Ttl_parse(ctx.Page().Ttl().Full_db())));
new_copy(ctx, rv);
public static Xop_ctx New__sub_and_page(Xowe_wiki wiki, Xop_ctx ctx) { // CALLED: poem
Xop_ctx rv = new Xop_ctx(wiki, Xoae_page.New(wiki, wiki.Ttl_parse(ctx.Page().Ttl().Full_db())));
Share_ctx_vars(ctx, rv);
return rv;
}
private static void new_copy(Xop_ctx src, Xop_ctx trg) {
private static void Share_ctx_vars(Xop_ctx src, Xop_ctx trg) {
trg.Lnki().File_logger_(src.Lnki().File_logger()); // always share lnki_logger between sub contexts
trg.tmpl_output = src.tmpl_output; // share bfr for optimization purposes
trg.ref_ignore = src.ref_ignore; // copy ref_ignore; needed for refs inside poem else duplicate refs; it.s:La_Secchia_rapita/Canto_primo; DATE:2015-12-03

View File

@@ -37,23 +37,37 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
tmpl_lxr_mgr.Init_by_lang(lang);
wtxt_lxr_mgr.Init_by_lang(lang);
}
public byte[] Expand_tmpl(byte[] src) { // expands {{A}} -> some wikitext; called by tmpl_invk, lang_msgs, sidebar
Xop_ctx ctx = Xop_ctx.New__sub__reuse_page(wiki.Parser_mgr().Ctx()); // PERF: reuse root ctx
return Expand_tmpl(ctx, ctx.Tkn_mkr(), src);
}
private byte[] Expand_tmpl(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, byte[] src) {return Expand_tmpl(tkn_mkr.Root(src), ctx, tkn_mkr, src);}
public byte[] Expand_tmpl(Xop_root_tkn root, Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, byte[] src) {
Parse(root, ctx, tkn_mkr, src, Xop_parser_tid_.Tid__tmpl, tmpl_trie, Xop_parser_.Doc_bgn_bos);
int len = root.Subs_len();
for (int i = 0; i < len; ++i)
root.Subs_get(i).Tmpl_compile(ctx, src, tmpl_props);
return Xot_tmpl_wtr.Instance.Write_all(ctx, root, src);
}
public byte[] Parse_text_to_html(Xop_ctx ctx, byte[] src) {
Bry_bfr bfr = Xoa_app_.Utl__bfr_mkr().Get_b512();
Parse_text_to_html(bfr, ctx.Page(), false, src);
Parse_text_to_html(bfr, ctx, ctx.Page(), false, src);
return bfr.To_bry_and_rls();
}
public void Parse_text_to_html(Bry_bfr trg, Xoae_page page, boolean para_enabled, byte[] src) {Parse_text_to_html(trg, page, Xoh_wtr_ctx.Basic, para_enabled, src);}
public void Parse_text_to_html(Bry_bfr trg, Xoae_page page, Xoh_wtr_ctx hctx, boolean para_enabled, byte[] src) {
Xop_ctx ctx = Xop_ctx.new_sub_(wiki, wiki.Parser_mgr().Ctx(), page);
public void Parse_text_to_html(Bry_bfr trg, Xop_ctx pctx, Xoae_page page, boolean para_enabled, byte[] src) {Parse_text_to_html(trg, pctx, page, Xoh_wtr_ctx.Basic, para_enabled, src);}
public void Parse_text_to_html(Bry_bfr trg, Xop_ctx pctx, Xoae_page page, Xoh_wtr_ctx hctx, boolean para_enabled, byte[] src) {
Xop_ctx ctx = Xop_ctx.New__sub(wiki, pctx, page);
Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
Xop_root_tkn root = tkn_mkr.Root(src);
Xop_parser parser = wiki.Parser_mgr().Main();
byte[] wtxt = parser.Parse_text_to_wtxt(root, ctx, tkn_mkr, src);
byte[] wtxt = parser.Expand_tmpl(root, ctx, tkn_mkr, src);
root.Reset();
ctx.Para().Enabled_(para_enabled);
parser.Parse_wtxt_to_wdom(root, ctx, ctx.Tkn_mkr(), wtxt, Xop_parser_.Doc_bgn_bos);
wiki.Html_mgr().Html_wtr().Write_all(trg, ctx, hctx, wtxt, root);
wiki.Html_mgr().Html_wtr().Write_doc(trg, ctx, hctx, wtxt, root);
}
public Xot_defn_tmpl Parse_text_to_defn_obj(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xow_ns ns, byte[] name, byte[] src) {
Xot_defn_tmpl rv = new Xot_defn_tmpl();
Parse_text_to_defn(rv, ctx, tkn_mkr, ns, name, src);
@@ -61,7 +75,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
}
public void Parse_text_to_defn(Xot_defn_tmpl tmpl, Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xow_ns ns, byte[] name, byte[] src) {
Xop_root_tkn root = tkn_mkr.Root(src);
Parse(root, ctx, tkn_mkr, src, Xop_parser_.Parse_tid_tmpl, tmpl_trie, Xop_parser_.Doc_bgn_bos);
Parse(root, ctx, tkn_mkr, src, Xop_parser_tid_.Tid__defn, tmpl_trie, Xop_parser_.Doc_bgn_bos);
tmpl_props.OnlyInclude_exists = false; int subs_len = root.Subs_len();
for (int i = 0; i < subs_len; i++)
root.Subs_get(i).Tmpl_compile(ctx, src, tmpl_props);
@@ -73,7 +87,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
ctx.Page().Clear_all(); ctx.App().Msg_log().Clear();
Parse_text_to_wdom(root, ctx, tkn_mkr, src, Xop_parser_.Doc_bgn_bos);
}
public Xop_root_tkn Parse_text_to_wdom_old_ctx(Xop_ctx old_ctx, byte[] src, boolean doc_bgn_pos) {return Parse_text_to_wdom(Xop_ctx.new_sub_(old_ctx), src, doc_bgn_pos);}
public Xop_root_tkn Parse_text_to_wdom_old_ctx(Xop_ctx old_ctx, byte[] src, boolean doc_bgn_pos) {return Parse_text_to_wdom(Xop_ctx.New__sub__reuse_page(old_ctx), src, doc_bgn_pos);}
public Xop_root_tkn Parse_text_to_wdom(Xop_ctx new_ctx, byte[] src, boolean doc_bgn_pos) {
new_ctx.Para().Enabled_n_();
Xop_tkn_mkr tkn_mkr = new_ctx.Tkn_mkr();
@@ -83,30 +97,17 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ
}
public void Parse_text_to_wdom(Xop_root_tkn root, Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, byte[] src, int doc_bgn_pos) {
byte parse_tid_old = ctx.Parse_tid();// NOTE: must store parse_tid b/c ctx can be reused by other classes
ctx.Parse_tid_(Xop_parser_.Parse_tid_page_tmpl);
ctx.Parse_tid_(Xop_parser_tid_.Tid__tmpl);
root.Reset();
byte[] mid_bry = Parse_text_to_wtxt(root, ctx, tkn_mkr, src);
byte[] mid_bry = Expand_tmpl(root, ctx, tkn_mkr, src);
root.Data_mid_(mid_bry);
root.Reset();
Parse_wtxt_to_wdom(root, ctx, tkn_mkr, mid_bry, doc_bgn_pos);
ctx.Parse_tid_(parse_tid_old);
}
public byte[] Parse_text_to_wtxt(byte[] src) {
Xop_ctx ctx = Xop_ctx.new_sub_(wiki.Parser_mgr().Ctx());
Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
Xop_root_tkn root = tkn_mkr.Root(src);
return wiki.Parser_mgr().Main().Parse_text_to_wtxt(root, ctx, tkn_mkr, src);
}
public byte[] Parse_text_to_wtxt(Xop_root_tkn root, Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, byte[] src) {
Parse(root, ctx, tkn_mkr, src, Xop_parser_.Parse_tid_page_tmpl, tmpl_trie, Xop_parser_.Doc_bgn_bos);
int subs_len = root.Subs_len();
for (int i = 0; i < subs_len; i++)
root.Subs_get(i).Tmpl_compile(ctx, src, tmpl_props);
return Xot_tmpl_wtr.Instance.Write_all(ctx, root, src); // NOTE: generate new src since most callers will use it;
}
public void Parse_wtxt_to_wdom(Xop_root_tkn root, Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, byte[] wtxt, int doc_bgn_pos) {
root.Root_src_(wtxt); // always set latest src; needed for Parse_all wherein src will first be raw and then parsed tmpl
Parse(root, ctx, tkn_mkr, wtxt, Xop_parser_.Parse_tid_page_wiki, wtxt_trie, doc_bgn_pos);
Parse(root, ctx, tkn_mkr, wtxt, Xop_parser_tid_.Tid__wtxt, wtxt_trie, doc_bgn_pos);
}
private void Parse(Xop_root_tkn root, Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, byte[] src, byte parse_type, Btrie_fast_mgr trie, int doc_bgn_pos) {
int len = src.length; if (len == 0) return; // nothing to parse;

View File

@@ -16,21 +16,28 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.parsers; import gplx.*; import gplx.xowa.*;
import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.langs.vnts.*;
public class Xop_parser_ {
public static final byte Parse_tid_null = 0, Parse_tid_tmpl = 1, Parse_tid_page_tmpl = 2, Parse_tid_page_wiki = 3;
public static final int Doc_bgn_bos = -1, Doc_bgn_char_0 = 0;
public static byte[] Parse_text_to_html(Xowe_wiki wiki, Xoae_page page, Xoa_ttl ttl, byte[] src, boolean para_enabled) { // NOTE: must pass in same page instance; do not do Xoa_page_.new_(), else img_idx will get reset to 0; DATE:2015-02-08
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
Xop_ctx ctx = Xop_ctx.new_sub_(wiki, wiki.Parser_mgr().Ctx(), page);
public static byte[] Parse_text_to_html(Xowe_wiki wiki, Xop_ctx owner_ctx, Xoae_page page, Xoa_ttl ttl, byte[] src, boolean para_enabled) { // NOTE: must pass in same page instance; do not do Xoa_page_.new_(), else img_idx will get reset to 0; DATE:2015-02-08
// init
Xop_ctx ctx = Xop_ctx.New__sub(wiki, owner_ctx, page);
Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
Xop_root_tkn root = tkn_mkr.Root(src);
Xop_parser parser = wiki.Parser_mgr().Main();
byte[] wtxt = parser.Parse_text_to_wtxt(root, ctx, tkn_mkr, src);
// expand template; EX: {{A}} -> wikitext
byte[] wtxt = parser.Expand_tmpl(root, ctx, tkn_mkr, src);
// parse wikitext
root.Reset();
ctx.Para().Enabled_(para_enabled);
parser.Parse_wtxt_to_wdom(root, ctx, ctx.Tkn_mkr(), wtxt, Xop_parser_.Doc_bgn_bos);
wiki.Html_mgr().Html_wtr().Write_all(bfr, ctx, wtxt, root);
// write html
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
wiki.Html_mgr().Html_wtr().Write_doc(bfr, ctx, Xoh_wtr_ctx.Basic, wtxt, root);
return bfr.To_bry_and_rls();
}
}

View File

@@ -52,7 +52,7 @@ class Xop_parser__fxt {
}
public void Test_parse_to_html(String raw, boolean para_enabled, String expd) {
byte[] raw_bry = Bry_.new_u8(raw);
fxt.Wiki().Parser_mgr().Main().Parse_text_to_html(bfr, fxt.Page(), para_enabled, raw_bry);
fxt.Wiki().Parser_mgr().Main().Parse_text_to_html(bfr, fxt.Ctx(), fxt.Page(), para_enabled, raw_bry);
Tfds.Eq(expd, bfr.To_str_and_clear());
}
}

View File

@@ -0,0 +1,21 @@
/*
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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.parsers; import gplx.*; import gplx.xowa.*;
public class Xop_parser_tid_ {
public static final byte Tid__null = 0, Tid__defn = 1, Tid__tmpl = 2, Tid__wtxt = 3;
}

View File

@@ -17,18 +17,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.parsers; import gplx.*; import gplx.xowa.*;
import gplx.xowa.wikis.*; import gplx.core.envs.*;
import gplx.xowa.xtns.scribunto.*;
import gplx.xowa.files.*;
import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.xtns.scribunto.*;
public class Xow_parser_mgr {
private final Xowe_wiki wiki; private final Xop_tkn_mkr tkn_mkr;
private Xop_parser anchor_encode_parser;
public Xow_parser_mgr(Xowe_wiki wiki) {
this.wiki = wiki; this.tkn_mkr = wiki.Appe().Parser_mgr().Tkn_mkr();
this.ctx = Xop_ctx.new_main_page(wiki);
this.main = Xop_parser.new_wiki(wiki);
this.ctx = Xop_ctx.New__top(wiki);
this.parser = Xop_parser.new_wiki(wiki);
}
public Xop_ctx Ctx() {return ctx;} private final Xop_ctx ctx;
public Xop_parser Main() {return main;} private final Xop_parser main;
public Scrib_core_mgr Scrib() {return scrib;} private final Scrib_core_mgr scrib = new Scrib_core_mgr();
public Xop_ctx Ctx() {return ctx;} private final Xop_ctx ctx;
public Xop_parser Main() {return parser;} private final Xop_parser parser;
public Scrib_core_mgr Scrib() {return scrib;} private final Scrib_core_mgr scrib = new Scrib_core_mgr();
public Pfunc_ifexist_mgr Ifexist_mgr() {return ifexist_mgr;} private final Pfunc_ifexist_mgr ifexist_mgr = new Pfunc_ifexist_mgr();
public Xof_url_bldr Url_bldr() {return url_bldr;} private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2();
public Xop_parser Anchor_encoder() {
if (anchor_encode_parser == null) {
anchor_encode_parser = Xop_parser.new_(wiki, wiki.Parser_mgr().Main().Tmpl_lxr_mgr(), Xop_lxr_mgr.new_anchor_encoder());
@@ -37,16 +40,16 @@ public class Xow_parser_mgr {
}
return anchor_encode_parser;
}
public void Parse(Xoae_page page, boolean clear) {
public void Parse(Xoae_page page, boolean clear) { // main parse method
if (!Env_.Mode_testing()) wiki.Init_assert();
page.Wikie().Parser_mgr().Scrib().Core_page_changed(page); // notify scribunto about page changed
scrib.Core_page_changed(page); // notify scribunto about page changed
ctx.Page_(page);
Xop_root_tkn root = ctx.Tkn_mkr().Root(page.Db().Text().Text_bry());
if (clear) {page.Clear_all();}
Xoa_ttl ttl = page.Ttl();
if ( Xow_page_tid.Identify(wiki.Domain_tid(), ttl.Ns().Id(), ttl.Page_db()) == Xow_page_tid.Tid_wikitext) { // only parse page if wikitext; skip .js, .css, Module; DATE:2013-11-10
byte[] data_raw = page.Db().Text().Text_bry();
main.Parse_text_to_wdom(root, ctx, tkn_mkr, data_raw , Xop_parser_.Doc_bgn_bos);
parser.Parse_text_to_wdom(root, ctx, tkn_mkr, data_raw , Xop_parser_.Doc_bgn_bos);
}
page.Root_(root);
root.Data_htm_(root.Root_src());

View File

@@ -153,57 +153,4 @@ public class Xop_amp_mgr { // TS
return dirty ? bfr.To_bry_and_clear_and_rls() : src;
}
public static final Xop_amp_mgr Instance = new Xop_amp_mgr(); Xop_amp_mgr() {}
// private Xop_tkn_itm Parse_as_tkn_old(Xop_tkn_mkr tkn_mkr, byte[] src, int src_len, int amp_pos, int cur_pos) {
// synchronized (thread_lock_1) {
// rv_pos = amp_pos + 1; // default to fail pos; after amp;
// Object o = amp_trie.Match_bgn(src, cur_pos, src_len);
// cur_pos = amp_trie.Match_pos();
// if (o == null) return null;
// Xop_amp_trie_itm itm = (Xop_amp_trie_itm)o;
// switch (itm.Tid()) {
// case Xop_amp_trie_itm.Tid_name_std:
// case Xop_amp_trie_itm.Tid_name_xowa:
// rv_pos = cur_pos;
// return tkn_mkr.Amp_txt(amp_pos, cur_pos, itm);
// case Xop_amp_trie_itm.Tid_num_hex:
// case Xop_amp_trie_itm.Tid_num_dec:
// boolean ncr_is_hex = itm.Tid() == Xop_amp_trie_itm.Tid_num_hex;
// Xop_amp_mgr_rslt rv = Parse_as_int2(ncr_is_hex, src, src_len, amp_pos, cur_pos);
// return rv.Pass() ? tkn_mkr.Amp_num(amp_pos, rv_pos, rslt_val) : null;
// default: throw Err_.new_unhandled(itm.Tid());
// }
// }
// }
// private boolean Parse_as_int_old(boolean ncr_is_hex, byte[] src, int src_len, int amp_pos, int int_bgn) {
// synchronized (thread_lock_2) {
// rv_pos = amp_pos + 1; // default to fail pos; after amp;
// rslt_val = -1; // clear any previous setting
// int cur_pos = int_bgn, int_end = -1;
// int semic_pos = Bry_find_.Find_fwd(src, Byte_ascii.Semic, cur_pos, src_len);
// if (semic_pos == Bry_find_.Not_found) return false;
// int_end = semic_pos - 1; // int_end = pos before semicolon
// int multiple = ncr_is_hex ? 16 : 10, val = 0, factor = 1, cur = 0;
// for (int i = int_end; i >= int_bgn; i--) {
// byte b = src[i];
// if (ncr_is_hex) {
// if (b >= 48 && b <= 57) cur = b - 48;
// else if (b >= 65 && b <= 70) cur = b - 55;
// else if (b >= 97 && b <= 102) cur = b - 87;
// else if((b >= 71 && b <= 90)
// || (b >= 91 && b <= 122)) continue; // NOTE: wiki discards letters G-Z; PAGE:en.w:Miscellaneous_Symbols "{{Unicode|&#xx26D0;}}"; NOTE 2nd x is discarded
// else return false;
// }
// else {
// cur = b - Byte_ascii.Num_0;
// if (cur < 0 || cur > 10) return false;
// }
// val += cur * factor;
// if (val > gplx.core.intls.Utf8_.Codepoint_max) return false; // fail if value > largest_unicode_codepoint
// factor *= multiple;
// }
// rslt_val = val;
// rv_pos = semic_pos + 1; // position after semic
// return true;
// }
// }
}

View File

@@ -19,7 +19,7 @@ package gplx.xowa.parsers.apos; import gplx.*; import gplx.xowa.*; import gplx.x
import org.junit.*;
import gplx.xowa.parsers.lists.*;
public class Xop_apos_wkr_tst {
private final Xop_fxt fxt = new Xop_fxt();
private final Xop_fxt fxt = new Xop_fxt();
@Test public void Basic() {
fxt.Test_parse_page_wiki("''a''" , fxt.tkn_apos_(Xop_apos_tkn_.Cmd_i_bgn) , fxt.tkn_txt_(2, 3), fxt.tkn_apos_(Xop_apos_tkn_.Cmd_i_end));
fxt.Test_parse_page_wiki("'''a'''" , fxt.tkn_apos_(Xop_apos_tkn_.Cmd_b_bgn) , fxt.tkn_txt_(3, 4), fxt.tkn_apos_(Xop_apos_tkn_.Cmd_b_end));
@@ -114,13 +114,7 @@ public class Xop_apos_wkr_tst {
);
}
@Test public void Mix_hdr_autoClose() {
fxt.Test_parse_page_wiki("''a\n==b=="
, fxt.tkn_apos_(Xop_apos_tkn_.Cmd_i_bgn).Src_rng_(0, 2)
, fxt.tkn_txt_(2, 3)
, fxt.tkn_apos_(Xop_apos_tkn_.Cmd_i_end).Src_rng_(3, 3)
, fxt.tkn_hdr_(3, 9, 2).Subs_
( fxt.tkn_txt_(6, 7)
));
fxt.Test_parse_page_wiki_str("''a\n==b==", "<i>a</i>\n\n<h2>b</h2>");
}
@Test public void Apos_broken_by_tblw_th() { // DATE:2013-04-24
fxt.Test_parse_page_all_str("A ''[[b!!]]'' c", "A <i><a href=\"/wiki/B!!\">b!!</a></i> c");

View File

@@ -16,19 +16,19 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.hzips.*;
public class Xop_hdr_tkn extends Xop_tkn_itm_base {
public Xop_hdr_tkn(int bgn, int end, int hdr_level) {this.Tkn_ini_pos(false, bgn, end); this.hdr_level = hdr_level;}
@Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_hdr;}
public int Hdr_level() {return hdr_level;} public Xop_hdr_tkn Hdr_level_(int v) {hdr_level = v; return this;} private int hdr_level = -1;
public int Hdr_bgn_manual() {return hdr_bgn_manual;} public Xop_hdr_tkn Hdr_bgn_manual_(int v) {hdr_bgn_manual = v; return this;} private int hdr_bgn_manual;
public int Hdr_end_manual() {return hdr_end_manual;} public Xop_hdr_tkn Hdr_end_manual_(int v) {hdr_end_manual = v; return this;} private int hdr_end_manual;
public boolean Hdr_html_first() {return hdr_html_first;} public Xop_hdr_tkn Hdr_html_first_y_() {hdr_html_first = true; return this;} private boolean hdr_html_first;
public int Hdr_html_dupe_idx() {return hdr_html_dupe_idx;} private int hdr_html_dupe_idx;
public byte[] Hdr_html_id() {return hdr_html_id;} public Xop_hdr_tkn Hdr_html_id_(byte[] v) {hdr_html_id = v; return this;} private byte[] hdr_html_id = Bry_.Empty;
public byte[] Hdr_toc_text() {return hdr_toc_text;} public Xop_hdr_tkn Hdr_toc_text_(byte[] v) {hdr_toc_text = v; return this;} private byte[] hdr_toc_text;
public int Hdr_html_dupe_idx_next() {
hdr_html_dupe_idx = hdr_html_dupe_idx == 0 ? 2 : hdr_html_dupe_idx + 1;
return hdr_html_dupe_idx;
}
public Xop_hdr_tkn(int bgn, int end, int num) {this.Tkn_ini_pos(false, bgn, end); this.num = num;}
@Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_hdr;}
public int Num() {return num;} private int num = -1; // EX: 4 for <h2>
public int Manual_bgn() {return manual_bgn;} private int manual_bgn; // unbalanced count; EX: === A == -> 1
public int Manual_end() {return manual_end;} private int manual_end; // unbalanced count; EX: == A === -> 1
public boolean First_in_doc() {return first_in_doc;} private boolean first_in_doc; // true if 1st hdr in doc
public void First_in_doc_y_() {first_in_doc = true;}
public void Init_by_parse(int num, int manual_bgn, int manual_end) {
this.num = num;
this.manual_bgn = manual_bgn;
this.manual_end = manual_end;
}
public static final Xop_hdr_tkn[] Ary_empty = new Xop_hdr_tkn[0];
}

View File

@@ -1,34 +0,0 @@
/*
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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.core.tests.*;
public class Xop_hdr_tkn_chkr extends Xop_tkn_chkr_base {
@Override public Class<?> TypeOf() {return Xop_hdr_tkn.class;}
@Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_hdr;}
public int Hdr_len() {return hdr_len;} public Xop_hdr_tkn_chkr Hdr_level_(int v) {hdr_len = v; return this;} private int hdr_len = -1;
public int Hdr_ws_bgn() {return hdr_ws_bgn;} public Xop_hdr_tkn_chkr Hdr_ws_bgn_(int v) {hdr_ws_bgn = v; return this;} private int hdr_ws_bgn = -1;
public int Hdr_ws_end() {return hdr_ws_end;} public Xop_hdr_tkn_chkr Hdr_ws_end_(int v) {hdr_ws_end = v; return this;} private int hdr_ws_end = -1;
public int Hdr_ws_trailing() {return hdr_ws_trailing;} public Xop_hdr_tkn_chkr Hdr_ws_trailing_(int v) {hdr_ws_trailing = v; return this;} private int hdr_ws_trailing = -1;
public Xop_hdr_tkn_chkr Hdr_html_id_(String v) {hdr_html_id = Bry_.new_a7(v); return this;} private byte[] hdr_html_id = Bry_.Empty;
@Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) {
Xop_hdr_tkn actl = (Xop_hdr_tkn)actl_obj;
err += mgr.Tst_val(hdr_len == -1, path, "hdr_len", hdr_len, actl.Hdr_level());
err += mgr.Tst_val(hdr_html_id == Bry_.Empty, path, "hdr_html_id", String_.new_a7(hdr_html_id), String_.new_a7(actl.Hdr_html_id()));
return err;
}
}

View File

@@ -24,10 +24,9 @@ public class Xop_hdr_wkr implements Xop_ctx_wkr {
public void AutoClose(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, Xop_tkn_itm tkn) {
// bgn never closed; mark inert; EX: "==a"
Xop_hdr_tkn bgn = (Xop_hdr_tkn)tkn;
int bgn_hdr_len = bgn.Hdr_level();
bgn.Hdr_bgn_manual_(bgn_hdr_len);
bgn.Hdr_level_(0);
if (bgn_hdr_len > 1 && ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki) // NOTE: \n= is not uncommon for templates; ignore them;
int bgn_hdr_len = bgn.Num();
bgn.Init_by_parse(0, bgn_hdr_len, 0);
if (bgn_hdr_len > 1 && ctx.Parse_tid() == Xop_parser_tid_.Tid__wtxt) // NOTE: \n= is not uncommon for templates; ignore them;
ctx.Msg_log().Add_itm_none(Xop_hdr_log.Dangling_hdr, src, bgn.Src_bgn(), bgn_pos);
}
public int Make_tkn_bgn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) {
@@ -51,7 +50,7 @@ public class Xop_hdr_wkr implements Xop_ctx_wkr {
if (ctx.Cur_tkn_tid() == Xop_tkn_itm_.Tid_tmpl_curly_bgn) return ctx.Lxr_make_txt_(cur_pos);
Xop_hdr_tkn hdr = (Xop_hdr_tkn)ctx.Stack_pop_til(root, src, stackPos, false, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_hdr);
ctx.Apos().End_frame(ctx, root, src, bgn_pos, false); // end any apos; EX: ==''a==
int hdr_len = hdr.Hdr_level(), bgn_manual = 0, end_manual = 0;
int hdr_len = hdr.Num(), bgn_manual = 0, end_manual = 0;
boolean dirty = false;
if (end_hdr_len < hdr_len) { // mismatch: end has more; adjust hdr
bgn_manual = hdr_len - end_hdr_len;
@@ -65,19 +64,20 @@ public class Xop_hdr_wkr implements Xop_ctx_wkr {
ctx.Msg_log().Add_itm_none(Xop_hdr_log.Mismatched, src, bgn_pos, cur_pos);
dirty = true;
}
if (hdr_len > 6) { // <h7>+; limit to 6; NOTE: both bgn/end are equal length; EX: bgn=8,end=7 -> bgn=7,end=7;bgn_manual=1
if (hdr_len > 6) { // <h7>+; limit to 6; NOTE: make both bgn/end are equal length; EX: bgn=8,end=7 -> bgn=7,end=7;bgn_manual=1
bgn_manual = end_manual = hdr_len - 6;
hdr_len = 6;
dirty = true;
}
if (dirty)
hdr.Hdr_bgn_manual_(bgn_manual).Hdr_end_manual_(end_manual).Hdr_level_(hdr_len);
hdr.Init_by_parse(hdr_len, bgn_manual, end_manual);
cur_pos = Find_fwd_while_ws_hdr_version(src, cur_pos, src_len); // NOTE: hdr gobbles up trailing ws; EX: "==a== \n\t \n \nb" gobbles up all 3 "\n"s; otherwise para_wkr will process <br/>
ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag__h2);
hdr.Subs_move(root);
hdr.Src_end_(cur_pos);
if (ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki)
ctx.Page().Hdr_mgr().Add(ctx, hdr, src);
if (ctx.Parse_tid() == Xop_parser_tid_.Tid__wtxt) { // do not add if defn / tmpl mode
ctx.Page().Wtxt().Toc().Add(hdr);
}
return cur_pos;
}
private void Close_open_itms(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) {

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import org.junit.*;
public class Xop_hdr_wkr__basic_tst {
@Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt();
@Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt();
@After public void term() {fxt.Init_para_n_();}
@Test public void H2() {fxt.Test_parse_page_wiki_str("==a==" , "<h2>a</h2>\n");}
@Test public void H3() {fxt.Test_parse_page_wiki_str("===a===" , "<h3>a</h3>\n");}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import org.junit.*;
public class Xop_list_wkr_basic_tst {
private final Xop_fxt fxt = new Xop_fxt();
private final Xop_fxt fxt = new Xop_fxt();
@After public void term() {fxt.Init_para_n_();}
@Test public void List_1() {
fxt.Test_parse_page_wiki("\n*a"
@@ -211,27 +211,29 @@ public class Xop_list_wkr_basic_tst {
);
}
@Test public void Mix_1ul_1hdr() {
fxt.Test_parse_page_wiki("*a\n==a==\n"
, fxt.tkn_list_bgn_(0, 1, Xop_list_tkn_.List_itmTyp_ul).List_path_(0).List_uid_(0)
, fxt.tkn_txt_(1, 2)
, fxt.tkn_list_end_(2).List_path_(0).List_uid_(0)
, fxt.tkn_hdr_(2, 9, 2).Hdr_ws_trailing_(1).Subs_
( fxt.tkn_txt_(5, 6)
)
);
fxt.Test_parse_page_wiki_str("*a\n==a==\n", String_.Concat_lines_nl_skip_last
( "<ul>"
, " <li>a"
, " </li>"
, "</ul>"
, ""
, "<h2>a</h2>"
));
}
@Test public void Mix_1ul_1hdr_1ul() {
fxt.Test_parse_page_wiki("*a\n==a==\n*b"
, fxt.tkn_list_bgn_(0, 1, Xop_list_tkn_.List_itmTyp_ul).List_path_(0).List_uid_(0)
, fxt.tkn_txt_(1, 2)
, fxt.tkn_list_end_(2).List_path_(0).List_uid_(0)
, fxt.tkn_hdr_(2, 8, 2).Subs_
( fxt.tkn_txt_(5, 6)
)
, fxt.tkn_list_bgn_(8, 10, Xop_list_tkn_.List_itmTyp_ul).List_path_(0).List_uid_(1)
, fxt.tkn_txt_(10, 11)
, fxt.tkn_list_end_(11).List_path_(0)
);
fxt.Test_parse_page_wiki_str("*a\n==a==\n*b", String_.Concat_lines_nl_skip_last
( "<ul>"
, " <li>a"
, " </li>"
, "</ul>"
, ""
, "<h2>a</h2>"
, ""
, "<ul>"
, " <li>b"
, " </li>"
, "</ul>"
));
}
@Test public void Mix_1ol_1hr_1ol() {
fxt.Test_parse_page_wiki("#a\n----\n#b"

View File

@@ -22,6 +22,7 @@ public class Xop_lnki_arg_parser {
private final Btrie_fast_mgr key_trie = Btrie_fast_mgr.cs();
private final Bry_bfr int_bfr = Bry_bfr_.Reset(16);
private final Btrie_bwd_mgr px_trie = Btrie_bwd_mgr.cs_(); private final Btrie_fast_mgr size_trie = Btrie_fast_mgr.cs();
private final Btrie_rv key_trie_rv = new Btrie_rv(), px_trie_rv = new Btrie_rv(), size_trie_rv = new Btrie_rv();
private int lnki_w, lnki_h;
public void Evt_lang_changed(Xol_lang_itm lang) {
Bry_bfr tmp_bfr = int_bfr;
@@ -62,38 +63,38 @@ public class Xop_lnki_arg_parser {
}
public byte Identify_tid(byte[] src, int bgn, int end) {
int len = end - bgn;
Byte_obj_val val = (Byte_obj_val)key_trie.Match_bgn(src, bgn, end);
if (val != null && len == key_trie.Match_pos() - bgn) // check for false matches; EX: alternate= should not match alt=
Byte_obj_val val = (Byte_obj_val)key_trie.Match_at(key_trie_rv, src, bgn, end);
if (val != null && len == key_trie_rv.Pos() - bgn) // check for false matches; EX: alternate= should not match alt=
return val.Val(); // match; return val;
Object bwd_obj = px_trie.Match_bgn(src, end - 1, bgn - 1);
Object bwd_obj = px_trie.Match_at(px_trie_rv, src, end - 1, bgn - 1);
if (bwd_obj != null && ((Byte_obj_val)bwd_obj).Val() == Tid_dim) { // ends with "px"; try to parse size
int_bfr.Clear();
int match_len = end -1 - px_trie.Match_pos();
int match_len = end -1 - px_trie_rv.Pos();
boolean mode_width = true;
int itm_end = bgn + (len - match_len); // remove trailing px
for (int i = bgn; i < itm_end; i++) {
byte b = src[i];
Object o = size_trie.Match_bgn_w_byte(b, src, i, itm_end);
Object o = size_trie.Match_at_w_b0(size_trie_rv, b, src, i, itm_end);
if (o == null) {
this.lnki_w = Xop_lnki_tkn.Width_null; // NOTE: must null out width; EX: "123xTextpx"; PAGE:es.b:Alimentación_infantil; DATE:2015-07-10; NOTE: must be -1, not 0; DATE:2015-08-05
return Tid_caption; // letter or other invalid character; return caption
}
Byte_obj_val v = (Byte_obj_val)o;
switch (v.Val()) { // NOTE: d0 - d9 handle non-english numbers; EX:fa.w and ۲۰۰px; DATE:2015-07-18
case Key_dim_d0: int_bfr.Add_byte(Byte_ascii.Num_0); i += (size_trie.Match_pos() - i) - 1; break; // -1 b/c loop will ++i
case Key_dim_d1: int_bfr.Add_byte(Byte_ascii.Num_1); i += (size_trie.Match_pos() - i) - 1; break;
case Key_dim_d2: int_bfr.Add_byte(Byte_ascii.Num_2); i += (size_trie.Match_pos() - i) - 1; break;
case Key_dim_d3: int_bfr.Add_byte(Byte_ascii.Num_3); i += (size_trie.Match_pos() - i) - 1; break;
case Key_dim_d4: int_bfr.Add_byte(Byte_ascii.Num_4); i += (size_trie.Match_pos() - i) - 1; break;
case Key_dim_d5: int_bfr.Add_byte(Byte_ascii.Num_5); i += (size_trie.Match_pos() - i) - 1; break;
case Key_dim_d6: int_bfr.Add_byte(Byte_ascii.Num_6); i += (size_trie.Match_pos() - i) - 1; break;
case Key_dim_d7: int_bfr.Add_byte(Byte_ascii.Num_7); i += (size_trie.Match_pos() - i) - 1; break;
case Key_dim_d8: int_bfr.Add_byte(Byte_ascii.Num_8); i += (size_trie.Match_pos() - i) - 1; break;
case Key_dim_d9: int_bfr.Add_byte(Byte_ascii.Num_9); i += (size_trie.Match_pos() - i) - 1; break;
case Key_dim_d0: int_bfr.Add_byte(Byte_ascii.Num_0); i += (size_trie_rv.Pos() - i) - 1; break; // -1 b/c loop will ++i
case Key_dim_d1: int_bfr.Add_byte(Byte_ascii.Num_1); i += (size_trie_rv.Pos() - i) - 1; break;
case Key_dim_d2: int_bfr.Add_byte(Byte_ascii.Num_2); i += (size_trie_rv.Pos() - i) - 1; break;
case Key_dim_d3: int_bfr.Add_byte(Byte_ascii.Num_3); i += (size_trie_rv.Pos() - i) - 1; break;
case Key_dim_d4: int_bfr.Add_byte(Byte_ascii.Num_4); i += (size_trie_rv.Pos() - i) - 1; break;
case Key_dim_d5: int_bfr.Add_byte(Byte_ascii.Num_5); i += (size_trie_rv.Pos() - i) - 1; break;
case Key_dim_d6: int_bfr.Add_byte(Byte_ascii.Num_6); i += (size_trie_rv.Pos() - i) - 1; break;
case Key_dim_d7: int_bfr.Add_byte(Byte_ascii.Num_7); i += (size_trie_rv.Pos() - i) - 1; break;
case Key_dim_d8: int_bfr.Add_byte(Byte_ascii.Num_8); i += (size_trie_rv.Pos() - i) - 1; break;
case Key_dim_d9: int_bfr.Add_byte(Byte_ascii.Num_9); i += (size_trie_rv.Pos() - i) - 1; break;
case Key_dim_num: int_bfr.Add_byte(b); break;
case Key_space: break; // ignore space; EX: "100 px"
case Key_dim_px: { // 2nd px found; EX: "40pxpx"; "40px px"
int tmp_pos = size_trie.Match_pos();
int tmp_pos = size_trie_rv.Pos();
tmp_pos = Bry_find_.Find_fwd_while_space_or_tab(src, tmp_pos, itm_end); // look for next ws pos;
if (tmp_pos == itm_end) // no non-ws found; tmp_pos == itm_end; allow itm; EX: "40pxpx"; "40px px"; DATE:2014-03-01
i = itm_end;

View File

@@ -19,7 +19,7 @@ package gplx.xowa.parsers.lnkis; import gplx.*; import gplx.xowa.*; import gplx.
import org.junit.*;
import gplx.xowa.langs.cases.*;
public class Xop_lnki_wkr__ctg_tst {
@Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private final Xop_fxt fxt = new Xop_fxt();
@Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private final Xop_fxt fxt = new Xop_fxt();
@After public void term() {fxt.Init_para_n_();}
@Test public void Pre() { // PURPOSE: Category should trim preceding nl; EX:w:Mount Kailash
fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last

View File

@@ -39,7 +39,7 @@ public class Xop_comm_lxr implements Xop_lxr {
}
private static int Trim_ws_if_entire_line_is_commment(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int cur_pos, int lhs_end, int rhs_bgn) {// REF.MW:Preprocessor_DOM.php|preprocessToXml|handle comments; DATE:2014-02-24
if ( ctx.Tid_is_popup()
&& ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki // note that only popup parse can generate <!-- --> that makes it to wtxt
&& ctx.Parse_tid() == Xop_parser_tid_.Tid__wtxt // note that only popup parse can generate <!-- --> that makes it to wtxt
&& Bry_.Match(src, lhs_end, rhs_bgn, Xowa_skip_text_bry) // <!--XOWA_SKIP-->
)
return cur_pos; // in popup mode only do not gobble trailing \n; PAGE:en.w:Gwynedd; DATE:2014-07-01
@@ -89,10 +89,10 @@ public class Xop_comm_lxr implements Xop_lxr {
ctx.Subs_add(root, tkn_mkr.NewLine(nl_rhs - 1, nl_rhs, Xop_nl_tkn.Tid_char, 1).Ignore_y_()); // add tkn for nl_rhs, but mark as ignore; needed for multiple comment nls; EX: "<!-- -->\n<!-- -->\n;"; DATE:2014-02-24
return nl_rhs;
}
public static final byte[] Bgn_ary = new byte[] {60, 33, 45, 45}, /*<!--*/ End_ary = new byte[] {45, 45, 62}; /*-->*/
private static final int End_len = End_ary.length;
public static final Xop_comm_lxr Instance = new Xop_comm_lxr(); Xop_comm_lxr() {}
private static final String Xowa_skip_text_str = "XOWA_SKIP";
private static final byte[] Xowa_skip_text_bry = Bry_.new_a7(Xowa_skip_text_str);
public static final byte[] Xowa_skip_comment_bry = Bry_.new_a7("<!--" + Xowa_skip_text_str + "-->");
public static final byte[] Bgn_ary = new byte[] {60, 33, 45, 45}, /*<!--*/ End_ary = new byte[] {45, 45, 62}; /*-->*/
private static final int End_len = End_ary.length;
public static final Xop_comm_lxr Instance = new Xop_comm_lxr(); Xop_comm_lxr() {}
private static final String Xowa_skip_text_str = "XOWA_SKIP";
private static final byte[] Xowa_skip_text_bry = Bry_.new_a7(Xowa_skip_text_str);
public static final byte[] Xowa_skip_comment_bry = Bry_.new_a7("<!--" + Xowa_skip_text_str + "-->");
}

View File

@@ -28,11 +28,11 @@ public class Xop_pipe_lxr implements Xop_lxr {
switch (cur_stack_tid) {
case Xop_tkn_itm_.Tid_brack_bgn: // used for tmpl mode where full lnki_wkr is too heavyweight; matches "[ |"
switch (ctx.Parse_tid()) {
case Xop_parser_.Parse_tid_tmpl:
case Xop_parser_.Parse_tid_page_tmpl:
case Xop_parser_tid_.Tid__defn:
case Xop_parser_tid_.Tid__tmpl:
ctx.Subs_add(root, tkn_mkr.Txt(bgn_pos, cur_pos));
break;
case Xop_parser_.Parse_tid_page_wiki: // should never happen?
case Xop_parser_tid_.Tid__wtxt: // should never happen?
ctx.Subs_add(root, tkn_mkr.Pipe(bgn_pos, cur_pos));
break;
default: throw Err_.new_unhandled(ctx.Parse_tid());
@@ -88,5 +88,5 @@ public class Xop_pipe_lxr implements Xop_lxr {
return cur_pos;
}
}
public static final Xop_pipe_lxr Instance = new Xop_pipe_lxr();
public static final Xop_pipe_lxr Instance = new Xop_pipe_lxr();
}

View File

@@ -18,10 +18,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.miscs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.core.btries.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*;
import gplx.xowa.htmls.tocs.*;
import gplx.xowa.addons.htmls.tocs.*;
import gplx.xowa.wikis.pages.wtxts.*;
public class Xop_under_lxr implements Xop_lxr {
private final Object thread_lock = new Object();
private Btrie_mgr words_trie_ci, words_trie_cs;
private Btrie_mgr words_trie_ci, words_trie_cs; private final Btrie_rv trv_cs = new Btrie_rv(), trv_ci = new Btrie_rv();
public int Lxr_tid() {return Xop_lxr_.Tid_under;}
public void Init_by_wiki(Xowe_wiki wiki, Btrie_fast_mgr core_trie) {}
public void Init_by_lang(Xol_lang_itm lang, Btrie_fast_mgr core_trie) {
@@ -81,33 +82,33 @@ public class Xop_under_lxr implements Xop_lxr {
.Add(Xop_under_hook.Key_alt, Xop_under_hook.Itm_alt)
;
public int Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) {
if (cur_pos == src_len) return ctx.Lxr_make_txt_(cur_pos); // eos
if (cur_pos == src_len) return ctx.Lxr_make_txt_(cur_pos); // eos
int rv = cur_pos;
Object word_obj = words_trie_cs.Match_bgn(src, cur_pos, src_len); // check cs
Object word_obj = words_trie_cs.Match_at(trv_cs, src, cur_pos, src_len); // check cs
if (word_obj == null) {
word_obj = words_trie_ci.Match_bgn(src, cur_pos, src_len); // check ci
word_obj = words_trie_ci.Match_at(trv_ci, src, cur_pos, src_len); // check ci
if (word_obj == null)
return ctx.Lxr_make_txt_(cur_pos); // kwd not found; EX: "TOCA__"
return ctx.Lxr_make_txt_(cur_pos); // kwd not found; EX: "TOCA__"
else
rv = words_trie_ci.Match_pos();
rv = trv_ci.Pos();
}
else
rv = words_trie_cs.Match_pos();
rv = trv_cs.Pos();
Xop_under_word word_itm = (Xop_under_word)word_obj;
Xop_under_lxr.Make_tkn(ctx, tkn_mkr, root, src, src_len, bgn_pos, rv, word_itm.Kwd_id());
return rv;
}
public static void Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, int kwd_id) {
Xoae_page page = ctx.Page();
Xow_hdr_mgr hdr_mgr = page.Hdr_mgr();
Xopg_toc_mgr hdr_mgr = page.Wtxt().Toc();
switch (kwd_id) {
case Xol_kwd_grp_.Id_toc:
hdr_mgr.Toc_manual_();
hdr_mgr.Flag__toc_y_();
ctx.Para().Process_block_lnki_div(); // NOTE: __TOC__ will manually place <div toc> here; simulate div in order to close any pres; EX:\n\s__TOC__; PAGE:de.w: DATE:2014-07-05
ctx.Subs_add(root, tkn_mkr.Under(bgn_pos, cur_pos, kwd_id)); // NOTE: only save under_tkn for TOC (b/c its position is needed for insertion); DATE:2013-07-01
break;
case Xol_kwd_grp_.Id_forcetoc: hdr_mgr.Toc_force_(); break;
case Xol_kwd_grp_.Id_notoc: hdr_mgr.Toc_hide_(); break;
case Xol_kwd_grp_.Id_forcetoc: hdr_mgr.Flag__forcetoc_y_(); break;
case Xol_kwd_grp_.Id_notoc: hdr_mgr.Flag__notoc_y_(); break;
case Xol_kwd_grp_.Id_noeditsection: break; // ignore; not handling edit sections
case Xol_kwd_grp_.Id_nocontentconvert: page.Html_data().Lang_convert_content_(false); break;
case Xol_kwd_grp_.Id_notitleconvert: page.Html_data().Lang_convert_title_(false); break;

View File

@@ -61,8 +61,10 @@ public class Xop_under_lxr_tst {
fxt.Init_para_n_();
}
@Test public void Toc_works() { // PURPOSE: make sure "suppressed" pre does not somehow suppress TOC
fxt.Wtr_cfg().Toc__show_(Bool_.Y);
fxt.Init_para_y_();
fxt.Test_parse_page_all_str("a\n__TOC__\n==b==\n", String_.Concat_lines_nl
Bry_bfr tmp = Bry_bfr_.New();
String expd = String_.Concat_lines_nl
( "<p>a"
, "</p>"
, "<div id=\"toc\" class=\"toc\">"
@@ -75,9 +77,12 @@ public class Xop_under_lxr_tst {
, " </ul>"
, "</div>"
, ""
, "<h2>b</h2>"
));
, "<h2><span class=\"mw-headline\" id=\"b\">b</span></h2>"
);
String actl = gplx.xowa.addons.htmls.tocs.Xowe_hdr_bldr_fxt.Bld_page_with_toc(tmp, fxt, "a\n__TOC__\n==b==\n");
Tfds.Eq_str_lines(expd, actl);
fxt.Init_para_n_();
fxt.Wtr_cfg().Toc__show_(Bool_.N);
}
@Test public void Ignore_pre_after() { // PURPOSE: "__TOC__\s\n" must be trimmed at end, else false pre; assertion only (no code exists to handle this test); DATE:2013-07-08
fxt.Init_para_y_();

View File

@@ -78,7 +78,7 @@ public class Xop_nl_lxr implements Xop_lxr {
Xop_tblw_wkr.Atrs_close(ctx, src, root, Bool_.N);
break;
}
if ( ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki // parse_mode is wiki
if ( ctx.Parse_tid() == Xop_parser_tid_.Tid__wtxt // parse_mode is wiki
&& para_wkr.Enabled() // check that para is enabled
)
para_wkr.Process_nl(ctx, root, src, bgn_pos, cur_pos);
@@ -89,6 +89,7 @@ public class Xop_nl_lxr implements Xop_lxr {
return cur_pos;
}
public static int Scan_fwd_for_ctg(Xop_ctx ctx, byte[] src, int cur_pos, int src_len) {
Btrie_rv trv = new Btrie_rv();
for (int i = cur_pos; i < src_len; i++) {
byte b = src[i];
switch (b) {
@@ -99,9 +100,9 @@ public class Xop_nl_lxr implements Xop_lxr {
&& i + 2 < src_len) {
int ttl_bgn = Bry_find_.Find_fwd_while(src, i + 2, src_len, Byte_ascii.Space);
Btrie_slim_mgr ctg_trie = ctx.Wiki().Ns_mgr().Category_trie();
Object ctg_ns = ctg_trie.Match_bgn(src, ttl_bgn, src_len);
Object ctg_ns = ctg_trie.Match_at(trv, src, ttl_bgn, src_len);
if (ctg_ns != null // "[[Category" found
&& Bry_.Has_at(src, src_len, ctg_trie.Match_pos(), Byte_ascii.Colon)) { // check that next char is :
&& Bry_.Has_at(src, src_len, trv.Pos(), Byte_ascii.Colon)) { // check that next char is :
return i;// return pos of 1st [
}
return Bry_find_.Not_found;

View File

@@ -24,12 +24,13 @@ public class Xop_para_wkr implements Xop_ctx_wkr {
private int para_stack;
private boolean in_block, block_is_bgn_xnde, block_is_end_xnde, in_blockquote, block_is_bgn_blockquote, block_is_end_blockquote;
private int prv_nl_pos; private Xop_para_tkn prv_para; private int prv_ws_bgn;
private final Btrie_rv trv = new Btrie_rv();
public boolean Enabled() {return enabled;} public Xop_para_wkr Enabled_(boolean v) {enabled = v; return this;} private boolean enabled = true;
public Xop_para_wkr Enabled_y_() {enabled = true; return this;} public Xop_para_wkr Enabled_n_() {enabled = false; return this;}
public void Ctor_ctx(Xop_ctx ctx) {}
public void Page_bgn(Xop_ctx ctx, Xop_root_tkn root) {
this.Clear();
para_enabled = enabled && ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki; // only enable for wikitext (not for template)
para_enabled = enabled && ctx.Parse_tid() == Xop_parser_tid_.Tid__wtxt; // only enable for wikitext (not for template)
if (para_enabled)
Prv_para_new(ctx, root, -1, 0); // create <para> at bos
}
@@ -159,7 +160,7 @@ public class Xop_para_wkr implements Xop_ctx_wkr {
public int Process_pre(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, int txt_pos) {
Dd_clear(ctx);
Btrie_slim_mgr tblw_ws_trie = ctx.App().Utl_trie_tblw_ws();
Object o = tblw_ws_trie.Match_bgn(src, txt_pos, src_len);
Object o = tblw_ws_trie.Match_at(trv, src, txt_pos, src_len);
if (o != null) { // tblw_ws found
Xop_tblw_ws_itm ws_itm = (Xop_tblw_ws_itm)o;
byte tblw_type = ws_itm.Tblw_type();
@@ -172,7 +173,7 @@ public class Xop_para_wkr implements Xop_ctx_wkr {
}
break;
case Xop_tblw_ws_itm.Type_xnde:
int nxt_pos = tblw_ws_trie.Match_pos();
int nxt_pos = trv.Pos();
if (nxt_pos < src_len) { // bounds check
switch (src[nxt_pos]) { // check that next char is "end" of xnde name; guard against false matches like "<trk" PAGE:de.v:Via_Jutlandica/Gpx DATE:2014-11-29
case Byte_ascii.Space: case Byte_ascii.Nl: case Byte_ascii.Tab: // whitespace

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.paras; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import org.junit.*; import gplx.xowa.parsers.lists.*;
public class Xop_para_wkr_basic_tst {
private final Xop_fxt fxt = new Xop_fxt(); String raw;
private final Xop_fxt fxt = new Xop_fxt(); String raw;
@Before public void init() {fxt.Reset(); fxt.Init_para_y_();}
@After public void teardown() {fxt.Init_para_n_();}
@Test public void Nl_0() {
@@ -569,14 +569,6 @@ public class Xop_para_wkr_basic_tst {
, "<h2>b</h2>"
, ""
));
fxt.Test_parse_page_wiki(raw
, fxt.tkn_para_bgn_para_(0) // x0: <bos> -> <p> 1=blank
, fxt.tkn_txt_(0, 1), fxt.tkn_para_end_para_(2) // t2/x1: a\n -> a\n</p> 1=bgn 2=blank
, fxt.tkn_hdr_(1, 7, 2).Subs_
( fxt.tkn_txt_(4, 5)
)
, fxt.tkn_para_blank_(7) // NOTE: this is redundant, but will not output to html; DATE:2013-02-03
);
}
@Test public void Hdr_2() {
raw = String_.Concat_lines_nl_skip_last
@@ -591,15 +583,6 @@ public class Xop_para_wkr_basic_tst {
, "<h2>b</h2>"
, ""
));
fxt.Test_parse_page_wiki(raw
, fxt.tkn_para_bgn_para_(0) // x0: <bos> -> <p> 1=blank
, fxt.tkn_txt_(0, 1), fxt.tkn_para_blank_(2)
, fxt.tkn_para_end_para_(3)
, fxt.tkn_hdr_(2, 8, 2).Subs_
( fxt.tkn_txt_(5, 6)
)
, fxt.tkn_para_blank_(8)
);
}
@Test public void Hdr_list() {
raw = String_.Concat_lines_nl_skip_last
@@ -614,17 +597,6 @@ public class Xop_para_wkr_basic_tst {
, " </li>"
, "</ul>"
));
fxt.Test_parse_page_wiki(raw
, fxt.tkn_para_blank_(0), fxt.tkn_para_blank_(1)
, fxt.tkn_hdr_(0, 5, 2).Subs_
( fxt.tkn_txt_(2, 3)
)
, fxt.tkn_para_blank_(6)
, fxt.tkn_list_bgn_(5, 7, Xop_list_tkn_.List_itmTyp_ul)
, fxt.tkn_txt_(7, 8)
, fxt.tkn_list_end_(8)
, fxt.tkn_para_blank_(8)
);
}
@Test public void Hdr_list_multi() {
raw = String_.Concat_lines_nl_skip_last
@@ -644,19 +616,6 @@ public class Xop_para_wkr_basic_tst {
, " </li>"
, "</ul>"
));
fxt.Test_parse_page_wiki(raw
, fxt.tkn_para_blank_(0), fxt.tkn_para_blank_(1)
, fxt.tkn_hdr_(0, 7, 2).Subs_
( fxt.tkn_txt_(2, 3)
)
, fxt.tkn_para_blank_(8)
, fxt.tkn_list_bgn_(7, 9, Xop_list_tkn_.List_itmTyp_ul)
, fxt.tkn_txt_(9, 10), fxt.tkn_para_blank_(11)
, fxt.tkn_list_end_(10)
, fxt.tkn_list_bgn_(10, 12, Xop_list_tkn_.List_itmTyp_ul)
, fxt.tkn_txt_(12, 13)
, fxt.tkn_list_end_(13), fxt.tkn_para_blank_(13)
);
}
@Test public void Para_hdr() {
raw = String_.Concat_lines_nl_skip_last

View File

@@ -303,7 +303,7 @@ public class Xop_tblw_wkr implements Xop_ctx_wkr {
ctx.Subs_add_and_stack_tblw(root, prv_tkn, new_tkn);
if (atrs_bgn > Xop_tblw_wkr.Atrs_ignore_check) {
new_tkn.Atrs_rng_set(atrs_bgn, atrs_end);
if (ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki) {
if (ctx.Parse_tid() == Xop_parser_tid_.Tid__wtxt) {
Mwh_atr_itm[] atrs = ctx.App().Parser_mgr().Xnde__parse_atrs_for_tblw(src, atrs_bgn, atrs_end);
new_tkn.Atrs_ary_as_tblw_(atrs);
}
@@ -488,7 +488,7 @@ public class Xop_tblw_wkr implements Xop_ctx_wkr {
if (prv_tblw.Tkn_tid() == Xop_tkn_itm_.Tid_tblw_tr) // NOTE: if "|-" gobble all trailing dashes; REF: Parser.php!doTableStuff; $line = preg_replace( '#^\|-+#', '', $line ); DATE:2013-06-21
atrs_bgn = Bry_find_.Find_fwd_while(src, atrs_bgn, src.length, Byte_ascii.Dash);
prv_tblw.Atrs_rng_set(atrs_bgn, atrs_end);
if (ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki && atrs_bgn != -1) {
if (ctx.Parse_tid() == Xop_parser_tid_.Tid__wtxt && atrs_bgn != -1) {
Mwh_atr_itm[] atrs = ctx.App().Parser_mgr().Xnde__parse_atrs_for_tblw(src, atrs_bgn, atrs_end);
prv_tblw.Atrs_ary_as_tblw_(atrs);
}

View File

@@ -526,15 +526,6 @@ public class Xop_tblw_wkr__basic_tst {
, "</table>"
, ""
));
fxt.Test_parse_page_wiki("{|\n==b==\n|}"
, fxt.tkn_tblw_tb_(0, 8).Subs_
( fxt.tkn_hdr_(2, 8, 2).Subs_
( fxt.tkn_txt_(5, 6)
)
, fxt.tkn_para_blank_(9)
, fxt.tkn_tblw_tr_(8, 8).Subs_
( fxt.tkn_tblw_td_( 8, 8))
));
}
@Test public void Auto_create_table() {// PURPOSE: <td> should create table; EX:w:Hatfield-McCoy_feud; DATE:20121226
fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last

View File

@@ -76,7 +76,7 @@ public class Xot_defn_tmpl implements Xot_defn {
if (!onlyinclude_parsed) {
onlyinclude_parsed = true;
byte[] new_data = Extract_onlyinclude(data_raw, wiki.Utl__bfr_mkr());
Xop_ctx new_ctx = Xop_ctx.new_sub_(wiki, ctx);
Xop_ctx new_ctx = Xop_ctx.New__sub(wiki, ctx, page); // COMMENT:changed from ctx.Page() to page; DATE:2016-07-11
Xot_defn_tmpl tmpl = wiki.Parser_mgr().Main().Parse_text_to_defn_obj(new_ctx, new_ctx.Tkn_mkr(), wiki.Ns_mgr().Ns_template(), Bry_.Empty, new_data);
tmpl.Root().Tmpl_compile(new_ctx, new_data, Xot_compile_data.Null);
data_raw = new_data;

View File

@@ -48,7 +48,6 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
val.Subs_get(j).Tmpl_compile(ctx, src, prep_data);
}
}
private static final Xol_func_itm finder = new Xol_func_itm();
@Override public boolean Tmpl_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Bry_bfr bfr) { // this="{{t|{{{0}}}}}" caller="{{t|1}}"
boolean rv = false;
Xot_defn defn = tmpl_defn; Xowe_wiki wiki = ctx.Wiki(); Xol_lang_itm lang = wiki.Lang();
@@ -101,14 +100,12 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
if (ns_eval != null && !template_prefix_found) // do not transclude ns if Template prefix seen earlier; EX: {{Template:Wikipedia:A}} should not transclude "Wikipedia:A"; DATE:2013-04-03
return SubEval(ctx, wiki, bfr, name_ary, caller, src);
int finder_tid, finder_colon_pos, finder_subst_end;
synchronized (finder) {
lang.Func_regy().Find_defn(finder, name_ary, name_bgn, name_ary_len);
defn = finder.Func();
finder_tid = finder.Tid();
finder_colon_pos = finder.Colon_pos();
finder_subst_end = finder.Subst_end();
}
Xol_func_itm finder = new Xol_func_itm(); // TS.MEM: DATE:2016-07-12
lang.Func_regy().Find_defn(finder, name_ary, name_bgn, name_ary_len);
defn = finder.Func();
int finder_tid = finder.Tid();
int finder_colon_pos = finder.Colon_pos();
int finder_subst_end = finder.Subst_end();
int colon_pos = -1;
switch (finder_tid) {
@@ -283,7 +280,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
prepend_mgr.End(ctx, bfr, rslt_bfr.Bfr(), rslt_bfr.Len(), Bool_.Y);
if (name_had_subst) { // current invk had "subst:"; parse incoming invk again to remove effects of subst; PAGE:pt.w:Argentina DATE:2014-09-24
byte[] tmp_src = rslt_bfr.To_bry_and_clear();
rslt_bfr.Add(wiki.Parser_mgr().Main().Parse_text_to_wtxt(tmp_src)); // this could be cleaner / more optimized
rslt_bfr.Add(wiki.Parser_mgr().Main().Expand_tmpl(tmp_src)); // this could be cleaner / more optimized
}
if (Cache_enabled) {
byte[] rslt_val = rslt_bfr.To_bry_and_clear();

View File

@@ -52,7 +52,6 @@ public class Xot_invk_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
invk.Args_add(ctx, nde);
return true;
}
private static final Xol_func_itm finder = new Xol_func_itm();
private static void AddNameArg(Xop_ctx ctx, byte[] src, Xot_invk_tkn invk, Arg_nde_tkn nde) {
// make valTkn into a keyTkn; note that argBldr will only generate a valTkn
Arg_itm_tkn key_tkn = nde.Val_tkn(), val_tkn = nde.Key_tkn();
@@ -62,15 +61,14 @@ public class Xot_invk_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
if (key_tkn.Itm_static() != Bool_.Y_byte) return; // dynamic tkn; can't identify func/name
int colon_pos = -1, txt_bgn = key_tkn.Dat_bgn(), txt_end = key_tkn.Dat_end();
Xot_defn finder_func; byte finder_tid; int finder_colon_pos, finder_subst_bgn, finder_subst_end;;
synchronized (finder) {
ctx.Wiki().Lang().Func_regy().Find_defn(finder, src, txt_bgn, txt_end);
finder_func = finder.Func();
finder_tid = finder.Tid();
finder_colon_pos = finder.Colon_pos();
finder_subst_bgn = finder.Subst_bgn();
finder_subst_end = finder.Subst_end();
}
Xol_func_itm finder = new Xol_func_itm(); // TS.MEM: DATE:2016-07-12
ctx.Wiki().Lang().Func_regy().Find_defn(finder, src, txt_bgn, txt_end);
Xot_defn finder_func = finder.Func();
byte finder_tid = finder.Tid();
int finder_colon_pos = finder.Colon_pos();
int finder_subst_bgn = finder.Subst_bgn();
int finder_subst_end = finder.Subst_end();
switch (finder_tid) {
case Xot_defn_.Tid_func: // func
@@ -80,7 +78,7 @@ public class Xot_invk_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
case Xot_defn_.Tid_safesubst:
int subst_bgn = finder_subst_bgn, subst_end = finder_subst_end;
invk.Tmpl_subst_props_(finder_tid, subst_bgn, subst_end);
if ((ctx.Parse_tid() == Xop_parser_.Parse_tid_tmpl && finder_tid == Xot_defn_.Tid_subst) // NOTE: if subst, but in tmpl stage, do not actually subst; PAGE:en.w:Unreferenced; DATE:2013-01-31
if ((ctx.Parse_tid() == Xop_parser_tid_.Tid__defn && finder_tid == Xot_defn_.Tid_subst) // NOTE: if subst, but in tmpl stage, do not actually subst; PAGE:en.w:Unreferenced; DATE:2013-01-31
|| ctx.Page().Ttl().Ns().Id_is_tmpl()) { // also, if on tmpl page, never evaluate (questionable, but seems to be needed)
}
else {

View File

@@ -54,7 +54,7 @@ public class Xot_tmpl_wtr {
int xnde_tag_id = xnde.Tag().Id();
switch (xnde_tag_id) {
case Xop_xnde_tag_.Tid__onlyinclude: {
// NOTE: originally "if (ctx.Parse_tid() == Xop_parser_.Parse_tid_page_tmpl) {" but if not needed; Xot_tmpl_wtr should not be called for tmpls and <oi> should not make it to page_wiki
// NOTE: originally "if (ctx.Parse_tid() == Xop_parser_tid_.Tid__tmpl) {" but if not needed; Xot_tmpl_wtr should not be called for tmpls and <oi> should not make it to page_wiki
Bry_bfr tmp_bfr = Bry_bfr_.New();
ctx.Only_include_evaluate_(true);
xnde.Tmpl_evaluate(ctx, src, Xot_invk_temp.Page_is_caller, tmp_bfr);

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.uniqs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.core.btries.*;
public class Xop_uniq_mgr { // REF.MW:/parser/StripState.php
private final Btrie_slim_mgr general_trie = Btrie_slim_mgr.cs();
private final Btrie_slim_mgr general_trie = Btrie_slim_mgr.cs(); private final Btrie_rv trv = new Btrie_rv();
private final Bry_bfr key_bfr = Bry_bfr_.New_w_size(32);
private int idx = -1;
public void Clear() {idx = -1; general_trie.Clear();}
@@ -40,12 +40,12 @@ public class Xop_uniq_mgr { // REF.MW:/parser/StripState.php
while (true) {
boolean is_last = pos == src_len;
byte b = is_last ? Byte_ascii.Null : src[pos];
Object o = trie.Match_bgn_w_byte(b, src, pos, src_len);
Object o = trie.Match_at_w_b0(trv, b, src, pos, src_len);
if (o == null)
++pos;
else {
byte[] val = (byte[])o;
int new_pos = trie.Match_pos(); // NOTE: since trie is reused, must capture pos here
int new_pos = trv.Pos(); // NOTE: since trie is reused, must capture pos here
val = Parse(Bry_bfr_.New(), trie, val);
// val = gplx.xowa.parsers.xndes.Xop_xnde_tkn.Hack_ctx.Wiki().Parser_mgr().Main().Parse_text_to_html(gplx.xowa.parsers.xndes.Xop_xnde_tkn.Hack_ctx, val); // CHART
bfr.Add_mid(src, mark_bgn, pos);

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import org.junit.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.langs.vnts.converts.*;
public class Vnt_convert_lang__syntax__tst { // REF: https://www.mediawiki.org/wiki/Writing_systems/Syntax
private final Vnt_convert_lang_fxt fxt = new Vnt_convert_lang_fxt();
private final Vnt_convert_lang_fxt fxt = new Vnt_convert_lang_fxt();
@Test public void Bidi() {
String text = "-{zh-hans:a;zh-hant:b}-";
fxt.Test_parse_many(text, "a", "zh-hans", "zh-cn", "zh-sg", "zh");
@@ -81,40 +81,3 @@ public class Vnt_convert_lang__syntax__tst { // REF: https://www.mediawiki.org/w
@Test public void Descrip__undi() {fxt.Test_parse("-{D|cn_k=>zh-cn:cn_v;hk_k=>zh-hk:hk_v}-", "cn_k⇒ZH-CN:cn_v;hk_k⇒ZH-HK:hk_v;");}
@Test public void Descrip__mixd() {fxt.Test_parse("-{D|zh-tw:tw_v;cn_k=>zh-cn:cn_v;hk_k=>zh-hk:hk_v;zh-mo:mo_v}-", "ZH-TW:tw_v;ZH-MO:mo_v;cn_k⇒ZH-CN:cn_v;hk_k⇒ZH-HK:hk_v;");}
}
class Vnt_convert_lang_fxt {
private final Vnt_convert_lang converter_lang;
private final Xol_convert_mgr convert_mgr = new Xol_convert_mgr();
private final Xol_vnt_regy vnt_regy = Xol_vnt_regy_fxt.new_chinese();
private Xol_vnt_itm vnt_itm;
public Vnt_convert_lang_fxt() {
converter_lang = new Vnt_convert_lang(convert_mgr, vnt_regy);
this.Clear();
}
public void Clear() {
convert_mgr.Init(vnt_regy);
Init_cur("zh-cn");
}
public Vnt_convert_lang_fxt Init_cur(String vnt) {
byte[] cur_vnt = Bry_.new_a7(vnt);
this.vnt_itm = vnt_regy.Get_by(cur_vnt);
return this;
}
public void Test_parse(String raw, String expd) {
Tfds.Eq_str(expd, String_.new_u8(converter_lang.Parse_page(vnt_itm, -1, Bry_.new_u8(raw))));
}
public void Test_parse_many(String raw, String expd, String... vnts) {
int len = vnts.length;
for (int i = 0; i < len; ++i) {
String vnt_key = vnts[i];
Init_cur(vnt_key);
Xol_vnt_itm vnt = vnt_regy.Get_by(Bry_.new_a7(vnt_key));
Tfds.Eq_str(expd, String_.new_u8(converter_lang.Parse_page(vnt, -1, Bry_.new_u8(raw))), vnt_key);
}
}
public void Test_parse_title(String raw, String expd_title, String expd_text, String vnt_key) {
Init_cur(vnt_key);
Xol_vnt_itm vnt = vnt_regy.Get_by(Bry_.new_a7(vnt_key));
Tfds.Eq_str(expd_text, String_.new_u8(converter_lang.Parse_page(vnt, -1, Bry_.new_u8(raw))), vnt_key);
Tfds.Eq_str(expd_title, converter_lang.Converted_title());
}
}

View File

@@ -0,0 +1,56 @@
/*
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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.parsers.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.xowa.langs.vnts.*; import gplx.xowa.langs.vnts.converts.*;
class Vnt_convert_lang_fxt {
private final Vnt_convert_lang converter_lang;
private final Xol_convert_mgr convert_mgr = new Xol_convert_mgr();
private final Xol_vnt_regy vnt_regy = Xol_vnt_regy_fxt.new_chinese();
private Xol_vnt_itm vnt_itm;
public Vnt_convert_lang_fxt() {
converter_lang = new Vnt_convert_lang(convert_mgr, vnt_regy);
this.Clear();
}
public void Clear() {
convert_mgr.Init(vnt_regy);
Init_cur("zh-cn");
}
public Vnt_convert_lang_fxt Init_cur(String vnt) {
byte[] cur_vnt = Bry_.new_a7(vnt);
this.vnt_itm = vnt_regy.Get_by(cur_vnt);
return this;
}
public void Test_parse(String raw, String expd) {
Tfds.Eq_str(expd, String_.new_u8(converter_lang.Parse_page(vnt_itm, -1, Bry_.new_u8(raw))));
}
public void Test_parse_many(String raw, String expd, String... vnts) {
int len = vnts.length;
for (int i = 0; i < len; ++i) {
String vnt_key = vnts[i];
Init_cur(vnt_key);
Xol_vnt_itm vnt = vnt_regy.Get_by(Bry_.new_a7(vnt_key));
Tfds.Eq_str(expd, String_.new_u8(converter_lang.Parse_page(vnt, -1, Bry_.new_u8(raw))), vnt_key);
}
}
public void Test_parse_title(String raw, String expd_title, String expd_text, String vnt_key) {
Init_cur(vnt_key);
Xol_vnt_itm vnt = vnt_regy.Get_by(Bry_.new_a7(vnt_key));
Tfds.Eq_str(expd_text, String_.new_u8(converter_lang.Parse_page(vnt, -1, Bry_.new_u8(raw))), vnt_key);
Tfds.Eq_str(expd_title, converter_lang.Converted_title());
}
}

View File

@@ -19,7 +19,8 @@ package gplx.xowa.parsers.vnts; import gplx.*; import gplx.xowa.*; import gplx.x
import gplx.core.btries.*;
import gplx.xowa.langs.vnts.*;
class Vnt_rule_parser implements gplx.core.brys.Bry_split_wkr {
private final Btrie_slim_mgr vnt_trie = Btrie_slim_mgr.ci_a7();
private final Btrie_slim_mgr vnt_trie = Btrie_slim_mgr.ci_a7();
private final Btrie_rv trv = new Btrie_rv();
private Vnt_rule_undi_mgr undis; private Vnt_rule_bidi_mgr bidis;
private int src_end; private byte[] rule_raw;
public byte[] Raw() {return rule_raw;}
@@ -66,10 +67,10 @@ class Vnt_rule_parser implements gplx.core.brys.Bry_split_wkr {
lang_bgn = Bry_find_.Find_fwd_while_ws(src, undi_end + 2, itm_end); // set lang_bgn after => and gobble up ws
undi_end = Bry_find_.Find_bwd__skip_ws(src, undi_end, undi_bgn); // trim ws from end of bd;
}
Object vnt_obj = vnt_trie.Match_bgn(src, lang_bgn, itm_end);
Object vnt_obj = vnt_trie.Match_at(trv, src, lang_bgn, itm_end);
if (vnt_obj == null)
return (itm_bgn == 0) ? Bry_split_.Rv__cancel : Bry_split_.Rv__extend; // if 1st item; cancel rest; otherwise, extend
int lang_end = vnt_trie.Match_pos();
int lang_end = trv.Pos();
int text_bgn = Bry_find_.Find_fwd_while_ws(src, lang_end, itm_end); if (src[text_bgn] != Byte_ascii.Colon) return Bry_split_.Rv__extend;
++text_bgn;
Xol_vnt_itm vnt_itm = (Xol_vnt_itm)vnt_obj;
@@ -93,5 +94,5 @@ class Vnt_rule_parser implements gplx.core.brys.Bry_split_wkr {
if (bfr.Len_gt_0()) bfr.Add_byte_nl();
bidis.To_bry__dbg(bfr);
}
private static final byte[] Bry__bidi_dlm = Bry_.new_a7("=>");
private static final byte[] Bry__bidi_dlm = Bry_.new_a7("=>");
}

View File

@@ -18,6 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.xndes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.core.primitives.*; import gplx.core.btries.*; import gplx.xowa.parsers.htmls.*;
public class Xop_xatr_whitelist_mgr {
private final Hash_adp_bry grp_hash = Hash_adp_bry.cs();
private final Btrie_rv trv = new Btrie_rv();
public boolean Chk(int tag_id, byte[] src, Mwh_atr_itm xatr) {
byte[] key_bry = xatr.Key_bry();
byte[] chk_bry; int chk_bgn, chk_end;
@@ -32,13 +34,13 @@ public class Xop_xatr_whitelist_mgr {
chk_bgn = 0;
chk_end = key_bry.length;
}
Object o = key_trie.Match_bgn(chk_bry, chk_bgn, chk_end);
Object o = key_trie.Match_at(trv, chk_bry, chk_bgn, chk_end);
if (o == null) return false;// unknown atr_key; EX: <b unknown=1/>
Xop_xatr_whitelist_itm itm = (Xop_xatr_whitelist_itm)o;
byte itm_key_tid = itm.Key_tid();
xatr.Key_tid_(itm_key_tid);
boolean rv = itm.Tags()[tag_id] == 1 // is atr allowed for tag
&& (itm.Exact() ? key_trie.Match_pos() == chk_end : true) // if exact, check for exact; else always true
&& (itm.Exact() ? trv.Pos() == chk_end : true) // if exact, check for exact; else always true
;
switch (itm_key_tid) {
case Mwh_atr_itm_.Key_tid__style:
@@ -52,79 +54,78 @@ public class Xop_xatr_whitelist_mgr {
return rv;
}
public Xop_xatr_whitelist_mgr Ini() { // REF.MW:Sanitizer.php|setupAttributeWhitelist
Ini_grp("common" , null , "id", "class", "lang", "dir", "title", "style", "role");
Ini_grp("block" , "common" , "align");
Ini_grp("tablealign" , null , "align", "char", "charoff", "valign");
Ini_grp("tablecell" , null , "abbr", "axis", "headers", "scope", "rowspan", "colspan", "nowrap", "width", "height", "bgcolor");
Ini_grp("common" , null , "id", "class", "lang", "dir", "title", "style", "role");
Ini_grp("block" , "common" , "align");
Ini_grp("tablealign" , null , "align", "char", "charoff", "valign");
Ini_grp("tablecell" , null , "abbr", "axis", "headers", "scope", "rowspan", "colspan", "nowrap", "width", "height", "bgcolor");
Ini_nde(Xop_xnde_tag_.Tid__div , "block");
Ini_nde(Xop_xnde_tag_.Tid__center , "common");
Ini_nde(Xop_xnde_tag_.Tid__span , "block");
Ini_nde(Xop_xnde_tag_.Tid__h1 , "block");
Ini_nde(Xop_xnde_tag_.Tid__h2 , "block");
Ini_nde(Xop_xnde_tag_.Tid__h3 , "block");
Ini_nde(Xop_xnde_tag_.Tid__h4 , "block");
Ini_nde(Xop_xnde_tag_.Tid__h5 , "block");
Ini_nde(Xop_xnde_tag_.Tid__h6 , "block");
Ini_nde(Xop_xnde_tag_.Tid__em , "common");
Ini_nde(Xop_xnde_tag_.Tid__strong , "common");
Ini_nde(Xop_xnde_tag_.Tid__cite , "common");
Ini_nde(Xop_xnde_tag_.Tid__dfn , "common");
Ini_nde(Xop_xnde_tag_.Tid__code , "common");
Ini_nde(Xop_xnde_tag_.Tid__samp , "common");
Ini_nde(Xop_xnde_tag_.Tid__kbd , "common");
Ini_nde(Xop_xnde_tag_.Tid__var , "common");
Ini_nde(Xop_xnde_tag_.Tid__abbr , "common");
Ini_nde(Xop_xnde_tag_.Tid__blockquote , "common", "cite");
Ini_nde(Xop_xnde_tag_.Tid__sub , "common");
Ini_nde(Xop_xnde_tag_.Tid__sup , "common");
Ini_nde(Xop_xnde_tag_.Tid__p , "block");
Ini_nde(Xop_xnde_tag_.Tid__br , "id", "class", "title", "style", "clear");
Ini_nde(Xop_xnde_tag_.Tid__pre , "common", "width");
Ini_nde(Xop_xnde_tag_.Tid__ins , "common", "cite", "datetime");
Ini_nde(Xop_xnde_tag_.Tid__del , "common", "cite", "datetime");
Ini_nde(Xop_xnde_tag_.Tid__ul , "common", "type");
Ini_nde(Xop_xnde_tag_.Tid__ol , "common", "type", "start");
Ini_nde(Xop_xnde_tag_.Tid__li , "common", "type", "value");
Ini_nde(Xop_xnde_tag_.Tid__dl , "common");
Ini_nde(Xop_xnde_tag_.Tid__dd , "common");
Ini_nde(Xop_xnde_tag_.Tid__dt , "common");
Ini_nde(Xop_xnde_tag_.Tid__table , "common", "summary", "width", "border", "frame", "rules", "cellspacing", "cellpadding", "align", "bgcolor");
Ini_nde(Xop_xnde_tag_.Tid__caption , "common", "align");
Ini_nde(Xop_xnde_tag_.Tid__thead , "common", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__tfoot , "common", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__tbody , "common", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__colgroup , "common", "span", "width", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__col , "common", "span", "width", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__tr , "common", "bgcolor", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__td , "common", "tablecell", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__th , "common", "tablecell", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__a , "common", "href", "rel", "rev");
Ini_nde(Xop_xnde_tag_.Tid__img , "common", "alt", "src", "width", "height");
Ini_nde(Xop_xnde_tag_.Tid__tt , "common");
Ini_nde(Xop_xnde_tag_.Tid__b , "common");
Ini_nde(Xop_xnde_tag_.Tid__i , "common");
Ini_nde(Xop_xnde_tag_.Tid__big , "common");
Ini_nde(Xop_xnde_tag_.Tid__small , "common");
Ini_nde(Xop_xnde_tag_.Tid__strike , "common");
Ini_nde(Xop_xnde_tag_.Tid__s , "common");
Ini_nde(Xop_xnde_tag_.Tid__u , "common");
Ini_nde(Xop_xnde_tag_.Tid__font , "common", "size", "color", "face");
Ini_nde(Xop_xnde_tag_.Tid__hr , "common", "noshade", "size", "width");
Ini_nde(Xop_xnde_tag_.Tid__ruby , "common");
Ini_nde(Xop_xnde_tag_.Tid__rb , "common");
Ini_nde(Xop_xnde_tag_.Tid__rt , "common");
Ini_nde(Xop_xnde_tag_.Tid__rp , "common");
Ini_nde(Xop_xnde_tag_.Tid__math , "class", "style", "id", "title");
Ini_nde(Xop_xnde_tag_.Tid__time , "class", "datetime");
Ini_nde(Xop_xnde_tag_.Tid__bdi , "common");
Ini_nde(Xop_xnde_tag_.Tid__data , "common", "value");
Ini_nde(Xop_xnde_tag_.Tid__mark , "common");
Ini_nde(Xop_xnde_tag_.Tid__q , "common");
Ini_nde(Xop_xnde_tag_.Tid__div , "block");
Ini_nde(Xop_xnde_tag_.Tid__center , "common");
Ini_nde(Xop_xnde_tag_.Tid__span , "block");
Ini_nde(Xop_xnde_tag_.Tid__h1 , "block");
Ini_nde(Xop_xnde_tag_.Tid__h2 , "block");
Ini_nde(Xop_xnde_tag_.Tid__h3 , "block");
Ini_nde(Xop_xnde_tag_.Tid__h4 , "block");
Ini_nde(Xop_xnde_tag_.Tid__h5 , "block");
Ini_nde(Xop_xnde_tag_.Tid__h6 , "block");
Ini_nde(Xop_xnde_tag_.Tid__em , "common");
Ini_nde(Xop_xnde_tag_.Tid__strong , "common");
Ini_nde(Xop_xnde_tag_.Tid__cite , "common");
Ini_nde(Xop_xnde_tag_.Tid__dfn , "common");
Ini_nde(Xop_xnde_tag_.Tid__code , "common");
Ini_nde(Xop_xnde_tag_.Tid__samp , "common");
Ini_nde(Xop_xnde_tag_.Tid__kbd , "common");
Ini_nde(Xop_xnde_tag_.Tid__var , "common");
Ini_nde(Xop_xnde_tag_.Tid__abbr , "common");
Ini_nde(Xop_xnde_tag_.Tid__blockquote , "common", "cite");
Ini_nde(Xop_xnde_tag_.Tid__sub , "common");
Ini_nde(Xop_xnde_tag_.Tid__sup , "common");
Ini_nde(Xop_xnde_tag_.Tid__p , "block");
Ini_nde(Xop_xnde_tag_.Tid__br , "id", "class", "title", "style", "clear");
Ini_nde(Xop_xnde_tag_.Tid__pre , "common", "width");
Ini_nde(Xop_xnde_tag_.Tid__ins , "common", "cite", "datetime");
Ini_nde(Xop_xnde_tag_.Tid__del , "common", "cite", "datetime");
Ini_nde(Xop_xnde_tag_.Tid__ul , "common", "type");
Ini_nde(Xop_xnde_tag_.Tid__ol , "common", "type", "start");
Ini_nde(Xop_xnde_tag_.Tid__li , "common", "type", "value");
Ini_nde(Xop_xnde_tag_.Tid__dl , "common");
Ini_nde(Xop_xnde_tag_.Tid__dd , "common");
Ini_nde(Xop_xnde_tag_.Tid__dt , "common");
Ini_nde(Xop_xnde_tag_.Tid__table , "common", "summary", "width", "border", "frame", "rules", "cellspacing", "cellpadding", "align", "bgcolor");
Ini_nde(Xop_xnde_tag_.Tid__caption , "common", "align");
Ini_nde(Xop_xnde_tag_.Tid__thead , "common", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__tfoot , "common", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__tbody , "common", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__colgroup , "common", "span", "width", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__col , "common", "span", "width", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__tr , "common", "bgcolor", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__td , "common", "tablecell", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__th , "common", "tablecell", "tablealign");
Ini_nde(Xop_xnde_tag_.Tid__a , "common", "href", "rel", "rev");
Ini_nde(Xop_xnde_tag_.Tid__img , "common", "alt", "src", "width", "height");
Ini_nde(Xop_xnde_tag_.Tid__tt , "common");
Ini_nde(Xop_xnde_tag_.Tid__b , "common");
Ini_nde(Xop_xnde_tag_.Tid__i , "common");
Ini_nde(Xop_xnde_tag_.Tid__big , "common");
Ini_nde(Xop_xnde_tag_.Tid__small , "common");
Ini_nde(Xop_xnde_tag_.Tid__strike , "common");
Ini_nde(Xop_xnde_tag_.Tid__s , "common");
Ini_nde(Xop_xnde_tag_.Tid__u , "common");
Ini_nde(Xop_xnde_tag_.Tid__font , "common", "size", "color", "face");
Ini_nde(Xop_xnde_tag_.Tid__hr , "common", "noshade", "size", "width");
Ini_nde(Xop_xnde_tag_.Tid__ruby , "common");
Ini_nde(Xop_xnde_tag_.Tid__rb , "common");
Ini_nde(Xop_xnde_tag_.Tid__rt , "common");
Ini_nde(Xop_xnde_tag_.Tid__rp , "common");
Ini_nde(Xop_xnde_tag_.Tid__math , "class", "style", "id", "title");
Ini_nde(Xop_xnde_tag_.Tid__time , "class", "datetime");
Ini_nde(Xop_xnde_tag_.Tid__bdi , "common");
Ini_nde(Xop_xnde_tag_.Tid__data , "common", "value");
Ini_nde(Xop_xnde_tag_.Tid__mark , "common");
Ini_nde(Xop_xnde_tag_.Tid__q , "common");
Ini_all_loose("data");
return this;
}
private Hash_adp_bry grp_hash = Hash_adp_bry.cs();
private void Ini_grp(String key_str, String base_grp, String... cur_itms) {
byte[][] itms = Bry_.Ary(cur_itms);
if (base_grp != null)
@@ -196,11 +197,11 @@ public class Xop_xatr_whitelist_mgr {
}
int pos = chk_bgn;
while (pos < chk_end) {
Object o = style_trie.Match_bgn(chk_bry, pos, chk_end);
Object o = style_trie.Match_at(trv, chk_bry, pos, chk_end);
if (o == null)
++pos;
else {
pos = style_trie.Match_pos();
pos = trv.Pos();
byte style_tid = ((Byte_obj_val)o).Val();
switch (style_tid) {
case Style_expression:
@@ -243,7 +244,7 @@ public class Xop_xatr_whitelist_mgr {
return Byte_ascii.Null;
}
static final byte Style_expression = 0, Style_filter = 1, Style_accelerator = 2, Style_url = 3, Style_urls = 4, Style_comment = 5, Style_image = 6, Style_image_set = 7;
private static Btrie_slim_mgr style_trie = Btrie_slim_mgr.ci_a7() // NOTE:ci.ascii:Javascript
private static final Btrie_slim_mgr style_trie = Btrie_slim_mgr.ci_a7() // NOTE:ci.ascii:Javascript
.Add_str_byte("expression" , Style_expression)
.Add_str_byte("filter" , Style_filter)
.Add_str_byte("accelerator" , Style_accelerator)

View File

@@ -26,10 +26,10 @@ public class Xop_xnde_tag_regy {
public Btrie_slim_mgr Get_trie(int i) {
if (init_needed) Init_by_hash(null); // TEST:
switch (i) {
case Xop_parser_.Parse_tid_tmpl: return trie_tmpl;
case Xop_parser_.Parse_tid_page_tmpl: return trie_wtxt_tmpl;
case Xop_parser_.Parse_tid_page_wiki: return trie_wtxt_main;
case Xop_parser_.Parse_tid_null: default: return trie_wtxt_tmpl; // TODO_OLD: should throw Err_.new_unhandled(i);
case Xop_parser_tid_.Tid__defn: return trie_tmpl;
case Xop_parser_tid_.Tid__tmpl: return trie_wtxt_tmpl;
case Xop_parser_tid_.Tid__wtxt: return trie_wtxt_main;
case Xop_parser_tid_.Tid__null: default: return trie_wtxt_tmpl; // TODO_OLD: should throw Err_.new_unhandled(i);
}
}
public void Init_by_meta(Hash_adp_bry xtn_hash) {Init_by_hash(xtn_hash);}

View File

@@ -108,7 +108,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
break;
}
if (tag_obj == null) { // not a known xml tag; EX: "<abcd>"; "if 5 < 7 then"
if (ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki) {
if (ctx.Parse_tid() == Xop_parser_tid_.Tid__wtxt) {
if (ctx_cur_tid_is_tblw_atr_owner) // unknown_tag is occurring inside tblw element (EX: {| style='margin:1em<f'); just add to txt tkn
return ctx.Lxr_make_txt_(cur_pos);
else { // unknown_tag is occurring anywhere else; escape < to &lt; and resume from character just after it;
@@ -150,7 +150,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
}
else { // is a <nowiki> skip to </nowiki>
if ( i == end_name_pos
&& ctx.Parse_tid() == Xop_parser_.Parse_tid_tmpl
&& ctx.Parse_tid() == Xop_parser_tid_.Tid__defn
&& Bry_.Eq(atr_parser.Bry_obj().Val(), Xop_xnde_tag_.Tag__includeonly.Name_bry())
) {
pre2_hack = true;
@@ -175,7 +175,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
boolean force_xtn_for_nowiki = false;
int end_pos = gt_pos + 1;
switch (ctx.Parse_tid()) { // NOTE: special logic to handle <include>; SEE: NOTE_1 below
case Xop_parser_.Parse_tid_page_wiki: // NOTE: ignore if (a) wiki and (b) <noinclude> or <onlyinclude>
case Xop_parser_tid_.Tid__wtxt: // NOTE: ignore if (a) wiki and (b) <noinclude> or <onlyinclude>
switch (tag.Id()) {
case Xop_xnde_tag_.Tid__noinclude:
case Xop_xnde_tag_.Tid__onlyinclude:
@@ -187,7 +187,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
break;
}
break;
case Xop_parser_.Parse_tid_tmpl: // NOTE: ignore if (a) tmpl and (b) <includeonly>
case Xop_parser_tid_.Tid__defn: // NOTE: ignore if (a) tmpl and (b) <includeonly>
switch (tag.Id()) {
case Xop_xnde_tag_.Tid__includeonly:
ctx.Subs_add(root, tkn_mkr.Ignore(bgn_pos, end_pos, Xop_ignore_tkn.Ignore_tid_include_tmpl));
@@ -203,7 +203,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
break;
}
break;
case Xop_parser_.Parse_tid_page_tmpl: // NOTE: added late; SEE:comment test for "a <!-<noinclude></noinclude>- b -->c"
case Xop_parser_tid_.Tid__tmpl: // NOTE: added late; SEE:comment test for "a <!-<noinclude></noinclude>- b -->c"
switch (tag.Id()) {
case Xop_xnde_tag_.Tid__noinclude:
ctx.Subs_add(root, tkn_mkr.Ignore(bgn_pos, end_pos, Xop_ignore_tkn.Ignore_tid_include_tmpl));
@@ -301,11 +301,11 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
break;
}
Mwh_atr_itm[] atrs = null;
if (ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki) {
if (ctx.Parse_tid() == Xop_parser_tid_.Tid__wtxt) {
atrs = ctx.App().Parser_mgr().Xnde__parse_atrs(src, atrs_bgn, atrs_end);
}
if (( ( tag.Xtn()
&& ( ctx.Parse_tid() != Xop_parser_.Parse_tid_tmpl // do not gobble up rest if in tmpl; handle <poem>{{{1}}}</poem>; DATE:2014-03-03
&& ( ctx.Parse_tid() != Xop_parser_tid_.Tid__defn // do not gobble up rest if in tmpl; handle <poem>{{{1}}}</poem>; DATE:2014-03-03
|| tag.Xtn_skips_template_args() // ignore above if tag specifically skips template args; EX: <pre>; DATE:2014-04-10
)
)
@@ -595,7 +595,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
xnde.Subs_add(tkn_mkr.Txt(open_end, close_bgn));
}
switch (ctx.Parse_tid()) {
case Xop_parser_.Parse_tid_page_tmpl: {
case Xop_parser_tid_.Tid__tmpl: {
Xox_xnde xnde_xtn = null;
switch (tag.Id()) {
case Xop_xnde_tag_.Tid__xowa_cmd: xnde_xtn = tkn_mkr.Xnde__xowa_cmd(); break;
@@ -606,7 +606,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
}
break;
}
case Xop_parser_.Parse_tid_page_wiki: {
case Xop_parser_tid_.Tid__wtxt: {
Xox_xnde xnde_xtn = null;
int tag_id = tag.Id();
boolean escaped = false;