@Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) { byte[] user_name = Eval_argx(ctx, src, caller, self); byte[] when_m = Bry_.Empty, when_f = Bry_.Empty, when_u = Bry_.Empty; int self_args_len = self.Args_len(); if (self_args_len == 0) return; // per MW: EX: {{gender:name}} -> "" else { if (self_args_len > 0) { when_m = when_u = Pf_func_.Eval_arg_or_empty( ctx, src, caller, self, self_args_len, 0); // default when_u to when_m if (self_args_len > 1) { when_f = Pf_func_.Eval_arg_or_empty(ctx, src, caller, self, self_args_len, 1); if (self_args_len > 2) { when_u = Pf_func_.Eval_arg_or_empty(ctx, src, caller, self, self_args_len, 2); } } } } if (self_args_len == 1) { bfr.Add(when_m); return; } // per MW: EX: {{gender:name|a}} -> "a" int gender = Get_gender(ctx.App().User(), user_name); Xol_lang_itm lang = ctx.Page().Lang(); bfr.Add(lang.Gender().Gender_eval(gender, when_m, when_f, when_u)); }
public byte[] Bld(Xowe_wiki cur_wiki, Xoae_page page, Xow_popup_itm popup_itm, Bry_bfr wrdx_bfr) { if (output_js_clean) cur_wiki.Html_mgr().Js_cleaner().Clean_bfr(wiki, page.Ttl(), wrdx_bfr, 0); if (output_tidy) cur_wiki.Html_mgr().Tidy_mgr().Exec_tidy(wrdx_bfr, Bool_.Y, page.Url_bry_safe()); byte[] hdom_bry = wrdx_bfr.To_bry_and_clear(); String page_url = wrdx_bfr.Add(page.Wiki().Domain_bry()) .Add(gplx.xowa.htmls.hrefs.Xoh_href_.Bry__wiki) .Add( gplx.langs.htmls.encoders.Gfo_url_encoder_.Href.Encode( page.Ttl() .Full_db())) // NOTE: was page.Url().Raw(), but that doesn't work for // Special:Search; PAGE:en.w:Earth and "Quotations"; // DATE:2014-06-29 .To_str_and_clear(); fmtr_popup.Bld_bfr_many( wrdx_bfr, hdom_bry, wiki.Lang().Dir_ltr_bry(), page_url, String_.new_u8(page.Ttl().Full_txt_w_ttl_case()), popup_itm.Popup_id(), Xow_popup_html_bldr_.Bld_fmtr_wiki( fmtr_wiki, wrdx_bfr, cur_wiki.Domain_bry(), page.Wiki().Domain_bry()) // NOTE: use cur_wiki, not page_wiki; DATE:2014-06-28 , gplx.core.ios.Io_size_.To_str(page.Db().Text().Text_bry().length), page.Db().Page().Modified_on().XtoStr_fmt_yyyy_MM_dd_HH_mm_ss(), Xow_popup_html_bldr_.Bld_fmtr_viewed(fmtr_viewed, app, wiki, wrdx_bfr, page.Ttl()), app.Fsys_mgr().Root_dir().To_http_file_bry()); return wrdx_bfr.To_bry_and_clear(); }
public void To_bfr(Bry_bfr bfr) { bfr.Add_int_variable(uid).Add_byte_pipe(); bfr.Add_int_variable(level).Add_byte_pipe(); bfr.Add(anchor).Add_byte_pipe(); bfr.Add(header).Add_byte_pipe(); bfr.Add_safe(content).Add_byte_nl(); }
public void Special__gen(Xow_wiki wikii, Xoa_page pagei, Xoa_url url, Xoa_ttl ttl) { Xowe_wiki wiki = (Xowe_wiki) wikii; Xoae_page page = (Xoae_page) pagei; Xoa_app app = wiki.App(); Dbui_tbl_itm__bmk ui_tbl = Dbui_tbl_itm__bmk.get_or_new(app, app.User().User_db_mgr().Bmk_mgr().Tbl__itm()); page.Html_data().Head_mgr().Itm__dbui().Init(app).Enabled_y_(); Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_m001(); ui_tbl.Select(bfr, Xoud_bmk_mgr.Owner_root); page.Db().Html().Html_bry_(bfr.To_bry_and_rls()); }
public boolean Expr(Scrib_proc_args args, Scrib_proc_rslt rslt) { byte[] expr_bry = args.Xstr_bry_or_null( 0); // NOTE: some modules will pass in an int; PAGE:en.w:531_BC DATE:2016-04-29 Bry_bfr tmp_bfr = core.Wiki().Utl__bfr_mkr().Get_b128(); Pfunc_expr.Evaluate(tmp_bfr, core.Ctx(), expr_bry); String expr_rslt = tmp_bfr.To_str_and_rls(); return rslt.Init_obj( expr_rslt); // NOTE: always return rslt; don't throw error even if expr is invalid; // EX:mw.ParserFuntion.expr('fail'); PAGE:es.w:Freer_(Texas) DATE:2015-07-28 }
private int Import_url_chk( byte[] rel_url_prefix, byte[] src, int src_len, int old_pos, int find_bgn, byte[] url_raw, Bry_bfr bfr) { if (find_bgn < Bry_import_len) return Bry_find_.Not_found; if (!Bry_.Match(src, find_bgn - Bry_import_len, find_bgn, Bry_import)) return Bry_find_.Not_found; byte[] css_url = url_raw; int css_url_len = css_url.length; if (css_url_len > 0 && css_url[0] == Byte_ascii .Slash) { // css_url starts with "/"; EX: "/page" or "//site/page" DATE:2014-02-03 if (css_url_len > 1 && css_url[1] != Byte_ascii.Slash) // skip if css_url starts with "//"; EX: "//site/page" css_url = Bry_.Add(rel_url_prefix, css_url); // "/w/a.css" -> "//en.wikipedia.org/w/a.css" } css_url = Bry_.Replace( css_url, Byte_ascii.Space, Byte_ascii .Underline); // NOTE: must replace spaces with underlines else download will fail; // EX:https://it.wikivoyage.org/w/index.php?title=MediaWiki:Container e // Infobox.css&action=raw&ctype=text/css; DATE:2015-03-08 byte[] css_src_bry = Import_url_build(stylesheet_prefix, rel_url_prefix, css_url); String css_src_str = String_.new_u8(css_src_bry); download_wkr.Download_xrg() .Prog_fmt_hdr_( usr_dlg.Log_many( GRP_KEY, "logo.download", "downloading import for '~{0}'", css_src_str)); byte[] css_trg_bry = download_wkr.Download_xrg().Exec_as_bry(css_src_str); if (css_trg_bry == null) { usr_dlg.Warn_many("", "", "could not import css: url=~{0}", css_src_str); return Bry_find_.Not_found; // css not found } bfr.Add_mid(src, old_pos, find_bgn - Bry_import_len).Add_byte_nl(); bfr.Add(Bry_comment_bgn).Add(css_url).Add(Bry_comment_end).Add_byte_nl(); if (Bry_find_.Find_fwd(css_url, Wikisource_dynimg_ttl) != -1) css_trg_bry = Bry_.Replace( css_trg_bry, Wikisource_dynimg_find, Wikisource_dynimg_repl); // FreedImg hack; // PAGE:en.s:Page:Notes_on_Osteology_of_Baptanodon._With_a_Description_of_a_New_Species.pdf/3 DATE:2014-09-06 bfr.Add(css_trg_bry).Add_byte_nl(); bfr.Add_byte_nl(); int semic_pos = Bry_find_.Find_fwd(src, Byte_ascii.Semic, find_bgn + url_raw.length, src_len); return semic_pos + Int_.Const_dlm_len; }
private void Write_body_pre( Bry_bfr bfr, Xoae_app app, Xowe_wiki wiki, Xoh_wtr_ctx hctx, byte[] data_raw, Bry_bfr tmp_bfr) { Xoh_html_wtr_escaper.Escape( app.Parser_amp_mgr(), tmp_bfr, data_raw, 0, data_raw.length, false, false); if (hctx.Mode_is_hdump()) bfr.Add(data_raw); else app.Html_mgr().Page_mgr().Content_code_fmtr().Bld_bfr_many(bfr, tmp_bfr); tmp_bfr.Clear(); }
public static byte[] Eval_arg_or( Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, int self_args_len, int i, byte[] or) { if (i >= self_args_len) return or; Arg_nde_tkn nde = self.Args_get_by_idx(i); Bry_bfr bfr = Bry_bfr_.New(); Eval_arg_or(bfr, ctx, src, caller, self, nde, or); return bfr.To_bry_and_clear_and_trim(); }
public static byte[] Eval_val_or( Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, int self_args_len, int i, byte[] or) { if (i >= self_args_len) return or; Bry_bfr bfr = Bry_bfr_.New(); Arg_nde_tkn nde = self.Args_get_by_idx(i); nde.Val_tkn().Tmpl_evaluate(ctx, src, caller, bfr); return bfr.To_bry_and_clear_and_trim(); }
public void Srl_save(Bry_bfr bfr) { byte[] bmk_bry = Bry_.Replace( Bry_.new_u8(bmk_pos), Byte_ascii.Pipe, Byte_ascii.Tilde); // replace | with ~; EX: "0|1|2" -> "0~1~2" bfr.Add(key).Add_byte_pipe().Add(bmk_bry).Add_byte_nl(); }
public byte[] List_to_str(byte[][] segs_ary) { int len = segs_ary.length; switch (len) { case 0: return Bry_.Empty; case 1: return segs_ary[0]; default: if (Msg_and == null) List_to_str_init(); int last_idx = len - 1; for (int i = 0; i < last_idx; i++) { if (i != 0) tmp_bfr.Add(Msg_comma_separator); tmp_bfr.Add(segs_ary[i]); } tmp_bfr.Add(Msg_and).Add(Msg_word_separator).Add(segs_ary[last_idx]); return tmp_bfr.To_bry_and_clear(); } }
public byte[] Img_phoneme(byte[] img_cls, byte[] td_height, byte[] glyph_esc, byte[] code) { byte[] code_esc = Html_utl.Escape_html_as_bry(temp_bfr, code); byte[] img_title = temp_bfr.Add(code_esc) .Add_byte_space() .Add_byte(Byte_ascii.Brack_bgn) .Add(glyph_esc) .Add_byte(Byte_ascii.Brack_end) .Xto_bry_and_clear(); // "~{code} [~{glyph}]" return Img(img_cls, td_height, glyph_esc, code_esc, img_title); }
public void Bfr_arg__add(Bry_bfr bfr) { if (jdoc == null) return; // TEST: wdoc doesn't have jdoc jdoc.Root_nde().Print_as_json(tmp_bfr, 0); fmtr.Bld_bfr_many( bfr, toc_data.Href(), toc_data.Text(), toggle_itm.Html_toggle_btn(), toggle_itm.Html_toggle_hdr(), tmp_bfr.To_bry_and_clear()); }
public byte[] Replace(Bry_bfr tmp_bfr, byte[] src, int bgn, int end) { int pos = bgn; boolean dirty = false; while (pos < end) { byte b = src[pos]; Object o = this.Match_bgn_w_byte(b, src, pos, end); if (o == null) { if (dirty) tmp_bfr.Add_byte(b); pos++; } else { if (!dirty) { tmp_bfr.Add_mid(src, bgn, pos); dirty = true; } tmp_bfr.Add((byte[]) o); pos = match_pos; } } return dirty ? tmp_bfr.Xto_bry_and_clear() : src; }
public void Xtn_write( Bry_bfr bfr, Xoae_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xoae_page wpg, Xop_xnde_tkn xnde, byte[] src) { if (this.name == null) bfr.Add_str_a7("Error: Page status indicators' name attribute must not be empty."); }
public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { if (cfg == null) cfg = (Wdata_itemByTitle_cfg) wiki.Appe().Special_mgr().Get_or_null(Wdata_itemByTitle_cfg.Key); // Special:ItemByTitle/enwiki/Earth -> www.wikidata.org/wiki/Q2 Gfo_usr_dlg usr_dlg = wiki.Appe().Usr_dlg(); byte[] site_bry = cfg.Site_default(); byte[] page_bry = Bry_.Empty; byte[] raw_bry = ttl.Full_txt_wo_qarg(); // EX: enwiki/Earth int args_len = url.Args().length; if (args_len > 0) { arg_hash.Load(url); site_bry = arg_hash.Get_val_bry_or(Arg_site, Bry_.Empty); page_bry = arg_hash.Get_val_bry_or(Arg_page, Bry_.Empty); } int site_bgn = Bry_finder.Find_fwd(raw_bry, Xoa_ttl.Subpage_spr); if (site_bgn != Bry_.NotFound) { // leaf arg is available int page_bgn = Bry_finder.Find_fwd(raw_bry, Xoa_ttl.Subpage_spr, site_bgn + 1); int raw_bry_len = raw_bry.length; if (page_bgn != Bry_.NotFound && page_bgn < raw_bry_len) { // pipe is found and not last char (EX: "enwiki/" is invalid site_bry = Bry_.Mid(raw_bry, site_bgn + 1, page_bgn); page_bry = Bry_.Mid(raw_bry, page_bgn + 1, raw_bry_len); } } Xoae_app app = wiki.Appe(); if (Bry_.Len_gt_0(site_bry) && Bry_.Len_gt_0(page_bry)) if (Navigate(usr_dlg, app, app.Wiki_mgr().Wdata_mgr(), page, site_bry, page_bry)) return; Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_k004(); html_fmtr.Bld_bfr_many( tmp_bfr, "Search for items by site and title", "Site", site_bry, "Page", page_bry, "Search"); page.Data_raw_(tmp_bfr.To_bry_and_rls()); page.Html_data().Html_restricted_n_(); // [[Special:]] pages allow all HTML }
public void To_html(Bry_bfr bfr) { bfr.Add_byte(Byte_ascii.Angle_bgn); bfr.Add(node); To_html_atr(bfr, "data-source", "xowa"); int len = atrs.length; for (int i = 0; i < len; ++i) { Keyval atr = atrs[i]; To_html_atr(bfr, atr.Key(), atr.Val_to_str_or_empty()); } bfr.Add_byte(Byte_ascii.Angle_end); if (!Bry_.Eq(node, Gfh_tag_.Bry__link)) { if (body != null) { bfr.Add_byte_nl(); bfr.Add(body); bfr.Add_byte_nl(); } bfr.Add_byte(Byte_ascii.Angle_bgn).Add_byte(Byte_ascii.Slash); bfr.Add(node); bfr.Add_byte(Byte_ascii.Angle_end); } bfr.Add_byte_nl(); }
private static void To_html_atr(Bry_bfr bfr, String key, String val) { bfr.Add_byte_space(); bfr.Add_str_a7(key); bfr.Add_byte(Byte_ascii.Eq); bfr.Add_byte(Byte_ascii.Quote); bfr.Add_str_a7(val); bfr.Add_byte(Byte_ascii.Quote); }
public void Split__trg__nth__rls(Split_ctx ctx, Db_conn trg_conn) { // make rndm_rng and add Rndm_rng_itm rng_itm = bldr.Exec_rng_end_or_null(); if (rng_itm == null) return; Rndm_rng_tbl rng_tbl = new Rndm_rng_tbl(trg_conn); rng_tbl.Create_tbl(); Db_stmt rng_stmt = rng_tbl.Insert_stmt(); rng_tbl.Insert( rng_stmt, rng_itm.Mgr_idx(), rng_itm.Rng_idx(), rng_itm.Seq_bgn(), rng_itm.Seq_end()); rng_stmt.Rls(); bldr.Conn().Txn_end(); // make rndm_seq and bulk copy Rndm_seq_tbl seq_tbl = new Rndm_seq_tbl(trg_conn); seq_tbl.Create_tbl(); Split_tbl_.Bld_insert_by_select(tmp_bfr, seq_tbl.Tbl_name(), seq_tbl.Flds()); tmp_bfr.Add_str_u8_fmt( "WHERE {0} = {1} AND {2} = {3}", seq_tbl.Fld__qry_idx(), bldr.Qry_idx(), seq_tbl.Fld__rng_idx(), bldr.Rng_idx()); attach_mgr.Conn_main_(trg_conn).Conn_links_(new Db_attach_itm("src_db", bldr.Conn())); attach_mgr.Exec_sql(tmp_bfr.To_str_and_clear()); // bldr.Conn().Txn_bgn("rndm"); }
private void Write_body_edit(Bry_bfr bfr, byte[] data_raw, int ns_id, byte page_tid) { if (ns_id == Xow_ns_ .Tid__mediawiki // if MediaWiki and wikitext, must be a message; convert args back // to php; DATE:2014-06-13 && page_tid == Xow_page_tid.Tid_wikitext) data_raw = Gfs_php_converter.Xto_php(tmp_bfr, Bool_.N, data_raw); int data_raw_len = data_raw.length; if (mgr.Html_capable()) Xoh_html_wtr_escaper.Escape( page.Wikie().Appe().Parser_amp_mgr(), bfr, data_raw, 0, data_raw_len, false, false); // NOTE: must escape; assume that browser will automatically escape (<) (which // Mozilla does) else bfr.Add(data_raw); if (data_raw_len > 0) // do not add nl if empty String bfr .Add_byte_nl(); // per MW:EditPage.php: "Ensure there's a newline at the end, otherwise // adding lines is awkward." }
public static void Eval_arg_or( Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Arg_nde_tkn nde, byte[] or) { nde.Key_tkn() .Tmpl_evaluate( ctx, src, caller, bfr); // NOTE: must add key b/c parser functions do not have keys and some usages pass // in xml_tkns; EX: {{#if|<a href='{{{1}}}'|}}; "<a href" should not be // interpreted as key if (nde.KeyTkn_exists()) bfr.Add_byte(Byte_ascii.Eq); nde.Val_tkn().Tmpl_evaluate(ctx, src, caller, bfr); }
public void Write_body(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, Xoae_page page) { synchronized (thread_lock_2) { this.page = page; this.wiki = page.Wikie(); this.app = wiki.Appe(); Xoa_ttl page_ttl = page.Ttl(); int page_ns_id = page_ttl.Ns().Id(); byte page_tid = Xow_page_tid.Identify( wiki.Domain_tid(), page_ns_id, page_ttl .Page_db()); // NOTE: can't cache page_tid b/c Write_body is called directly; // DATE:2014-10-02 byte[] data_raw = page.Db().Text().Text_bry(); int bfr_page_bgn = bfr.Len(); boolean page_tid_uses_pre = false; if (page_mode == Xopg_page_.Tid_edit) Write_body_edit(bfr, data_raw, page_ns_id, page_tid); else { switch (page_tid) { case Xow_page_tid.Tid_msg: case Xow_page_tid.Tid_js: case Xow_page_tid.Tid_css: case Xow_page_tid.Tid_lua: Write_body_pre(bfr, app, wiki, hctx, data_raw, tmp_bfr); page_tid_uses_pre = true; break; case Xow_page_tid.Tid_json: app.Wiki_mgr().Wdata_mgr().Write_json_as_html(bfr, page_ttl.Full_db(), data_raw); break; case Xow_page_tid.Tid_wikitext: Write_body_wikitext(bfr, app, wiki, data_raw, ctx, hctx, page, page_tid, page_ns_id); break; } } if (wiki.Domain_tid() != Xow_domain_tid_.Tid__home // allow home wiki to use javascript && !page_tid_uses_pre) { // if .js, .css or .lua, skip test; may have js fragments, but // entire text is escaped and put in pre; don't show spurious // warning; DATE:2013-11-21 wiki.Html_mgr().Js_cleaner().Clean_bfr(wiki, page_ttl, bfr, bfr_page_bgn); } } }
public void Commit(Xoa_page pg) { boolean toc_mode_enabled = true, toc_mode_is_pgbnr = false; // default to Xoh_toc_data_.Toc_mode__basic switch (toc_mode) { case Xoh_toc_data.Toc_mode__none: toc_mode_enabled = false; break; case Xoh_toc_data.Toc_mode__pgbnr: toc_mode_is_pgbnr = true; break; } // set flags pg.Html_data().Toc_mgr().Exists_y_(); pg.Html_data().Head_mgr().Itm__pgbnr().Enabled_(toc_mode_is_pgbnr); // build bfr by add bfr_0, toc, body_bfr if (toc_mode_enabled) { pg.Html_data() .Toc_mgr() .To_html(head_bfr, gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx.Basic, toc_mode_is_pgbnr); head_bfr.Add_bfr_and_clear(body_bfr); } }
public static byte[] Write_wdata_links(List_adp slink_list, Xowe_wiki wiki, Xoa_ttl ttl, Wdata_external_lang_links_data external_links_mgr) { try { switch (wiki.Domain_tid()) { case Xow_domain_type_.Tid_home: // home will never be in wikidata case Xow_domain_type_.Tid_wikidata: // wikidata will never be in wikidata return Qid_null; } Wdata_wiki_mgr wdata_mgr = wiki.Appe().Wiki_mgr().Wdata_mgr(); Wdata_doc doc = wdata_mgr.Pages_get(wiki, ttl); if (doc == null) return Qid_null; // no links boolean external_links_mgr_enabled = external_links_mgr.Enabled(); Ordered_hash links = doc.Slink_list(); Bry_bfr tmp_bfr = wiki.Appe().Utl__bfr_mkr().Get_k004(); Xow_wiki_abrv wiki_abrv = new Xow_wiki_abrv(); int len = links.Count(); for (int i = 0; i < len; i++) { Wdata_sitelink_itm slink = (Wdata_sitelink_itm)links.Get_at(i); byte[] xwiki_key = slink.Site(); Xow_wiki_abrv_.parse_(wiki_abrv, xwiki_key, 0, xwiki_key.length); if (wiki_abrv.Domain_tid() == Xow_wiki_abrv_.Tid_null) { wiki.Appe().Usr_dlg().Warn_many("", "", "unknown wiki in wikidata: ttl=~{0} wiki=~{1}", ttl.Page_db_as_str(), String_.new_u8(xwiki_key)); continue; } if (wiki_abrv.Domain_tid() != wiki.Domain_tid()) continue; // ignore wikis in a different domain; EX: looking at enwiki:Earth, and wikidata has dewikiquote; ignore dewikiquote; DATE:2014-06-21 byte[] lang_key = wiki_abrv.Lang_itm().Key(); if (external_links_mgr_enabled && external_links_mgr.Langs_hide(lang_key, 0, lang_key.length)) continue; tmp_bfr.Add(lang_key); tmp_bfr.Add_byte(Byte_ascii.Colon); tmp_bfr.Add(slink.Name()); Xoa_ttl slink_ttl = Xoa_ttl.parse_(wiki, tmp_bfr.Xto_bry_and_clear()); if (slink_ttl == null) continue; // invalid ttl Xow_xwiki_itm xwiki_itm = slink_ttl.Wik_itm(); if ( xwiki_itm == null // not a known xwiki; EX: [[zzz:abc]] || Bry_.Eq(xwiki_itm.Domain_bry(), wiki.Domain_bry()) // skip if same as self; i.e.: do not include links to enwiki if already in enwiki ) continue; slink.Page_ttl_(slink_ttl); slink_list.Add(slink); } tmp_bfr.Mkr_rls(); if (external_links_mgr_enabled && external_links_mgr.Sort()) slink_list.Sort_by(Xoa_ttl_sorter._); return doc.Qid(); } catch (Exception e) {Err_.Noop(e); return Qid_null;} }
class Xow_search_scanner { private final List_adp tkns = List_adp_.new_(); private byte[] src; private int src_len, pos, txt_bgn; private final Ordered_hash tmp_list = Ordered_hash_.new_(); private final Bry_bfr tmp_bfr = Bry_bfr.new_(); public Xow_search_tkn[] Scan(byte[] src) { this.src = src; this.src_len = src.length; tkns.Clear(); pos = 0; txt_bgn = -1; while (pos < src_len) { byte cur_b = src[pos]; Object cur_obj = trie.Match_bgn_w_byte(cur_b, src, pos, src_len); if (cur_obj == null) { // text character if (txt_bgn == -1) txt_bgn = pos; // 1st character not set; set it ++pos; } else { // AND, OR, (, ), -, \s, " int pos_end = trie.Match_pos(); byte cur_tid = ((Byte_obj_val) cur_obj).Val(); if (Cur_join_is_word(cur_tid, pos_end)) continue; // ignore words containing "and", "or"; EX: "random"; "for" if (txt_bgn != -1) { // pending word; create Tkns_add_word(Xow_search_tkn.Tid_word, txt_bgn, pos); txt_bgn = -1; } switch (cur_tid) { case Xow_search_tkn.Tid_space: // discard spaces pos = Bry_finder.Find_fwd_while(src, pos, src_len, Byte_ascii.Space); break; case Xow_search_tkn.Tid_quote: // find end quote and add as word int quote_bgn = pos + 1; int quote_end = Bry_finder.Find_fwd(src, Byte_ascii.Quote, quote_bgn, src_len); if (quote_end == Bry_.NotFound) throw Err_.new_fmt_("could not find end quote: {0}", String_.new_u8(src)); Tkns_add_word(Xow_search_tkn.Tid_word_quoted, quote_bgn, quote_end); pos = quote_end + 1; // +1 to place after quote break; case Xow_search_tkn.Tid_not: Tkns_add_word(Xow_search_tkn.Tid_not, pos, pos_end); pos = pos_end; break; case Xow_search_tkn.Tid_paren_bgn: case Xow_search_tkn.Tid_paren_end: case Xow_search_tkn.Tid_and: case Xow_search_tkn.Tid_or: tkns.Add(new_tkn(cur_tid, pos, pos_end)); pos = pos_end; break; default: throw Err_.unhandled(cur_tid); } } } if (txt_bgn != -1) { // pending word; create Tkns_add_word(Xow_search_tkn.Tid_word, txt_bgn, pos); txt_bgn = -1; } return (Xow_search_tkn[]) tkns.To_ary_and_clear(Xow_search_tkn.class); } private boolean Cur_join_is_word( byte cur_tid, int pos_end) { // extra logic to handle and / or occuring in unquoted strings; EX: "random"; // "for" switch (cur_tid) { default: return false; // only look at AND, OR, - case Xow_search_tkn.Tid_and: case Xow_search_tkn.Tid_or: case Xow_search_tkn.Tid_not: break; } boolean join_is_word = true; if (txt_bgn == -1) { // no pending word; if (cur_tid == Xow_search_tkn.Tid_not) return false; // NOT is only operator if no pending tkn; EX: -abc -> NOT abc; a-b -> a-b byte nxt_b = pos_end < src_len ? src[pos_end] : Byte_ascii.Nil; Object nxt_obj = trie.Match_bgn_w_byte(nxt_b, src, pos_end, src_len); if (nxt_obj == null) // next tkn is text; join must be word join_is_word = true; else { // next tkn is tkn byte nxt_tid = ((Byte_obj_val) nxt_obj).Val(); switch (nxt_tid) { case Xow_search_tkn.Tid_space: case Xow_search_tkn.Tid_quote: case Xow_search_tkn.Tid_paren_bgn: case Xow_search_tkn.Tid_paren_end: join_is_word = false; // next tkn is sym; and/or is not word; EX: a AND ; a AND"b"; a AND(b) break; case Xow_search_tkn.Tid_not: case Xow_search_tkn.Tid_and: case Xow_search_tkn.Tid_or: join_is_word = true; // next tkn is and or not; and/or is word; EX: andor; oror; or-abc; break; default: throw Err_.unhandled(cur_tid); } } } else { // pending word; cur join must be word; EX: "grand": "and" invoked and "gr" pending join_is_word = true; } if (join_is_word) { if (txt_bgn == -1) txt_bgn = pos; // 1st character not set; set it pos = pos_end; return true; } if (txt_bgn != -1) { Tkns_add_word(Xow_search_tkn.Tid_word, txt_bgn, pos); // create word txt_bgn = -1; } return false; } private void Tkns_add_word(byte tid, int src_bgn, int src_end) { if (tkns.Count() > 0) { // at least 1 tkn; check for "auto-and" Xow_search_tkn last_tkn = (Xow_search_tkn) tkns.Get_at_last(); if (last_tkn.Tid() == Xow_search_tkn.Tid_word) // previous tkn is word; auto "AND" words; EX: A B -> A AND B tkns.Add(Xow_search_tkn.new_bry(Xow_search_tkn.Tid_and, Bry_and)); } if (tid == Xow_search_tkn .Tid_word) { // if word has symbol, convert to quoted; EX: a-b should become "a-b"; // otherwise searcher would search for a single word a-b byte[] cur_word = Bry_.Mid(src, src_bgn, src_end); byte[][] words = gplx.xowa.bldrs.cmds.texts.Xob_search_base.Split_ttl_into_words( null, tmp_list, tmp_bfr, cur_word); int words_len = words.length; if (words_len == 1 // only one word && !Bry_.Eq(words[0], cur_word) // split word not same as raw && Bry_finder.Find_fwd(cur_word, Byte_ascii.Star) == -1 // no asterisk ) { tkns.Add(Xow_search_tkn.new_bry(tid, words[0])); return; } if (words.length > 1) // multiple words; add as quoted-term; EX: "a-b" tid = Xow_search_tkn.Tid_word_quoted; } tkns.Add(new_tkn(tid, src_bgn, src_end)); } private Xow_search_tkn new_tkn(byte tid, int val_bgn, int val_end) { return Xow_search_tkn.new_pos(tid, val_bgn, val_end); } private static final byte[] Bry_and = Bry_.new_a7("AND"); private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_ascii_() // NOTE:ci.ascii:OR / AND only .Add_str_byte(" ", Xow_search_tkn.Tid_space) .Add_str_byte("\"", Xow_search_tkn.Tid_quote) .Add_str_byte("-", Xow_search_tkn.Tid_not) .Add_str_byte("(", Xow_search_tkn.Tid_paren_bgn) .Add_str_byte(")", Xow_search_tkn.Tid_paren_end) .Add_str_byte("or", Xow_search_tkn.Tid_or) .Add_str_byte("and", Xow_search_tkn.Tid_and); }
@Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) { bfr.Add_byte_pipe(); }
private void Write_body_wikitext( Bry_bfr bfr, Xoae_app app, Xowe_wiki wiki, byte[] data_raw, Xop_ctx ctx, Xoh_wtr_ctx hctx, Xoae_page page, byte page_tid, int ns_id) { // dump and exit if pre-generated html from html dumps byte[] hdump_data = page.Db().Html().Html_bry(); if (Bry_.Len_gt_0(hdump_data)) { bfr.Add(hdump_data); return; } // dump and exit if MediaWiki message; if (ns_id == Xow_ns_ .Tid__mediawiki) { // if MediaWiki and wikitext, must be a message; convert args back to // php; DATE:2014-06-13 bfr.Add(Gfs_php_converter.Xto_php(tmp_bfr, Bool_.N, data_raw)); return; } // if [[File]], add boilerplate header; note that html is XOWA-generated so does not need to be // tidied if (ns_id == Xow_ns_.Tid__file) app.Ns_file_page_mgr() .Bld_html(wiki, ctx, page, bfr, page.Ttl(), wiki.Cfg_file_page(), page.File_queue()); // get separate bfr; note that bfr already has <html> and <head> written to it, so this can't be // passed to tidy; DATE:2014-06-11 Bry_bfr tidy_bfr = wiki.Utl__bfr_mkr().Get_m001(); // write wikitext if (page.Html_data().Skip_parse()) { tidy_bfr.Add(page.Html_data().Custom_body()); } else { if (page.Root() != null) { // NOTE: will be null if blank; occurs for one test: // Logo_has_correct_main_page; DATE:2015-09-29 page.Html_data() .Toc_mgr() .Clear(); // NOTE: always clear tocs before writing html; toc_itms added when writing // html_hdr; DATE:2016-07-17 wiki.Html_mgr() .Html_wtr() .Write_doc(tidy_bfr, ctx, hctx, page.Root().Data_mid(), page.Root()); if (wiki.Html_mgr().Html_wtr().Cfg().Toc__show()) gplx.xowa.htmls.core.wkrs.tocs.Xoh_toc_wtr.Write_toc(tidy_bfr, page, hctx); } } // if [[Category]], add catpage data if (ns_id == Xow_ns_.Tid__category) tidy_bfr.Add_safe(page.Html_data().Catpage_data()); // if (ns_id == Xow_ns_.Tid__category) wiki.Ctg__catpage_mgr().Write_catpage(tidy_bfr, page, // hctx); // tidy html wiki.Html_mgr().Tidy_mgr().Exec_tidy(tidy_bfr, !hctx.Mode_is_hdump(), page.Url_bry_safe()); // add back to main bfr bfr.Add_bfr_and_clear(tidy_bfr); tidy_bfr.Mkr_rls(); // handle Categories at bottom of page; note that html is XOWA-generated so does not need to be // tidied int ctgs_len = page.Wtxt().Ctgs__len(); if (ctgs_enabled && ctgs_len > 0 // skip if no categories found while parsing wikitext && !wiki.Html_mgr() .Importing_ctgs() // do not show categories if importing categories, page will wait for // category import to be done; DATE:2014-10-15 && !hctx.Mode_is_hdump() // do not dump categories during hdump; DATE:2016-10-12 ) { if (app.Mode().Tid_is_gui()) app.Usr_dlg().Prog_many("", "", "loading categories: count=~{0}", ctgs_len); Xoctg_pagebox_itm[] pagebox_itms = wiki.Ctg__pagebox_wtr().Get_catlinks_by_page(wiki, page); boolean hidden_enabled = wiki.App().Api_root().Addon().Wikis__ctgs__hidden_enabled(); wiki.Ctg__pagebox_wtr().Write_pagebox(hidden_enabled, bfr, wiki, page, pagebox_itms); } // translate if variants are enabled Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr(); if (vnt_mgr.Enabled()) bfr.Add( vnt_mgr.Convert_lang() .Parse_page(vnt_mgr.Cur_itm(), page.Db().Page().Id(), bfr.To_bry_and_clear())); }
public byte[] Convert_to_local_urls(byte[] rel_url_prefix, byte[] src, List_adp list) { try { int src_len = src.length; int prv_pos = 0; Bry_bfr bfr = Bry_bfr_.New_w_size(src_len); Hash_adp img_hash = Hash_adp_bry.cs(); while (true) { int url_pos = Bry_find_.Find_fwd(src, Bry_url, prv_pos); if (url_pos == Bry_find_.Not_found) { bfr.Add_mid(src, prv_pos, src_len); break; } // no more "url("; exit; int bgn_pos = url_pos + Bry_url_len; // set bgn_pos after "url(" byte bgn_byte = src[bgn_pos]; byte end_byte = Byte_ascii.Null; boolean quoted = true; switch (bgn_byte) { // find end_byte case Byte_ascii.Quote: case Byte_ascii.Apos: // quoted; end_byte is ' or " end_byte = bgn_byte; ++bgn_pos; break; default: // not quoted; end byte is ")" end_byte = Byte_ascii.Paren_end; quoted = false; break; } int end_pos = Bry_find_.Find_fwd(src, end_byte, bgn_pos, src_len); if (end_pos == Bry_find_.Not_found) { // unclosed "url("; exit since nothing else will be found usr_dlg.Warn_many( GRP_KEY, "parse.invalid_url.end_missing", "could not find end_sequence for 'url(': bgn='~{0}' end='~{1}'", prv_pos, String_.new_u8__by_len(src, prv_pos, prv_pos + 25)); bfr.Add_mid(src, prv_pos, src_len); break; } if (end_pos - bgn_pos == 0) { // empty; "url()"; ignore usr_dlg.Warn_many( GRP_KEY, "parse.invalid_url.empty", "'url(' is empty: bgn='~{0}' end='~{1}'", prv_pos, String_.new_u8__by_len(src, prv_pos, prv_pos + 25)); bfr.Add_mid(src, prv_pos, bgn_pos); prv_pos = bgn_pos; continue; } byte[] img_raw = Bry_.Mid(src, bgn_pos, end_pos); int img_raw_len = img_raw.length; if (Bry_.Has_at_bgn(img_raw, Bry_data_image, 0, img_raw_len)) { // base64 bfr.Add_mid(src, prv_pos, end_pos); // nothing to download; just add entire String prv_pos = end_pos; continue; } int import_url_end = Import_url_chk( rel_url_prefix, src, src_len, prv_pos, url_pos, img_raw, bfr); // check for embedded stylesheets via @import tag if (import_url_end != Bry_find_.Not_found) { prv_pos = import_url_end; continue; } byte[] img_cleaned = Xob_url_fixer.Fix(wiki_domain, img_raw, img_raw_len); if (img_cleaned == null) { // could not clean img usr_dlg.Warn_many( GRP_KEY, "parse.invalid_url.clean_failed", "could not extract valid http src: bgn='~{0}' end='~{1}'", prv_pos, String_.new_u8(img_raw)); bfr.Add_mid(src, prv_pos, bgn_pos); prv_pos = bgn_pos; continue; } if (!img_hash.Has(img_cleaned)) { // only add unique items for download; img_hash.Add_as_key_and_val(img_cleaned); list.Add(String_.new_u8(img_cleaned)); } img_cleaned = Replace_invalid_chars( Bry_.Copy( img_cleaned)); // NOTE: must call ByteAry.Copy else img_cleaned will change // *inside* hash bfr.Add_mid(src, prv_pos, bgn_pos); if (!quoted) bfr.Add_byte(Byte_ascii.Quote); bfr.Add(img_cleaned); if (!quoted) bfr.Add_byte(Byte_ascii.Quote); prv_pos = end_pos; } return bfr.To_bry_and_clear(); } catch (Exception e) { usr_dlg.Warn_many( "", "", "failed to convert local_urls: ~{0} ~{1}", String_.new_u8(rel_url_prefix), Err_.Message_gplx_full(e)); return src; } }
private void Write_page_by_tid( Xop_ctx ctx, Xoh_wtr_ctx hctx, byte html_gen_tid, Bry_bfr bfr, Bry_fmtr fmtr, byte[] page_data) { // if custom_html, use it and exit; needed for Default_tab byte[] custom_html = page.Html_data().Custom_html(); if (custom_html != null) { bfr.Add(custom_html); return; } // temp variables if (root_dir_bry == null) this.root_dir_bry = app.Fsys_mgr().Root_dir().To_http_file_bry(); Xoa_ttl page_ttl = page.Ttl(); int page_ns_id = page_ttl.Ns().Id(); byte page_tid = Xow_page_tid.Identify(wiki.Domain_tid(), page_ns_id, page_ttl.Page_db()); DateAdp modified_on = page.Db().Page().Modified_on(); byte[] modified_on_msg = wiki.Msg_mgr() .Val_by_id_args( Xol_msg_itm_.Id_portal_lastmodified, modified_on.XtoStr_fmt_yyyy_MM_dd(), modified_on.XtoStr_fmt_HHmm()); byte[] page_body_class = Xoh_page_body_cls.Calc(tmp_bfr, page_ttl, page_tid); byte[] html_content_editable = wiki.Gui_mgr().Cfg_browser().Content_editable() ? Content_editable_bry : Bry_.Empty; byte[] page_content_sub = Xoh_page_wtr_wkr_.Bld_page_content_sub(app, wiki, page, tmp_bfr); byte[] js_edit_toolbar_bry = html_gen_tid == Xopg_page_.Tid_edit ? wiki.Fragment_mgr().Html_js_edit_toolbar() : Bry_.Empty; Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr(); if (vnt_mgr.Enabled()) { byte[] converted_title = vnt_mgr.Convert_lang().Converted_title(); // prefer converted title if (converted_title == null) // converted title does not exist; use regular page title and convert it converted_title = vnt_mgr.Convert_lang().Auto_convert(vnt_mgr.Cur_itm(), page_ttl.Page_txt()); page_ttl = Xoa_ttl.Parse(wiki, page_ttl.Ns().Id(), converted_title); } byte[] page_name = Xoh_page_wtr_wkr_.Bld_page_name( tmp_bfr, page_ttl, null); // NOTE: page_name does not show display_title (<i>). always pass in null byte[] page_display_title = Xoh_page_wtr_wkr_.Bld_page_name(tmp_bfr, page_ttl, page.Html_data().Display_ttl()); page.Html_data() .Custom_tab_name_( page_name); // set tab_name to page_name; note that if null, gui code will ignore and // use Ttl.Page_txt; PAGE: zh.w:釣魚臺列嶼主權問題 DATE:2015-10-05 Xow_portal_mgr portal_mgr = wiki.Html_mgr().Portal_mgr().Init_assert(); fmtr.Bld_bfr_many( bfr, root_dir_bry, Xoa_app_.Version, Xoa_app_.Build_date, app.Tcp_server().Running_str(), page.Db().Page().Id(), page.Ttl().Full_db(), page_name, page.Html_data().Page_heading().Init(page.Html_data(), page_display_title), modified_on_msg, mgr.Css_common_bry(), mgr.Css_wiki_bry(), page.Html_data().Head_mgr().Init(app, wiki, page).Init_dflts(), page.Lang().Dir_ltr_bry(), page.Html_data().Indicators(), page_content_sub, wiki.Html_mgr().Portal_mgr().Div_jump_to(), wiki.Xtn_mgr().Xtn_pgbnr().Write_html(page, ctx, hctx), page_body_class, html_content_editable, page_data, wdata_lang_wtr // sidebar divs , portal_mgr.Div_personal_bry(), portal_mgr.Div_ns_bry(wiki.Utl__bfr_mkr(), page_ttl, wiki.Ns_mgr()), portal_mgr.Div_view_bry( wiki.Utl__bfr_mkr(), html_gen_tid, page.Html_data().Xtn_search_text()), portal_mgr.Div_logo_bry(), portal_mgr.Div_home_bry(), new Xopg_xtn_skin_fmtr_arg(page, Xopg_xtn_skin_itm_tid.Tid_sidebar), portal_mgr.Div_sync_bry( tmp_bfr, app.Api_root().Addon().Bldr().Sync().Manual_enabled(), wiki, page), portal_mgr.Div_wikis_bry(wiki.Utl__bfr_mkr()), portal_mgr.Sidebar_mgr().Html_bry(), mgr.Edit_rename_div_bry(page_ttl), page.Html_data().Edit_preview_w_dbg(), js_edit_toolbar_bry); Xoh_page_wtr_wkr_.Bld_head_end(bfr, tmp_bfr, page); // add after </head> Xoh_page_wtr_wkr_.Bld_html_end(bfr, tmp_bfr, page); // add after </html> }
public void Write_page(Bry_bfr rv, Xoae_page page, Xop_ctx ctx) { synchronized (thread_lock_1) { this.page = page; this.wiki = page.Wikie(); this.app = wiki.Appe(); ctx.Page_(page); // HACK: must update page for toc_mgr; WHEN: Xoae_page rewrite Bry_fmtr fmtr = null; if (mgr.Html_capable()) { wdata_lang_wtr.Page_(page); byte view_mode = page_mode; switch (page_mode) { case Xopg_page_.Tid_edit: fmtr = mgr.Page_edit_fmtr(); break; case Xopg_page_.Tid_html: fmtr = mgr.Page_read_fmtr(); view_mode = Xopg_page_.Tid_read; break; // set view_mode to read, so that "read" is highlighted in HTML case Xopg_page_.Tid_read: fmtr = mgr.Page_read_fmtr(); // ctx.Page().Redlink_list().Clear(); // not sure if this is the best place to put it, // but redlinks (a) must only fire once; (b) must fire before html generation; (c) // cannot fire during edit (preview will handle separately); NOTE: probably put in to // handle reusable redlink lists; redlink lists are now instantiated per page, so clear // is not useful break; } Bry_bfr page_bfr = wiki.Utl__bfr_mkr() .Get_m001(); // NOTE: get separate page rv to output page; do not reuse tmp_bfr b/c // it will be used inside Fmt_do Xoh_wtr_ctx hctx = null; if (page_mode == Xopg_page_.Tid_html && wiki.App().Api_root().Wiki().Hdump().Html_mode().Tid_is_hdump_save()) { hctx = Xoh_wtr_ctx.Hdump; Write_body(page_bfr, ctx, hctx, page); Write_page_by_tid( ctx, hctx, page_mode, rv, mgr.Page_html_fmtr(), Gfh_utl.Escape_html_as_bry(page_bfr.To_bry_and_clear())); } else { hctx = Xoh_wtr_ctx.Basic; Write_body(page_bfr, ctx, hctx, page); Write_page_by_tid(ctx, hctx, view_mode, rv, fmtr, page_bfr.To_bry_and_rls()); new gplx.xowa.addons.apps.scripts.Xoscript_mgr().Write(rv, wiki, page); if (page_mode == Xopg_page_ .Tid_html) // if html, write page again, but wrap it in html skin this time Write_page_by_tid( ctx, hctx, page_mode, rv, mgr.Page_html_fmtr(), Gfh_utl.Escape_html_as_bry(rv.To_bry_and_clear())); wdata_lang_wtr.Page_(null); } } else Write_body(rv, ctx, Xoh_wtr_ctx.Basic, page); this.page = null; } }