@Test public void Bidi() { fxt.Init_ttl("A" + String_.new_u8(Bry_.ints_(226, 128, 142)) + "B").Expd_page_txt("AB").Test(); fxt.Init_ttl("A" + String_.new_u8(Bry_.ints_(226, 128, 97)) + "B") .Expd_page_txt("A" + String_.new_u8(Bry_.ints_(226, 128, 97)) + "B") .Test(); }
Xof_repo_itm Ini_repo_add(Xof_file_mgr file_mgr, byte[] key, String root, String wiki, boolean trg) { Xof_repo_itm repo = file_mgr.Repo_mgr().Set(String_.new_u8(key), root, wiki).Ext_rules_(Xof_rule_grp.Grp_app_default).Dir_depth_(2); if (trg) { byte[][] ary = repo.Mode_names(); ary[0] = Bry_.new_a7("raw"); ary[1] = Bry_.new_a7("fit"); } return repo; }
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 }
@gplx.Virtual public void Clear(boolean src_repo_is_wmf) { Io_mgr.I.InitEngine_mem(); if (app == null) { app = Xoa_app_fxt.app_(); en_wiki = Xoa_app_fxt.wiki_(app, Xow_domain_.Domain_str_enwiki); commons = Xoa_app_fxt.wiki_(app, Xow_domain_.Domain_str_commons); app.Wiki_mgr().Add(commons); app.Wiki_mgr().Add(en_wiki); Xof_file_mgr file_mgr = app.File_mgr(); file_mgr.Img_mgr().Wkr_resize_img_(Xof_img_wkr_resize_img_mok._); file_mgr.Img_mgr().Wkr_query_img_size_(new Xof_img_wkr_query_img_size_test()); app.Wmf_mgr().Api_mgr().Api_orig_(api_size); byte[] src_commons = Bry_.new_a7("src_commons"); byte[] src_en_wiki = Bry_.new_a7("src_en_wiki"); byte[] trg_commons = Bry_.new_a7("trg_commons"); byte[] trg_en_wiki = Bry_.new_a7("trg_en_wiki"); src_commons_repo = Ini_repo_add(file_mgr, src_commons, "mem/src/commons.wikimedia.org/", Xow_domain_.Domain_str_commons, false); src_en_wiki_repo = Ini_repo_add(file_mgr, src_en_wiki, "mem/src/en.wikipedia.org/" , Xow_domain_.Domain_str_enwiki, false); Ini_repo_add(file_mgr, trg_commons, "mem/trg/commons.wikimedia.org/", Xow_domain_.Domain_str_commons, true).Primary_(true); Ini_repo_add(file_mgr, trg_en_wiki, "mem/trg/en.wikipedia.org/" , Xow_domain_.Domain_str_enwiki, true).Primary_(true); Xowe_repo_mgr wiki_repo_mgr = en_wiki.File_mgr().Repo_mgr(); Xof_repo_pair pair = null; pair = wiki_repo_mgr.Add_repo(src_commons, trg_commons); pair.Src().Fsys_is_wnt_(true).Wmf_fsys_(src_repo_is_wmf).Tarball_(!src_repo_is_wmf); pair.Trg().Fsys_is_wnt_(true); pair = wiki_repo_mgr.Add_repo(src_en_wiki, trg_en_wiki); pair.Src().Fsys_is_wnt_(true).Wmf_fsys_(src_repo_is_wmf); pair.Trg().Fsys_is_wnt_(true); } en_wiki.Clear_for_tests(); commons.Clear_for_tests(); src_fils = trg_fils = Io_fil.Ary_empty; html_view_str = null; html_w = html_h = -1; }
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;} }
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(); }
public void Get_by_url1(Xow_wiki wiki, Xoa_page page, Xoa_url url, Xoa_ttl ttl) { int slash_pos = Bry_find_.Find_fwd(ttl.Page_txt_wo_qargs(), Xoa_ttl.Subpage_spr); // check for slash byte[] special_name = slash_pos == Bry_find_.Not_found ? ttl.Base_txt_wo_qarg() // no slash found; use base_txt; ignore qry args and just get // page_names; EX: Search/Earth?fulltext=y; // Allpages?from=Earth... : Bry_.Mid( ttl.Page_txt_wo_qargs(), 0, slash_pos); // slash found; use root page; EX: Special:ItemByTitle/enwiki/Earth Object o = hash.Get_by_bry(special_name); if (o == null) { Xol_specials_itm special_itm = wiki.Lang().Specials_mgr().Get_by_alias(special_name); if (special_itm != null) o = hash.Get_by_bry(special_itm.Special()); } if (o != null) { // Xow_special_page special = (Xow_special_page)o; // page.Revision_data().Modified_on_(Datetime_now.Get()); // special.Special__gen(wiki, page, url, ttl); } }
public static Xopg_tag_itm New_js_code(String code) { return New_js_code(Bry_.new_u8(code)); }
public void Init_page_create(Xowe_wiki wiki, String ttl, String txt) { Xoa_ttl page_ttl = Xoa_ttl.parse_(wiki, Bry_.new_u8(ttl)); byte[] page_raw = Bry_.new_u8(txt); wiki.Db_mgr().Save_mgr().Data_create(page_ttl, page_raw); }
public class Wdata_itemByTitle_page implements Xows_page { private Xoa_url_arg_hash arg_hash = new Xoa_url_arg_hash(); private static final byte[] Arg_site = Bry_.new_a7("site"), Arg_page = Bry_.new_a7("page"); public Bry_fmtr Html_fmtr() { return html_fmtr; } private Wdata_itemByTitle_cfg cfg; public Xows_special_meta Special_meta() { return Xows_special_meta_.Itm__item_by_title; } 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 } private static boolean Navigate( Gfo_usr_dlg usr_dlg, Xoae_app app, Wdata_wiki_mgr wdata_mgr, Xoae_page page, byte[] site_bry, byte[] page_bry) { page_bry = Xoa_app_.Utl__encoder_mgr() .Http_url() .Decode(page_bry); // NOTE: space is converted to + on postback to url; decode byte[] wiki_domain = Xow_wiki_alias.Parse_wmf_key(site_bry); if (wiki_domain == null) { usr_dlg.Warn_many("", "", "site_bry parse failed; site_bry:~{0}", String_.new_u8(site_bry)); return false; } Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(wiki_domain); if (wiki == null) { usr_dlg.Warn_many( "", "", "wiki_domain does not exist; wiki_domain:~{0}", String_.new_u8(wiki_domain)); return false; } Xoa_ttl wdata_ttl = Xoa_ttl.parse_(wiki, page_bry); if (wdata_ttl == null) { usr_dlg.Warn_many("", "", "ttl is invalid; ttl:~{0}", String_.new_u8(page_bry)); return false; } Wdata_doc doc = wdata_mgr.Pages_get(wiki, wdata_ttl); if (doc == null) { usr_dlg.Warn_many( "", "", "ttl cannot be found in wikidata; ttl:~{0}", String_.new_u8(wdata_ttl.Raw())); return false; } byte[] qid_bry = doc.Qid(); Xoae_page qid_page = wdata_mgr.Wdata_wiki().Data_mgr().Redirect(page, qid_bry); if (qid_page.Missing()) { usr_dlg.Warn_many( "", "", "qid cannot be found in wikidata; qid:~{0}", String_.new_u8(qid_bry)); return false; } return true; } private static Bry_fmtr html_fmtr = Bry_fmtr.new_( String_.Concat_lines_nl( "<div id=\"mw-content-text\">", "<form method=\"get\" action=\"//www.wikidata.org/wiki/Special:ItemByTitle\" name=\"itembytitle\" id=\"wb-itembytitle-form1\">", "<fieldset>", "<legend>~{legend}</legend>", "<label for=\"wb-itembytitle-sitename\">~{site_lbl}:</label>", "<input id=\"wb-itembytitle-sitename\" size=\"12\" name=\"site\" value=\"~{site_val}\" accesskey=\"s\" />", "", "<label for=\"pagename\">~{page_lbl}:</label>", "<input id=\"pagename\" size=\"36\" class=\"wb-input-text\" name=\"page\" value=\"~{page_val}\" accesskey=\"p\" />", "", "<input id=\"wb-itembytitle-submit\" class=\"wb-input-button\" type=\"submit\" value=\"~{search_lbl}\" name=\"submit\" />", "</fieldset>", "</form>", "</div>", "<br>To change the default site, see <a href='/site/home/wiki/Help:Options/Wikibase'>Help:Options/Wikibase</a>"), "legend", "site_lbl", "site_val", "page_lbl", "page_val", "search_lbl"); }
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 class Xoh_page_wtr_wkr { private final Object thread_lock_1 = new Object(), thread_lock_2 = new Object(); private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255); private final Xoh_page_wtr_mgr mgr; private final byte page_mode; private final Wdata_xwiki_link_wtr wdata_lang_wtr = new Wdata_xwiki_link_wtr(); // In other languages private Xoae_app app; private Xowe_wiki wiki; private Xoae_page page; private byte[] root_dir_bry; public Xoh_page_wtr_wkr(Xoh_page_wtr_mgr mgr, byte page_mode) { this.mgr = mgr; this.page_mode = page_mode; } public Xoh_page_wtr_wkr Ctgs_enabled_(boolean v) { ctgs_enabled = v; return this; } private boolean ctgs_enabled = true; 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; } } 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_hdump(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, Xoae_page wpg) { if (wpg.Html_data().Xtn_pgbnr() != null) { ctx.Wiki() .Xtn_mgr() .Xtn_pgbnr() .Write_html(wpg, ctx, hctx) .Bfr_arg__add(bfr); // if pgbnr exists, write to top of html } this.Write_body(bfr, ctx, hctx, wpg); } 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); } } } 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())); } 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(); } 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." } private static final byte[] Content_editable_bry = Bry_.new_a7(" contenteditable=\"true\""); }
public int compare(Object lhsObj, Object rhsObj) { Xoa_ttl lhs = (Xoa_ttl)lhsObj, rhs = (Xoa_ttl)rhsObj; return Bry_.Compare(lhs.Raw(), rhs.Raw()); }