/* XOWA: the XOWA Offline Wiki Application Copyright (C) 2012-2017 gnosygnu@gmail.com XOWA is licensed under the terms of the General Public License (GPL) Version 3, or alternatively under the terms of the Apache License Version 2.0. You may use XOWA according to either of these licenses as is most appropriate for your project on a case-by-case basis. The terms of each license can be found in the source code repository: GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt */ package gplx.xowa.drds.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.drds.*; import gplx.core.net.*; import gplx.xowa.addons.wikis.imports.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.sections.*; import gplx.xowa.wikis.pages.redirects.*; public class Xod_page_mgr { public Xod_page_itm Get_page(Xow_wiki wiki, Xoa_url page_url) { Xod_page_itm rv = new Xod_page_itm(); // load meta info like page_id, modified, etc Xoa_ttl ttl = wiki.Ttl_parse(page_url.Page_bry()); if (ttl.Ns().Id_is_special()) return Load_special(rv, wiki, page_url, ttl); Xowd_page_itm dbpg = new Xowd_page_itm(); try {wiki.Data__core_mgr().Tbl__page().Select_by_ttl(dbpg, ttl.Ns(), ttl.Page_db());} catch (Exception e) {// throw detailed exception to track down page_score exception throw Err_.new_("", "failed to retrieve page", "wiki", wiki.Domain_str(), "page_url", page_url.Page_bry(), "err", Err_.Message_lang(e)); } rv.Init_by_dbpg(ttl, dbpg); // load page data Xoh_page hpg = new Xoh_page(); hpg.Ctor_by_hview(wiki, Xoa_url.New(wiki, ttl), ttl, 1); rv.Init_by_hpg(hpg); wiki.Html__hdump_mgr().Load_mgr().Load_by_xowh(hpg, ttl, Bool_.Y); Load_sections(rv, hpg); return rv; } private void Load_sections(Xod_page_itm rv, Xoh_page hpg) { Xoh_section_mgr section_mgr = hpg.Section_mgr(); int len = section_mgr.Len(); for (int i = 0; i < len; ++i) { Xoh_section_itm itm = section_mgr.Get_at(i); rv.Section_list().Add(itm); } } private Xod_page_itm Load_special(Xod_page_itm rv, Xow_wiki wiki, Xoa_url url, Xoa_ttl ttl) { // get prototype gplx.xowa.specials.Xow_special_page proto = wiki.App().Special_regy().Get_by_or_null(ttl.Page_txt_wo_qargs()); if (proto == null) return rv; // invalid url // generate special Xoh_page page = new Xoh_page(); page.Ctor_by_hview(wiki, Xoa_url.New(wiki, ttl), ttl, 1); // NOTE: init page to set url, ttl; DATE:2016-06-23 try {proto.Special__clone().Special__gen(wiki, page, url, ttl);} catch (Exception e) {Gfo_log_.Instance.Warn("failed to generate special page", "url", url.To_str(), "err", Err_.Message_gplx_log(e)); return rv;} // handle redirects; EX: Special:XowaWikiInfo Xopg_redirect_itm redirect_itm = page.Redirect_trail().Itms__get_at_nth_or_null(); if (redirect_itm != null) return Get_page(wiki, redirect_itm.Url()); rv.Init(-1, -1, String_.new_u8(ttl.Page_txt()), String_.new_u8(ttl.Page_db()), null, null, Datetime_now.Get().XtoStr_fmt_iso_8561(), false, false, false, 0, "", "", ""); rv.Init_by_hpg(page); Xoh_section_itm section = new Xoh_section_itm(1, 1, Bry_.Empty, Bry_.Empty); section.Content_(page.Html_data().Custom_body()); rv.Section_list().Add(section); rv.Ttl_special_(String_.new_u8(page.Html_data().Display_ttl())); rv.Head_tags().Copy(page.Html_data().Custom_head_tags()); rv.Tail_tags().Copy(page.Html_data().Custom_tail_tags()); return rv; } }