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

@@ -19,16 +19,12 @@ package gplx.xowa.htmls; import gplx.*; import gplx.xowa.*;
import gplx.xowa.htmls.core.htmls.tidy.*; import gplx.xowa.htmls.js.*; import gplx.xowa.htmls.skins.*;
import gplx.xowa.parsers.xndes.*;
public class Xoh_html_mgr implements Gfo_invk {
public Xoh_html_mgr(Xoae_app app) {
js_cleaner = new Xoh_js_cleaner(app);
}
public Xoh_html_mgr(Xoae_app app) {}
public void Init_by_app(Xoae_app app) {
tidy_mgr.Init_by_app(app);
}
public Xop_xatr_whitelist_mgr Whitelist_mgr() {return whitelist_mgr;} private final Xop_xatr_whitelist_mgr whitelist_mgr = new Xop_xatr_whitelist_mgr().Ini();
public Xoh_page_mgr Page_mgr() {return page_mgr;} private final Xoh_page_mgr page_mgr = new Xoh_page_mgr();
public Xoh_tidy_mgr Tidy_mgr() {return tidy_mgr;} private final Xoh_tidy_mgr tidy_mgr = new Xoh_tidy_mgr();
public Xoh_js_cleaner Js_cleaner() {return js_cleaner;} private final Xoh_js_cleaner js_cleaner;
public Xoa_tidy_mgr Tidy_mgr() {return tidy_mgr;} private final Xoa_tidy_mgr tidy_mgr = new Xoa_tidy_mgr();
public Xoh_skin_mgr Skin_mgr() {return skin_mgr;} private final Xoh_skin_mgr skin_mgr = new Xoh_skin_mgr();
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_page)) return page_mgr;

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.htmls; import gplx.*; import gplx.xowa.*;
import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.skins.*; import gplx.xowa.wikis.pages.lnkis.*; import gplx.xowa.wikis.pages.redirects.*;
import gplx.xowa.files.*;
import gplx.xowa.htmls.heads.*; import gplx.xowa.htmls.sections.*; import gplx.xowa.htmls.tocs.*;
import gplx.xowa.htmls.heads.*; import gplx.xowa.htmls.sections.*; import gplx.xowa.addons.htmls.tocs.*;
import gplx.xowa.wikis.pages.dbs.*; import gplx.xowa.wikis.pages.hdumps.*; import gplx.xowa.wikis.pages.htmls.*;
public class Xoh_page implements Xoa_page {
// core
@@ -48,23 +48,17 @@ public class Xoh_page implements Xoa_page {
public int Exec_tid() {return exec_tid;} private int exec_tid = Xof_exec_tid.Tid_wiki_page;
public byte[] Html_head_xtn() {return html_head_xtn;} public void Html_head_xtn_(byte[] v) {html_head_xtn = v;} private byte[] html_head_xtn = Bry_.Empty; // drd:web_browser
public byte[] Url_bry_safe() {return page_url == null ? Bry_.Empty : page_url.To_bry(Bool_.Y, Bool_.Y);}
public void Init(Xow_wiki wiki, Xoa_url page_url, Xoa_ttl page_ttl, int page_id) {
public void Ctor_by_hview(Xow_wiki wiki, Xoa_url page_url, Xoa_ttl page_ttl, int page_id) {
this.wiki = wiki; this.page_url = page_url; this.page_ttl = page_ttl; this.page_id = page_id;
this.Clear();
html.Redlink_list().Disabled_(page_ttl.Ns().Id_is_module()); // never redlink in Module ns; particularly since Lua has multi-line comments for [[ ]]
hdump.Toc_wtr().Init(wiki.Lang().Msg_mgr().Itm_by_id_or_null(gplx.xowa.langs.msgs.Xol_msg_itm_.Id_toc).Val(), page_url.Raw());
html.Toc_mgr().Init(wiki.Lang().Msg_mgr().Itm_by_id_or_null(gplx.xowa.langs.msgs.Xol_msg_itm_.Id_toc).Val(), page_url.Raw());
}
public void Ctor_by_db(int head_flag, byte[] display_ttl, byte[] content_sub, byte[] sidebar_div, int zip_tid, int hzip_tid, byte[] body) {
head_mgr.Flag_(head_flag);
this.display_ttl = display_ttl; this.content_sub = content_sub; this.sidebar_div = sidebar_div;
db.Html().Html_bry_(body);
db.Html().Zip_tids_(zip_tid, hzip_tid);
}
public Xoh_page Ctor_by_page(Bry_bfr tmp_bfr, Xoae_page page) {
this.page_id = page.Db().Page().Id();
this.wiki = page.Wiki();
public Xoh_page Ctor_by_hdiff(Bry_bfr tmp_bfr, Xoae_page page) {
this.wiki = page.Wiki(); this.page_url = page.Url(); this.page_ttl = page.Ttl(); this.page_id = page.Db().Page().Id();
db.Html().Html_bry_(page.Db().Html().Html_bry());
this.page_url = page.Url();
Xopg_html_data html = page.Html_data();
html.Init_by_page(page.Ttl());
Xoh_head_mgr mod_mgr = html.Head_mgr();
@@ -72,12 +66,21 @@ public class Xoh_page implements Xoa_page {
this.display_ttl = html.Display_ttl();
this.content_sub = html.Content_sub();
this.sidebar_div = Xoh_page_.Save_sidebars(tmp_bfr, page, html);
html.Toc_mgr().Init(Bry_.Empty, page_url.Page_bry());
return this;
}
public void Ctor_by_db(int head_flag, byte[] display_ttl, byte[] content_sub, byte[] sidebar_div, int zip_tid, int hzip_tid, byte[] body) {
head_mgr.Flag_(head_flag);
this.display_ttl = display_ttl; this.content_sub = content_sub; this.sidebar_div = sidebar_div;
db.Html().Html_bry_(body);
db.Html().Zip_tids_(zip_tid, hzip_tid);
}
public void Clear() {
redirect.Clear();
html.Clear();
hdump.Clear();
db.Clear();
display_ttl = content_sub = sidebar_div = Bry_.Empty;
head_mgr.Clear(); commons_mgr.Clear();

View File

@@ -0,0 +1,49 @@
/*
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.htmls; import gplx.*; import gplx.xowa.*;
import gplx.xowa.htmls.core.wkrs.tocs.*;
public class Xoh_page_bfr {
private byte toc_mode;
private Bry_bfr head_bfr; private final Bry_bfr body_bfr = Bry_bfr_.New();
public void Init(Bry_bfr head_bfr) {
this.toc_mode = Xoh_toc_data.Toc_mode__none;
this.head_bfr = head_bfr;
body_bfr.Clear();
}
public Bry_bfr Split_by_toc(byte toc_mode) {
this.toc_mode = toc_mode;
return body_bfr;
}
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);
}
}
}

View File

@@ -19,7 +19,7 @@ package gplx.xowa.htmls; import gplx.*; import gplx.xowa.*;
import gplx.core.brys.fmtrs.*;
import gplx.xowa.wikis.pages.*;
public class Xoh_page_wtr_mgr implements Gfo_invk {
private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255), html_bfr = Bry_bfr_.Reset(Io_mgr.Len_mb);
private Xoh_page_wtr_wkr edit_wtr, html_wtr, read_wtr;
public Xoh_page_wtr_mgr(boolean html_capable) {
this.html_capable = html_capable;
@@ -48,10 +48,8 @@ public class Xoh_page_wtr_mgr implements Gfo_invk {
page_edit_fmtr.Eval_mgr_(wiki.Eval_mgr());
page_html_fmtr.Eval_mgr_(wiki.Eval_mgr());
}
Bry_bfr tmp_bfr = Xoa_app_.Utl__bfr_mkr().Get_m001();
byte[] bry = wtr.Write_page(page, wiki.Parser_mgr().Ctx(), tmp_bfr);
tmp_bfr.Mkr_rls();
return bry;
wtr.Write_page(html_bfr, page, wiki.Parser_mgr().Ctx());
return html_bfr.To_bry_and_clear_and_rls();
}
public Xoh_page_wtr_wkr Wkr(byte output_tid) {
switch (output_tid) {
@@ -81,7 +79,7 @@ public class Xoh_page_wtr_mgr implements Gfo_invk {
public static final String Invk_page_read_ = "page_read_", Invk_page_edit_ = "page_edit_", Invk_page_html_ = "page_html_", Invk_xowa_div_edit_rename_ = "xowa_div_edit_rename_";
private static final String[] Fmtr_keys = new String[]
{ "app_root_dir", "app_version", "app_build_date", "xowa_mode_is_server"
, "page_id", "page_name", "page_heading", "page_modified_on_msg"
, "page_id", "page_ttl_full", "page_name", "page_heading", "page_modified_on_msg"
, "html_css_common_path", "html_css_wiki_path", "xowa_head"
, "page_lang_ltr", "page_indicators", "page_content_sub", "page_jumpto", "page_pgbnr", "page_body_cls", "html_content_editable"
, "page_data", "page_langs"

View File

@@ -23,13 +23,14 @@ import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.d
import gplx.xowa.xtns.pagebanners.*;
import gplx.xowa.apps.gfs.*; import gplx.xowa.htmls.portal.*;
public class Xoh_page_wtr_wkr {
private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255); private final Object thread_lock_1 = new Object(), thread_lock_2 = new Object();
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 byte[] Write_page(Xoae_page page, Xop_ctx ctx, Bry_bfr bfr) {
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
@@ -44,26 +45,25 @@ public class Xoh_page_wtr_wkr {
// 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 = Xoa_app_.Utl__bfr_mkr().Get_m001(); // NOTE: get separate page bfr to output page; do not reuse tmp_bfr b/c it will be used inside Fmt_do
Bry_bfr page_bfr = Xoa_app_.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, bfr, mgr.Page_html_fmtr(), Gfh_utl.Escape_html_as_bry(page_bfr.To_bry_and_clear()));
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, bfr, fmtr, page_bfr.To_bry_and_rls());
Write_page_by_tid(ctx, hctx, view_mode, rv, fmtr, page_bfr.To_bry_and_rls());
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, bfr, mgr.Page_html_fmtr(), Gfh_utl.Escape_html_as_bry(bfr.To_bry_and_clear()));
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(bfr, ctx, Xoh_wtr_ctx.Basic, page);
Write_body(rv, ctx, Xoh_wtr_ctx.Basic, page);
this.page = null;
return bfr.To_bry_and_clear();
}
}
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) {
@@ -93,7 +93,7 @@ public class Xoh_page_wtr_wkr {
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.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()
@@ -104,7 +104,7 @@ public class Xoh_page_wtr_wkr {
, 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>
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) {
@@ -133,7 +133,7 @@ public class Xoh_page_wtr_wkr {
}
if ( wiki.Domain_tid() != Xow_domain_tid_.Int__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
app.Html_mgr().Js_cleaner().Clean_bfr(wiki, page_ttl, bfr, bfr_page_bgn);
wiki.Html_mgr().Js_cleaner().Clean_bfr(wiki, page_ttl, bfr, bfr_page_bgn);
}
}
}
@@ -158,15 +158,19 @@ public class Xoh_page_wtr_wkr {
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
wiki.Html_mgr().Html_wtr().Write_all(tidy_bfr, page.Wikie().Parser_mgr().Ctx(), hctx, page.Root().Data_mid(), page.Root());
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]], render rest of html (Subcategories; Pages; Files); note that a category may have other html which requires wikitext processing
if (ns_id == Xow_ns_.Tid__category) wiki.Html_mgr().Ns_ctg().Bld_html(wiki, page, hctx, tidy_bfr);
// tidy html
gplx.xowa.htmls.core.htmls.tidy.Xoh_tidy_mgr tidy_mgr = app.Html_mgr().Tidy_mgr();
if (tidy_mgr.Enabled()) tidy_mgr.Run_tidy_html(page, tidy_bfr, !hctx.Mode_is_hdump());
wiki.Html_mgr().Tidy_mgr().Run_tidy_html(page, tidy_bfr, !hctx.Mode_is_hdump());
// add back to main bfr
bfr.Add_bfr_and_clear(tidy_bfr);

View File

@@ -19,7 +19,7 @@ package gplx.xowa.htmls; import gplx.*; import gplx.xowa.*;
import gplx.core.brys.fmtrs.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
public class Xohp_ctg_grp_mgr {
final Bry_fmtr grp_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
final Bry_fmtr grp_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
( "<div id=\"catlinks\" class=\"catlinks\">"
, "<div id=\"mw-normal-catlinks\" class=\"mw-normal-catlinks\">"
, "~{grp_lbl}"
@@ -29,7 +29,7 @@ public class Xohp_ctg_grp_mgr {
, "</div>"
), "grp_lbl", "grp_itms")
;
final Bry_fmtr itm_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
final Bry_fmtr itm_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
( ""
, "<li>"
, "<a href=\"~{itm_href}\" class=\"internal\" title=\"~{itm_title}\">~{itm_text}</a>"
@@ -55,7 +55,7 @@ class Xoh_ctg_itm_fmtr implements gplx.core.brys.Bfr_arg {
for (int i = 0; i < ctgs_len; i++) {
byte[] page_name = page.Category_list()[i];
tmp_bfr.Add(ctg_prefix).Add(page_name);
page.Wikie().Appe().Html__href_wtr().Build_to_bfr(tmp_href, app, wiki.Domain_bry(), wiki.Ttl_parse(tmp_bfr.To_bry_and_clear()));
page.Wikie().Html__href_wtr().Build_to_bfr(tmp_href, app, wiki.Domain_bry(), wiki.Ttl_parse(tmp_bfr.To_bry_and_clear()));
itm_fmtr.Bld_bfr(bfr, tmp_href.To_bry_and_clear(), page_name, page_name);
}
tmp_bfr.Mkr_rls();

View File

@@ -18,8 +18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.htmls; import gplx.*; import gplx.xowa.*;
import gplx.gfui.kits.core.*;
import gplx.xowa.langs.*;
import gplx.xowa.wikis.ctgs.*; import gplx.xowa.xtns.gallery.*;
import gplx.xowa.htmls.portal.*; import gplx.xowa.htmls.tocs.*; import gplx.xowa.wikis.modules.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.hzips.*;
import gplx.xowa.wikis.ctgs.*; import gplx.xowa.xtns.gallery.*;
import gplx.xowa.parsers.xndes.*;
import gplx.xowa.htmls.portal.*; import gplx.xowa.addons.htmls.tocs.*; import gplx.xowa.wikis.modules.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.htmls.tidy.*; import gplx.xowa.htmls.js.*;
public class Xow_html_mgr implements Gfo_invk {
public Xow_html_mgr(Xowe_wiki wiki) {
this.wiki = wiki;
@@ -34,20 +35,24 @@ public class Xow_html_mgr implements Gfo_invk {
portal_mgr = new Xow_portal_mgr(wiki);
imgs_mgr = new Xoh_imgs_mgr(this);
module_mgr = new Xow_module_mgr(wiki);
this.js_cleaner = new Xoh_js_cleaner(app);
}
public void Init_by_wiki(Xowe_wiki wiki) {
html_wtr.Init_by_wiki(wiki);
module_mgr.Init_by_wiki(wiki);
tidy_mgr.Init_by_app(wiki.Appe());
}
public void Init_by_lang(Xol_lang_itm lang) {
portal_mgr.Init_by_lang(lang);
}
public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki;
public Xoh_html_wtr Html_wtr() {return html_wtr;} private Xoh_html_wtr html_wtr;
public Xoh_page_wtr_mgr Page_wtr_mgr() {return page_wtr_mgr;} private Xoh_page_wtr_mgr page_wtr_mgr;
public Xow_portal_mgr Portal_mgr() {return portal_mgr;} private Xow_portal_mgr portal_mgr;
public Xow_toc_mgr Toc_mgr() {return toc_mgr;} private Xow_toc_mgr toc_mgr = new Xow_toc_mgr();
public Xow_module_mgr Head_mgr() {return module_mgr;} private Xow_module_mgr module_mgr;
public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki;
public Xoh_html_wtr Html_wtr() {return html_wtr;} private Xoh_html_wtr html_wtr;
public Xoh_page_wtr_mgr Page_wtr_mgr() {return page_wtr_mgr;} private Xoh_page_wtr_mgr page_wtr_mgr;
public Xow_tidy_mgr Tidy_mgr() {return tidy_mgr;} private final Xow_tidy_mgr tidy_mgr = new Xow_tidy_mgr();
public Xoh_js_cleaner Js_cleaner() {return js_cleaner;} private final Xoh_js_cleaner js_cleaner;
public Xop_xatr_whitelist_mgr Whitelist_mgr() {return whitelist_mgr;} private final Xop_xatr_whitelist_mgr whitelist_mgr = new Xop_xatr_whitelist_mgr().Ini();
public Xow_portal_mgr Portal_mgr() {return portal_mgr;} private Xow_portal_mgr portal_mgr;
public Xow_module_mgr Head_mgr() {return module_mgr;} private Xow_module_mgr module_mgr;
public boolean Importing_ctgs() {return importing_ctgs;} public void Importing_ctgs_(boolean v) {importing_ctgs = v;} private boolean importing_ctgs;
public int Img_thumb_width() {return img_thumb_width;} private int img_thumb_width = 220;
public byte[] Img_media_play_btn() {return img_media_play_btn;} private byte[] img_media_play_btn;

View File

@@ -30,7 +30,7 @@ public class Xow_hdump_mgr__load {
}
public Xoh_make_mgr Make_mgr() {return make_mgr;} private final Xoh_make_mgr make_mgr;
public void Load_by_edit(Xoae_page wpg) {
tmp_hpg.Init(wpg.Wiki(), wpg.Url(), wpg.Ttl(), wpg.Db().Page().Id());
tmp_hpg.Ctor_by_hview(wpg.Wiki(), wpg.Url(), wpg.Ttl(), wpg.Db().Page().Id());
Load(tmp_hpg, wpg.Ttl());
wpg.Db().Html().Html_bry_(tmp_hpg.Db().Html().Html_bry());
wpg.Root_(new gplx.xowa.parsers.Xop_root_tkn()); // HACK: set root, else load page will fail
@@ -44,7 +44,7 @@ public class Xow_hdump_mgr__load {
this.override_mgr__html = new Xow_override_mgr(override_root_url.GenSubDir_nest("html"));
}
boolean loaded = Load__dbpg(wiki, tmp_dbpg.Clear(), hpg, ttl);
hpg.Init(hpg.Wiki(), hpg.Url(), ttl, tmp_dbpg.Id());
hpg.Ctor_by_hview(hpg.Wiki(), hpg.Url(), ttl, tmp_dbpg.Id());
if (!loaded) { // nothing in "page" table
byte[] page_override = override_mgr__page.Get_or_same(ttl.Page_db(), null);
if (page_override == null) return Load__fail(hpg);
@@ -85,7 +85,7 @@ public class Xow_hdump_mgr__load {
wpg_head.Itm__hiero().Enabled_ (hpg_head.Hiero_exists());
wpg_head.Itm__timeline().Enabled_ (hpg.Xtn__timeline_exists());
wpg_head.Itm__gallery_styles().Enabled_ (hpg.Xtn__gallery_exists());
wpg_head.Itm__toc().Enabled_(hpg.Hdump_mgr().Toc_wtr().Exists());
wpg_head.Itm__toc().Enabled_(hpg.Html_data().Toc_mgr().Exists());
wpg_head.Itm__pgbnr().Enabled_(hpg.Html_data().Head_mgr().Itm__pgbnr().Enabled());
// transfer images from Xoh_page to Xoae_page

View File

@@ -32,7 +32,7 @@ public class Xow_hdump_mgr__save {
public int Save(Xoae_page page) {
synchronized (tmp_hpg) {
Bld_hdump(page);
tmp_hpg.Ctor_by_page(tmp_bfr, page);
tmp_hpg.Ctor_by_hdiff(tmp_bfr, page);
Xow_db_file html_db = Get_html_db(wiki, page, html_db_is_new.Val_n_());
return Save(tmp_hpg, html_db.Tbl__html(), html_db_is_new.Val());
}

View File

@@ -20,6 +20,7 @@ import gplx.core.brys.*; import gplx.dbs.*;
import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.apps.apis.xowa.bldrs.imports.*;
import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.dbs.*;
import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.data.*;
import gplx.xowa.parsers.*;
public class Xob_hdump_bldr implements Gfo_invk {
private boolean enabled, hzip_enabled, hzip_diff, hzip_b256; private byte zip_tid = Byte_.Max_value_127;
private Xowe_wiki wiki; private Xow_hdump_mgr hdump_mgr; private Xob_hdump_tbl_retriever html_tbl_retriever;
@@ -27,6 +28,9 @@ public class Xob_hdump_bldr implements Gfo_invk {
private int prv_row_len = 0;
private final Xoh_page tmp_hpg = new Xoh_page(); private final Bry_bfr tmp_bfr = Bry_bfr_.New();
private boolean op_sys_is_wnt;
public Xob_hdump_bldr Enabled_(boolean v) {this.enabled = v; return this;}
public Xob_hdump_bldr Hzip_enabled_(boolean v) {this.hzip_enabled = v; return this;}
public Xob_hdump_bldr Hzip_diff_(boolean v) {this.hzip_diff = v; return this;}
public boolean Init(Xowe_wiki wiki, Db_conn make_conn, Xob_hdump_tbl_retriever html_tbl_retriever) {
if (!enabled) return false;
this.op_sys_is_wnt = gplx.core.envs.Op_sys.Cur().Tid_is_wnt();
@@ -38,19 +42,19 @@ public class Xob_hdump_bldr implements Gfo_invk {
hdump_mgr.Init_by_db(zip_tid, hzip_enabled, hzip_b256);
return true;
}
public void Insert(Xoae_page wpg) {
public void Insert(Xop_ctx ctx, Xoae_page wpg) {
// clear
tmp_hpg.Clear(); // NOTE: must clear tmp_hpg or else will leak memory during mass build; DATE:2016-01-09
wpg.File_queue().Clear(); // need to reset uid to 0, else xowa_file_# will resume from last
// write to html
wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_page_.Tid_read).Write_hdump(tmp_bfr, wiki.Parser_mgr().Ctx(), Xoh_wtr_ctx.Hdump, wpg);
wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_page_.Tid_read).Write_hdump(tmp_bfr, ctx, Xoh_wtr_ctx.Hdump, wpg);
byte[] orig_bry = tmp_bfr.To_bry_and_clear();
wpg.Db().Html().Html_bry_(orig_bry);
// save to db
Xowd_html_tbl html_tbl = html_tbl_retriever.Get_html_tbl(wpg.Ttl().Ns(), prv_row_len); // get html_tbl
this.prv_row_len = hdump_mgr.Save_mgr().Save(tmp_hpg.Ctor_by_page(tmp_bfr, wpg), html_tbl, true); // save to db
this.prv_row_len = hdump_mgr.Save_mgr().Save(tmp_hpg.Ctor_by_hdiff(tmp_bfr, wpg), html_tbl, true); // save to db
stat_tbl.Insert(tmp_hpg, stat_itm, wpg.Root().Root_src().length, tmp_hpg.Db().Html().Html_bry().length, prv_row_len); // save stats
// run hzip diff if enabled

View File

@@ -20,7 +20,7 @@ import gplx.dbs.*; import gplx.core.brys.*;
public class Xowd_html_tbl implements Db_tbl {
private final String fld_page_id, fld_head_flag, fld_body_flag, fld_display_ttl, fld_content_sub, fld_sidebar_div, fld_body;
private Db_stmt stmt_select, stmt_insert, stmt_delete, stmt_update;
private final Int_flag_bldr body_flag_bldr = new Int_flag_bldr().Pow_ary_bld_(3, 2); // 8 different zip types; 4 different hzip types
private final Int_flag_bldr body_flag_bldr = Make_body_flag_bldr();
public Xowd_html_tbl(Db_conn conn) {
this.conn = conn;
this.fld_page_id = flds.Add_int_pkey("page_id");
@@ -105,4 +105,5 @@ public class Xowd_html_tbl implements Db_tbl {
stmt.Val_int(fld_head_flag, head_flag).Val_int(fld_body_flag, body_flag)
.Val_bry_as_str(fld_display_ttl, Bry_.Coalesce_to_empty(display_ttl)).Val_bry_as_str(fld_content_sub, Bry_.Coalesce_to_empty(content_sub)).Val_bry_as_str(fld_sidebar_div, Bry_.Coalesce_to_empty(sidebar_div)).Val_bry(fld_body, body);
}
public static Int_flag_bldr Make_body_flag_bldr() {return new Int_flag_bldr().Pow_ary_bld_(3, 2);} // 8 different zip types; 4 different hzip types
}

View File

@@ -0,0 +1,47 @@
/*
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.htmls.core.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*;
import gplx.core.btries.*;
import gplx.xowa.parsers.htmls.*;
class Xoh_display_ttl_wtr {
public static boolean Is_style_restricted(Bry_bfr bfr, Xoh_wtr_ctx hctx, byte[] src, Mwh_atr_itm atr, byte[] atr_key) {
if (atr_key != null
&& Bry_.Eq(atr_key, Atr_key_style)
) {
byte[] atr_val = atr.Val_as_bry(); if (atr_val == null) return false; // bounds_chk
int atr_val_len = atr_val.length;
int atr_pos = 0;
while (atr_pos < atr_val_len) {
byte b = atr_val[atr_pos];
Object o = style_trie.Match_bgn_w_byte(b, atr_val, atr_pos, atr_val_len);
if (o != null) {
bfr.Add(Msg_style_restricted);
return true;
}
++atr_pos;
}
}
return false;
}
private static final byte[]
Atr_key_style = Bry_.new_a7("style")
, Msg_style_restricted = Bry_.new_a7(" style='/* attempt to bypass $wgRestrictDisplayTitle */'")
;
private static final Btrie_slim_mgr style_trie = Btrie_slim_mgr.ci_a7()
.Add_str_byte__many(Byte_.By_int(0), "display", "user-select", "visibility"); // if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) {
}

View File

@@ -16,52 +16,56 @@ 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.htmls.core.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*;
import gplx.core.primitives.*; import gplx.core.net.*; import gplx.core.btries.*;
import gplx.langs.htmls.*; import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*;
import gplx.xowa.wikis.domains.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.lists.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; import gplx.xowa.parsers.tblws.*; import gplx.xowa.parsers.paras.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.miscs.*; import gplx.xowa.parsers.vnts.*; import gplx.xowa.parsers.htmls.*;
import gplx.xowa.xtns.*; import gplx.xowa.xtns.dynamicPageList.*; import gplx.xowa.xtns.math.*; import gplx.xowa.xtns.cites.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.parsers.hdrs.*;
import gplx.xowa.htmls.core.*;
import gplx.core.btries.*;
import gplx.langs.htmls.*; import gplx.xowa.langs.kwds.*;
import gplx.xowa.htmls.core.wkrs.hdrs.*; import gplx.xowa.htmls.core.wkrs.lnkes.*;
public class Xoh_html_wtr {
private Xowe_wiki wiki; private Xoae_app app; private Xoae_page page; private Xop_xatr_whitelist_mgr whitelist_mgr;
import gplx.xowa.wikis.domains.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.lists.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; import gplx.xowa.parsers.tblws.*; import gplx.xowa.parsers.paras.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.miscs.*; import gplx.xowa.parsers.htmls.*;
import gplx.xowa.xtns.*; import gplx.xowa.xtns.cites.*; import gplx.xowa.parsers.hdrs.*;
public class Xoh_html_wtr {
private final Xoae_app app; private final Xowe_wiki wiki; private final Xow_html_mgr html_mgr; private final Xop_xatr_whitelist_mgr whitelist_mgr;
private Xoae_page page;
private int indent_level;
public Xoh_html_wtr(Xowe_wiki wiki, Xow_html_mgr html_mgr) {
this.wiki = wiki; this.app = wiki.Appe(); this.whitelist_mgr = app.Html_mgr().Whitelist_mgr();
this.html_mgr = html_mgr;
lnki_wtr = new Xoh_lnki_wtr(this, wiki, html_mgr, cfg);
ref_wtr = new Ref_html_wtr(wiki);
this.wiki = wiki; this.app = wiki.Appe();
this.html_mgr = html_mgr; this.whitelist_mgr = html_mgr.Whitelist_mgr();
this.lnki_wtr = new Xoh_lnki_wtr(this, wiki, html_mgr, cfg);
this.ref_wtr = new Ref_html_wtr(wiki);
}
public Xoh_html_wtr_cfg Cfg() {return cfg;} private final Xoh_html_wtr_cfg cfg = new Xoh_html_wtr_cfg();
public Xoh_lnke_html Wkr__lnke() {return wkr__lnke;} private final Xoh_lnke_html wkr__lnke = new Xoh_lnke_html();
public Xoh_hdr_html Wkr__hdr() {return wkr__hdr;} private final Xoh_hdr_html wkr__hdr = new Xoh_hdr_html();
public Xoh_lnki_wtr Lnki_wtr() {return lnki_wtr;} private final Xoh_lnki_wtr lnki_wtr;
public Ref_html_wtr Ref_wtr() {return ref_wtr;} private final Ref_html_wtr ref_wtr;
public void Init_by_wiki(Xowe_wiki wiki) {
cfg.Toc__show_(Bool_.Y).Lnki__title_(true).Lnki_visited_y_().Lnki__id_(Bool_.Y); // NOTE: set during Init_by_wiki, b/c all tests assume these are false
ref_wtr.Init_by_wiki(wiki);
}
public Xow_html_mgr Html_mgr() {return html_mgr;} private Xow_html_mgr html_mgr;
public Xoh_html_wtr_cfg Cfg() {return cfg;} private Xoh_html_wtr_cfg cfg = new Xoh_html_wtr_cfg();
public Xoh_lnke_html Wkr__lnke() {return wkr__lnke;} private Xoh_lnke_html wkr__lnke = new Xoh_lnke_html();
public Xoh_hdr_html Wkr__hdr() {return wkr__hdr;} private final Xoh_hdr_html wkr__hdr = new Xoh_hdr_html();
public Xoh_lnki_wtr Lnki_wtr() {return lnki_wtr;} private Xoh_lnki_wtr lnki_wtr;
public Ref_html_wtr Ref_wtr() {return ref_wtr;} private Ref_html_wtr ref_wtr;
public void Init_by_page(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xoae_page page) {this.page = page; lnki_wtr.Init_by_page(ctx, hctx, src, page);}
public void Write_all(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xop_root_tkn root) {Write_all(bfr, ctx, Xoh_wtr_ctx.Basic, src, root);}
public void Write_all(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_root_tkn root) {
public void Init_by_page(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xoae_page page) {
this.page = page;
lnki_wtr.Init_by_page(ctx, hctx, src, page);
}
public void Write_doc(Bry_bfr rv, Xop_ctx ctx, byte[] src, Xop_root_tkn root) {Write_doc(rv, ctx, Xoh_wtr_ctx.Basic, src, root);}
public void Write_doc(Bry_bfr rv, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_root_tkn root) {
try {
indent_level = 0; this.page = ctx.Page();
// init
this.indent_level = 0;
this.page = ctx.Page();
page.Slink_list().Clear(); // HACK: always clear langs; necessary for reload
lnki_wtr.Init_by_page(ctx, hctx, src, ctx.Page());
Write_tkn(bfr, ctx, hctx, src, null, -1, root);
lnki_wtr.Init_by_page(ctx, hctx, src, ctx.Page());
// write document starting from root
Write_tkn(rv, ctx, hctx, src, null, -1, root);
}
finally {
page.Category_list_(page.Html_data().Ctgs_to_ary());
}
}
public void Write_tkn_ary(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_tkn_itm[] ary) {
int ary_len = ary.length;
for (int i = 0; i < ary_len; i++) {
Xop_tkn_itm itm = ary[i];
Write_tkn(bfr, ctx, hctx, src, itm, i, itm);
}
public void Write_tkn_to_html(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_tkn_grp grp, int sub_idx, Xop_tkn_itm tkn) {
this.Write_tkn(bfr, ctx, hctx, src, grp, sub_idx, tkn);
}
public void Write_tkn(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_tkn_grp grp, int sub_idx, Xop_tkn_itm tkn) {
private void Write_tkn(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_tkn_grp grp, int sub_idx, Xop_tkn_itm tkn) {
if (tkn.Ignore()) return;
switch (tkn.Tkn_tid()) {
case Xop_tkn_itm_.Tid_arg_itm:
@@ -71,22 +75,22 @@ public class Xoh_html_wtr {
Write_tkn(bfr, ctx, hctx, src, tkn, i, tkn.Subs_get(i));
break;
case Xop_tkn_itm_.Tid_ignore: break;
case Xop_tkn_itm_.Tid_html_ncr: Html_ncr(ctx, hctx, bfr, src, (Xop_amp_tkn_num)tkn); break;
case Xop_tkn_itm_.Tid_html_ref: Html_ref(ctx, hctx, bfr, src, (Xop_amp_tkn_ent)tkn); break;
case Xop_tkn_itm_.Tid_hr: Hr(ctx, hctx, bfr, src, (Xop_hr_tkn)tkn); break;
case Xop_tkn_itm_.Tid_apos: Apos(ctx, hctx, bfr, src, (Xop_apos_tkn)tkn); break;
case Xop_tkn_itm_.Tid_html_ncr: Html_ncr (bfr, ctx, hctx, src, (Xop_amp_tkn_num)tkn); break;
case Xop_tkn_itm_.Tid_html_ref: Html_ref (bfr, ctx, hctx, src, (Xop_amp_tkn_ent)tkn); break;
case Xop_tkn_itm_.Tid_hr: Hr (bfr, ctx, hctx, src, (Xop_hr_tkn)tkn); break;
case Xop_tkn_itm_.Tid_apos: Apos (bfr, ctx, hctx, src, (Xop_apos_tkn)tkn); break;
case Xop_tkn_itm_.Tid_list: List (bfr, ctx, hctx, src, (Xop_list_tkn)tkn); break;
case Xop_tkn_itm_.Tid_xnde: Xnde (bfr, ctx, hctx, src, (Xop_xnde_tkn)tkn); break;
case Xop_tkn_itm_.Tid_under: Under (bfr, ctx, hctx, src, (Xop_under_tkn)tkn); break;
case Xop_tkn_itm_.Tid_tblw_tb: Tblw (bfr, ctx, hctx, src, (Xop_tblw_tkn)tkn, Gfh_tag_.Table_lhs_bgn , Gfh_tag_.Table_rhs, true); break;
case Xop_tkn_itm_.Tid_tblw_tr: Tblw (bfr, ctx, hctx, src, (Xop_tblw_tkn)tkn, Gfh_tag_.Tr_lhs_bgn , Gfh_tag_.Tr_rhs, false); break;
case Xop_tkn_itm_.Tid_tblw_td: Tblw (bfr, ctx, hctx, src, (Xop_tblw_tkn)tkn, Gfh_tag_.Td_lhs_bgn , Gfh_tag_.Td_rhs, false); break;
case Xop_tkn_itm_.Tid_tblw_th: Tblw (bfr, ctx, hctx, src, (Xop_tblw_tkn)tkn, Gfh_tag_.Th_lhs_bgn , Gfh_tag_.Th_rhs, false); break;
case Xop_tkn_itm_.Tid_tblw_tc: Tblw (bfr, ctx, hctx, src, (Xop_tblw_tkn)tkn, Gfh_tag_.Caption_lhs_bgn , Gfh_tag_.Caption_rhs, false); break;
case Xop_tkn_itm_.Tid_newLine: New_line (bfr, ctx, hctx, src, (Xop_nl_tkn)tkn); break;
case Xop_tkn_itm_.Tid_bry: Bry (bfr, ctx, hctx, src, (Xop_bry_tkn)tkn); break;
case Xop_tkn_itm_.Tid_lnki: lnki_wtr.Write_lnki(bfr, hctx, src, (Xop_lnki_tkn)tkn); break;
case Xop_tkn_itm_.Tid_list: List(ctx, hctx, bfr, src, (Xop_list_tkn)tkn); break;
case Xop_tkn_itm_.Tid_xnde: Xnde(ctx, hctx, bfr, src, (Xop_xnde_tkn)tkn); break;
case Xop_tkn_itm_.Tid_under: Under(ctx, hctx, bfr, src, (Xop_under_tkn)tkn); break;
case Xop_tkn_itm_.Tid_tblw_tb: Tblw(ctx, hctx, bfr, src, (Xop_tblw_tkn)tkn, Tag_tblw_tb_bgn_atr, Tag_tblw_tb_end, true); break;
case Xop_tkn_itm_.Tid_tblw_tr: Tblw(ctx, hctx, bfr, src, (Xop_tblw_tkn)tkn, Tag_tblw_tr_bgn_atr, Tag_tblw_tr_end, false); break;
case Xop_tkn_itm_.Tid_tblw_td: Tblw(ctx, hctx, bfr, src, (Xop_tblw_tkn)tkn, Tag_tblw_td_bgn_atr, Tag_tblw_td_end, false); break;
case Xop_tkn_itm_.Tid_tblw_th: Tblw(ctx, hctx, bfr, src, (Xop_tblw_tkn)tkn, Tag_tblw_th_bgn_atr, Tag_tblw_th_end, false); break;
case Xop_tkn_itm_.Tid_tblw_tc: Tblw(ctx, hctx, bfr, src, (Xop_tblw_tkn)tkn, Tag_tblw_tc_bgn_atr, Tag_tblw_tc_end, false); break;
case Xop_tkn_itm_.Tid_newLine: NewLine(ctx, hctx, bfr, src, (Xop_nl_tkn)tkn); break;
case Xop_tkn_itm_.Tid_bry: Bry(ctx, hctx, bfr, src, (Xop_bry_tkn)tkn); break;
case Xop_tkn_itm_.Tid_lnke: wkr__lnke.Write_html(bfr, this, hctx, ctx, src, (Xop_lnke_tkn)tkn); break;
case Xop_tkn_itm_.Tid_lnke: wkr__lnke.Write_html(bfr, html_mgr, this, hctx, ctx, src, (Xop_lnke_tkn)tkn); break;
case Xop_tkn_itm_.Tid_hdr: wkr__hdr.Write_html(bfr, this, wiki, page, ctx, hctx, cfg, grp, sub_idx, src, (Xop_hdr_tkn)tkn); break;
case Xop_tkn_itm_.Tid_para:
case Xop_tkn_itm_.Tid_pre:
@@ -98,17 +102,17 @@ public class Xoh_html_wtr {
break;
}
}
public void Html_ncr(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_amp_tkn_num tkn) {
private void Html_ncr(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_amp_tkn_num tkn) {
bfr.Add_byte(Byte_ascii.Amp).Add_byte(Byte_ascii.Hash).Add_int_variable(tkn.Val()).Add_byte(Byte_ascii.Semic); // NOTE: do not literalize, else browser may not display multi-char bytes properly; EX: &#160; gets added as &#160; not as {192,160}; DATE:2013-12-09
}
public void Html_ref(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_amp_tkn_ent tkn) {
private void Html_ref(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_amp_tkn_ent tkn) {
if (tkn.Itm_is_custom()) // used by <nowiki>; EX:<nowiki>&#60;</nowiki> -> &xowa_lt; DATE:2014-11-07
tkn.Print_literal(bfr);
else
tkn.Print_ncr(bfr);
}
public void Hr(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_hr_tkn tkn) {bfr.Add(Tag_hr);}
public void Apos(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_apos_tkn apos) {
private void Hr(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_hr_tkn tkn) {bfr.Add(Gfh_tag_.Hr_inl);}
private void Apos(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_apos_tkn apos) {
if (hctx.Mode_is_alt()) return; // ignore apos if alt; EX: [[File:A.png|''A'']] should have alt of A; DATE:2013-10-25
int literal_apos = apos.Apos_lit();
if (literal_apos > 0)
@@ -130,9 +134,8 @@ public class Xoh_html_wtr {
default: throw Err_.new_unhandled(apos.Apos_cmd());
}
}
public static byte[] Ttl_to_title(byte[] ttl) {return ttl;} // FUTURE: swap html chars?
public void List(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_list_tkn list) {
if (hctx.Mode_is_alt()) { // alt; add literally; EX: "*" for "\n*"; note that \n is added in NewLine()
private void List(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_list_tkn list) {
if (hctx.Mode_is_alt()) { // alt; add literally; EX: "*" for "\n*"; note that \n is added in New_line()
if (list.List_bgn() == Bool_.Y_byte) { // bgn tag
bfr.Add_byte(list.List_itmTyp()); // add literal byte
}
@@ -141,73 +144,81 @@ public class Xoh_html_wtr {
else {
byte list_itm_type = list.List_itmTyp();
if (list.List_bgn() == Bool_.Y_byte) {
if (list.List_sub_first()) List_grp_bgn(ctx, hctx, bfr, src, list_itm_type);
List_itm_bgn(ctx, hctx, bfr, src, list_itm_type);
if (list.List_sub_first()) List_grp_bgn(bfr, ctx, hctx, src, list_itm_type);
List_itm_bgn(bfr, ctx, hctx, src, list_itm_type);
}
else {
List_itm_end(ctx, hctx, bfr, src, list_itm_type);
if (list.List_sub_last() == Bool_.Y_byte) List_grp_end(ctx, hctx, bfr, src, list_itm_type);
List_itm_end(bfr, ctx, hctx, src, list_itm_type);
if (list.List_sub_last() == Bool_.Y_byte) List_grp_end(bfr, ctx, hctx, src, list_itm_type);
}
}
}
public void List_grp_bgn(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, byte type) {
private void List_grp_bgn(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, byte type) {
byte[] tag = null;
switch (type) {
case Xop_list_tkn_.List_itmTyp_ol: tag = Tag_list_grp_ol_bgn; break;
case Xop_list_tkn_.List_itmTyp_ul: tag = Tag_list_grp_ul_bgn; break;
case Xop_list_tkn_.List_itmTyp_ol: tag = Gfh_tag_.Ol_lhs; break;
case Xop_list_tkn_.List_itmTyp_ul: tag = Gfh_tag_.Ul_lhs; break;
case Xop_list_tkn_.List_itmTyp_dd:
case Xop_list_tkn_.List_itmTyp_dt: tag = Tag_list_grp_dl_bgn; break;
case Xop_list_tkn_.List_itmTyp_dt: tag = Gfh_tag_.Dl_lhs; break;
default: throw Err_.new_unhandled(type);
}
if (bfr.Len() > 0) bfr.Add_byte_nl(); // NOTE: do not add newLine if start
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
if (!page.Html_data().Writing_hdr_for_toc()) {
if (bfr.Len() > 0) bfr.Add_byte_nl(); // NOTE: do not add newLine if start
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
}
bfr.Add(tag);
++indent_level;
}
public void List_itm_bgn(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, byte type) {
private void List_itm_bgn(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, byte type) {
byte[] tag = null;
switch (type) {
case Xop_list_tkn_.List_itmTyp_ol:
case Xop_list_tkn_.List_itmTyp_ul: tag = Tag_list_itm_li_bgn; break;
case Xop_list_tkn_.List_itmTyp_dt: tag = Tag_list_itm_dt_bgn; break;
case Xop_list_tkn_.List_itmTyp_dd: tag = Tag_list_itm_dd_bgn; break;
case Xop_list_tkn_.List_itmTyp_ul: tag = Gfh_tag_.Li_lhs; break;
case Xop_list_tkn_.List_itmTyp_dt: tag = Gfh_tag_.Dt_lhs; break;
case Xop_list_tkn_.List_itmTyp_dd: tag = Gfh_tag_.Dd_lhs; break;
default: throw Err_.new_unhandled(type);
}
bfr.Add_byte_nl();
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
if (!page.Html_data().Writing_hdr_for_toc()) {
bfr.Add_byte_nl();
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
}
bfr.Add(tag);
++indent_level;
}
public void List_grp_end(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, byte type) {
private void List_grp_end(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, byte type) {
--indent_level;
byte[] tag = null;
switch (type) {
case Xop_list_tkn_.List_itmTyp_ol: tag = Tag_list_grp_ol_end; break;
case Xop_list_tkn_.List_itmTyp_ul: tag = Tag_list_grp_ul_end; break;
case Xop_list_tkn_.List_itmTyp_ol: tag = Gfh_tag_.Ol_rhs; break;
case Xop_list_tkn_.List_itmTyp_ul: tag = Gfh_tag_.Ul_rhs; break;
case Xop_list_tkn_.List_itmTyp_dd:
case Xop_list_tkn_.List_itmTyp_dt: tag = Tag_list_grp_dl_end; break;
case Xop_list_tkn_.List_itmTyp_dt: tag = Gfh_tag_.Dl_rhs; break;
default: throw Err_.new_unhandled(type);
}
bfr.Add_byte_nl();
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
if (!page.Html_data().Writing_hdr_for_toc()) {
bfr.Add_byte_nl();
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
}
bfr.Add(tag);
}
public void List_itm_end(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, byte type) {
private void List_itm_end(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, byte type) {
--indent_level;
byte[] tag = null;
switch (type) {
case Xop_list_tkn_.List_itmTyp_ol:
case Xop_list_tkn_.List_itmTyp_ul: tag = Tag_list_itm_li_end; break;
case Xop_list_tkn_.List_itmTyp_dt: tag = Tag_list_itm_dt_end; break;
case Xop_list_tkn_.List_itmTyp_dd: tag = Tag_list_itm_dd_end; break;
case Xop_list_tkn_.List_itmTyp_ul: tag = Gfh_tag_.Li_rhs; break;
case Xop_list_tkn_.List_itmTyp_dt: tag = Gfh_tag_.Dt_rhs; break;
case Xop_list_tkn_.List_itmTyp_dd: tag = Gfh_tag_.Dd_rhs; break;
default: throw Err_.new_unhandled(type);
}
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
if (!page.Html_data().Writing_hdr_for_toc()) {
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
}
bfr.Add(tag);
}
public void NewLine(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_nl_tkn tkn) {
private void New_line(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_nl_tkn tkn) {
if (hctx.Mode_is_alt())
bfr.Add_byte_space();
else {
@@ -216,25 +227,26 @@ public class Xoh_html_wtr {
}
}
}
public void Bry(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_bry_tkn bry) {
private void Bry(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_bry_tkn bry) {
bfr.Add(bry.Val());
}
public void Under(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_under_tkn under) {
private void Under(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_under_tkn under) {
if (hctx.Mode_is_alt()) return;
switch (under.Under_tid()) {
case Xol_kwd_grp_.Id_toc:
wiki.Html_mgr().Toc_mgr().Html(page, hctx, bfr, false);
if (cfg.Toc__show())
gplx.xowa.htmls.core.wkrs.tocs.Xoh_toc_wtr.Write_placeholder(page, bfr);
break;
case Xol_kwd_grp_.Id_notoc: case Xol_kwd_grp_.Id_forcetoc: // NOTE: skip output; changes flag on page only
break;
}
}
public void Xnde(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) {
private void Xnde(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_xnde_tkn xnde) {
if (hctx.Mode_is_alt()) {
if (xnde.Tag_close_bgn() > 0) // NOTE: some tags are not closed; WP.EX: France; <p>
Xoh_html_wtr_escaper.Escape(app.Parser_amp_mgr(), bfr, src, xnde.Tag_open_end(), xnde.Tag_close_bgn(), true, false);
else
Xnde_subs(ctx, hctx, bfr, src, xnde);
Xnde_subs(bfr, ctx, hctx, src, xnde);
return;
}
Xop_xnde_tag tag = xnde.Tag();
@@ -243,16 +255,16 @@ public class Xoh_html_wtr {
case Xop_xnde_tag_.Tid__br:
if (xnde.Src_end() - xnde.Src_bgn() < 4
|| xnde.Src_bgn() == -1)
bfr.Add(Tag_br); else bfr.Add_mid(src, xnde.Src_bgn(), xnde.Src_end()); break;
case Xop_xnde_tag_.Tid__hr: bfr.Add(Tag_hr); break;
bfr.Add(Gfh_tag_.Br_inl); else bfr.Add_mid(src, xnde.Src_bgn(), xnde.Src_end()); break;
case Xop_xnde_tag_.Tid__hr: bfr.Add(Gfh_tag_.Hr_inl); break;
case Xop_xnde_tag_.Tid__includeonly: // NOTE: do not write tags or content
break;
case Xop_xnde_tag_.Tid__noinclude: // NOTE: do not write tags
case Xop_xnde_tag_.Tid__onlyinclude:
Xnde_subs_escape(ctx, hctx, bfr, src, xnde, false, false);
Xnde_subs_escape(bfr, ctx, hctx, src, xnde, false, false);
break;
case Xop_xnde_tag_.Tid__nowiki:
Xnde_subs_escape(ctx, hctx, bfr, src, xnde, false, false);
Xnde_subs_escape(bfr, ctx, hctx, src, xnde, false, false);
break;
case Xop_xnde_tag_.Tid__b: case Xop_xnde_tag_.Tid__strong:
case Xop_xnde_tag_.Tid__i: case Xop_xnde_tag_.Tid__em: case Xop_xnde_tag_.Tid__cite: case Xop_xnde_tag_.Tid__dfn: case Xop_xnde_tag_.Tid__var:
@@ -276,22 +288,24 @@ public class Xoh_html_wtr {
bfr.Add_byte(Byte_ascii.Angle_bgn).Add(name);
if (xnde.Atrs_bgn() > Xop_tblw_wkr.Atrs_ignore_check) Xnde_atrs(tag_id, hctx, src, xnde.Atrs_bgn(), xnde.Atrs_end(), xnde.Atrs_ary(), bfr);
bfr.Add_byte(Byte_ascii.Angle_end);
Xnde_subs_escape(ctx, hctx, bfr, src, xnde, false, true);
bfr.Add(Tag__end_bgn).Add(name).Add_byte(Byte_ascii.Angle_end);
Xnde_subs_escape(bfr, ctx, hctx, src, xnde, false, true);
Gfh_tag_.Bld_rhs(bfr, name);
break;
}
case Xop_xnde_tag_.Tid__li: {
byte[] name = tag.Name_bry();
int bfr_len = bfr.Len();
if (bfr_len > 0 && bfr.Bfr()[bfr_len - 1] != Byte_ascii.Nl) bfr.Add_byte_nl(); // NOTE: always add nl before li else some lists will merge and force long horizontal bar; EX:w:Music
if (!page.Html_data().Writing_hdr_for_toc()) {
if (bfr_len > 0 && bfr.Bfr()[bfr_len - 1] != Byte_ascii.Nl) bfr.Add_byte_nl(); // NOTE: always add nl before li else some lists will merge and force long horizontal bar; EX:w:Music
}
if (xnde.Tag_visible()) {
bfr.Add_byte(Byte_ascii.Angle_bgn).Add(name);
if (xnde.Atrs_bgn() > Xop_tblw_wkr.Atrs_ignore_check) Xnde_atrs(tag_id, hctx, src, xnde.Atrs_bgn(), xnde.Atrs_end(), xnde.Atrs_ary(), bfr);
bfr.Add_byte(Byte_ascii.Angle_end);
}
Xnde_subs(ctx, hctx, bfr, src, xnde);
Xnde_subs(bfr, ctx, hctx, src, xnde);
if (xnde.Tag_visible())
bfr.Add(Tag__end_bgn).Add(name).Add_byte(Byte_ascii.Angle_end); // NOTE: inline is never written as <b/>; will be written as <b></b>; SEE: NOTE_1
Gfh_tag_.Bld_rhs(bfr, name); // NOTE: inline is never written as <b/>; will be written as <b></b>; SEE: NOTE_1
break;
}
case Xop_xnde_tag_.Tid__timeline: {
@@ -336,7 +350,7 @@ public class Xoh_html_wtr {
case Xop_xnde_tag_.Tid__tabber:
case Xop_xnde_tag_.Tid__tabview:
Xox_xnde xtn = xnde.Xnde_xtn();
xtn.Xtn_write(bfr, app, ctx, this, hctx, xnde, src);
xtn.Xtn_write(bfr, app, ctx, this, hctx, page, xnde, src);
break;
case Xop_xnde_tag_.Tid__xowa_tag_bgn:
case Xop_xnde_tag_.Tid__xowa_tag_end:
@@ -349,16 +363,16 @@ public class Xoh_html_wtr {
return;
}
}
bfr.Add(Ary_escape_bgn).Add(tag.Name_bry()); // escape bgn
bfr.Add_byte(Byte_ascii.Angle_bgn).Add(tag.Name_bry()); // escape bgn
if (xnde.Atrs_bgn() > Xop_tblw_wkr.Atrs_ignore_check) Xnde_atrs(tag_id, hctx, src, xnde.Atrs_bgn(), xnde.Atrs_end(), xnde.Atrs_ary(), bfr);
switch (xnde.CloseMode()) {
case Xop_xnde_tkn.CloseMode_inline:
bfr.Add_byte(Byte_ascii.Slash).Add(Ary_escape_end);
bfr.Add_byte(Byte_ascii.Slash).Add_byte(Byte_ascii.Angle_end);
break;
default: // NOTE: close tag, even if dangling; EX: <center>a -> <center>a</center>
bfr.Add_byte(Byte_ascii.Gt);
Xnde_subs(ctx, hctx, bfr, src, xnde);
bfr.Add(Ary_escape_bgn).Add_byte(Byte_ascii.Slash).Add(tag.Name_bry()).Add(Ary_escape_end);
bfr.Add_byte(Byte_ascii.Angle_end);
Xnde_subs(bfr, ctx, hctx, src, xnde);
bfr.Add_byte(Byte_ascii.Angle_bgn).Add_byte(Byte_ascii.Slash).Add(tag.Name_bry()).Add_byte(Byte_ascii.Angle_end);
break;
}
break;
@@ -367,7 +381,7 @@ public class Xoh_html_wtr {
private void Write_xnde(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, Xop_xnde_tag tag, int tag_id, byte[] src) {
byte[] name = tag.Name_bry();
boolean at_bgn = true;
Bry_bfr ws_bfr = wiki.Utl__bfr_mkr().Get_b512(); // create separate ws_bfr to handle "a<b> c </b>d" -> "a <b>c</b> d"
Bry_bfr ws_bfr = wiki.Utl__bfr_mkr().Get_b512(); // create separate ws_bfr to handle "a<b> c </b>d" -> "a <b>c</b> d"
int subs_len = xnde.Subs_len();
for (int i = 0; i < subs_len; i++) {
Xop_tkn_itm sub = xnde.Subs_get(i);
@@ -387,14 +401,14 @@ public class Xoh_html_wtr {
continue; // just add entity; don't process rest;
}
}
if (ws_bfr.Len() > 0) bfr.Add_bfr_and_clear(ws_bfr); // dump ws_bfr to real bfr
if (ws_bfr.Len() > 0) bfr.Add_bfr_and_clear(ws_bfr); // dump ws_bfr to real bfr
if (at_bgn) { // 1st non-ws tkn; add open tag; <b>
at_bgn = false;
bfr.Add_byte(Byte_ascii.Angle_bgn).Add(name);
if (xnde.Atrs_bgn() > Xop_tblw_wkr.Atrs_ignore_check) Xnde_atrs(tag_id, hctx, src, xnde.Atrs_bgn(), xnde.Atrs_end(), xnde.Atrs_ary(), bfr);
bfr.Add_byte(Byte_ascii.Angle_end);
}
Write_tkn(bfr, ctx, hctx, src, xnde, i, sub); // NOTE: never escape; <p>, <table>, <center> etc may have nested nodes
Write_tkn(bfr, ctx, hctx, src, xnde, i, sub); // NOTE: never escape; <p>, <table>, <center> etc may have nested nodes
break;
}
}
@@ -403,11 +417,11 @@ public class Xoh_html_wtr {
if (xnde.Atrs_bgn() > Xop_tblw_wkr.Atrs_ignore_check) Xnde_atrs(tag_id, hctx, src, xnde.Atrs_bgn(), xnde.Atrs_end(), xnde.Atrs_ary(), bfr);
bfr.Add_byte(Byte_ascii.Angle_end);
}
bfr.Add(Tag__end_bgn).Add(name).Add_byte(Byte_ascii.Angle_end); // NOTE: inline is never written as <b/>; will be written as <b></b>; SEE: NOTE_1
Gfh_tag_.Bld_rhs(bfr, name); // NOTE: inline is never written as <b/>; will be written as <b></b>; SEE: NOTE_1
if (ws_bfr.Len() > 0) bfr.Add_bfr_and_clear(ws_bfr); // dump any leftover ws to bfr; handles "<b>c </b>" -> "<b>c</b> "
ws_bfr.Mkr_rls();
}
public void Xnde_atrs(int tag_id, Xoh_wtr_ctx hctx, byte[] src, int bgn, int end, Mwh_atr_itm[] ary, Bry_bfr bfr) {
}
private void Xnde_atrs(int tag_id, Xoh_wtr_ctx hctx, byte[] src, int bgn, int end, Mwh_atr_itm[] ary, Bry_bfr bfr) {
if (ary == null) return; // NOTE: some nodes will have null xatrs b/c of whitelist; EX: <pre style="overflow:auto">a</pre>; style is not on whitelist so not xatr generated, but xatr_bgn will != -1
int ary_len = ary.length;
for (int i = 0; i < ary_len; i++) {
@@ -417,11 +431,10 @@ public class Xoh_html_wtr {
Xnde_atr_write(bfr, app, hctx, src, atr);
}
}
public static void Xnde_atr_write(Bry_bfr bfr, Xoae_app app, Xoh_wtr_ctx hctx, byte[] src, Mwh_atr_itm atr) {
private static void Xnde_atr_write(Bry_bfr bfr, Xoae_app app, Xoh_wtr_ctx hctx, byte[] src, Mwh_atr_itm atr) {
byte[] atr_key = atr.Key_bry();
if ( hctx.Mode_is_display_title()
&& Xoh_display_ttl_wtr.Instance.Is_style_restricted(bfr, hctx, src, atr, atr_key))
&& Xoh_display_ttl_wtr.Is_style_restricted(bfr, hctx, src, atr, atr_key))
return;
bfr.Add_byte(Byte_ascii.Space); // add space before every attribute
@@ -447,15 +460,13 @@ public class Xoh_html_wtr {
}
bfr.Add_byte(quote_byte);
}
private static void Xnde_atr_write_id(Bry_bfr bfr, Xoae_app app, byte[] bry, int bgn, int end) {
gplx.langs.htmls.encoders.Gfo_url_encoder_.Id.Encode(bfr, bry, bgn, end);
}
private void Xnde_subs(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) {
private static void Xnde_atr_write_id(Bry_bfr bfr, Xoae_app app, byte[] bry, int bgn, int end) {gplx.langs.htmls.encoders.Gfo_url_encoder_.Id.Encode(bfr, bry, bgn, end);}
private void Xnde_subs(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_xnde_tkn xnde) {
int subs_len = xnde.Subs_len();
for (int i = 0; i < subs_len; i++)
Write_tkn(bfr, ctx, hctx, src, xnde, i, xnde.Subs_get(i));
}
private void Xnde_subs_escape(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde, boolean amp_enable, boolean nowiki) {
private void Xnde_subs_escape(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_xnde_tkn xnde, boolean amp_enable, boolean nowiki) {
int xndesubs_len = xnde.Subs_len();
for (int i = 0; i < xndesubs_len; i++) {
Xop_tkn_itm sub = xnde.Subs_get(i);
@@ -474,7 +485,7 @@ public class Xoh_html_wtr {
bfr.Add(Gfh_entity_.Gt_bry);
break;
}
Xnde_subs_escape(ctx, hctx, bfr, src, sub_xnde, amp_enable, false);
Xnde_subs_escape(bfr, ctx, hctx, src, sub_xnde, amp_enable, false);
break;
case Xop_tkn_itm_.Tid_txt:
if (amp_enable)
@@ -488,12 +499,14 @@ public class Xoh_html_wtr {
}
}
}
public void Tblw(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_tblw_tkn tkn, byte[] bgn, byte[] end, boolean tblw_bgn) {
private void Tblw(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_tblw_tkn tkn, byte[] bgn, byte[] end, boolean tblw_bgn) {
if (hctx.Mode_is_alt()) // add \s for each \n
bfr.Add_byte_space();
else {
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
if (!page.Html_data().Writing_hdr_for_toc()) {
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
}
bfr.Add(bgn);
int atrs_bgn = tkn.Atrs_bgn();
if (atrs_bgn != -1) Xnde_atrs(tkn.Tblw_tid(), hctx, src, atrs_bgn, tkn.Atrs_end(), tkn.Atrs_ary(), bfr); //bfr.Add_byte(Byte_ascii.Space).Add_mid(src, atrs_bgn, tkn.Atrs_end());
@@ -509,59 +522,17 @@ public class Xoh_html_wtr {
}
else {
--indent_level;
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
if (!page.Html_data().Writing_hdr_for_toc()) {
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
}
bfr.Add(end);
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
}
}
public static final byte[] Tag__end_quote = Bry_.new_a7("\">"), Tag__end_bgn = Bry_.new_a7("</")
, Tag_hr = Bry_.new_a7("<hr/>"), Tag_br = Bry_.new_a7("<br/>")
, Tag_list_grp_ul_bgn = Bry_.new_a7("<ul>"), Tag_list_grp_ul_end = Bry_.new_a7("</ul>")
, Tag_list_grp_ol_bgn = Bry_.new_a7("<ol>"), Tag_list_grp_ol_end = Bry_.new_a7("</ol>")
, Tag_list_itm_li_bgn = Bry_.new_a7("<li>"), Tag_list_itm_li_end = Bry_.new_a7("</li>")
, Tag_list_itm_dt_bgn = Bry_.new_a7("<dt>"), Tag_list_itm_dt_end = Bry_.new_a7("</dt>")
, Tag_list_itm_dd_bgn = Bry_.new_a7("<dd>"), Tag_list_itm_dd_end = Bry_.new_a7("</dd>")
, Tag_list_grp_dl_bgn = Bry_.new_a7("<dl>"), Tag_list_grp_dl_end = Bry_.new_a7("</dl>")
, File_divider = Bry_.new_a7("---------------------------------")
, Tag_tblw_tb_bgn = Bry_.new_a7("<table>"), Tag_tblw_tb_bgn_atr = Bry_.new_a7("<table"), Tag_tblw_tb_end = Bry_.new_a7("</table>")
, Tag_tblw_tr_bgn = Bry_.new_a7("<tr>"), Tag_tblw_tr_bgn_atr = Bry_.new_a7("<tr"), Tag_tblw_tr_end = Bry_.new_a7("</tr>")
, Tag_tblw_td_bgn = Bry_.new_a7("<td>"), Tag_tblw_td_bgn_atr = Bry_.new_a7("<td"), Tag_tblw_td_end = Bry_.new_a7("</td>")
, Tag_tblw_th_bgn = Bry_.new_a7("<th>"), Tag_tblw_th_bgn_atr = Bry_.new_a7("<th"), Tag_tblw_th_end = Bry_.new_a7("</th>")
, Tag_tblw_tc_bgn = Bry_.new_a7("<caption>"), Tag_tblw_tc_bgn_atr = Bry_.new_a7("<caption"), Tag_tblw_tc_end = Bry_.new_a7("</caption>")
, Ary_escape_bgn = Bry_.new_a7("&lt;"), Ary_escape_end = Bry_.new_a7("&gt;"), Ary_escape_end_bgn = Bry_.new_a7("&lt;/")
;
public static final byte Dir_spr_http = Byte_ascii.Slash;
private int indent_level = 0;
public static final int Sub_idx_null = -1; // nonsense placeholder
}
class Xoh_display_ttl_wtr {
private static final byte[]
Atr_key_style = Bry_.new_a7("style")
, Msg_style_restricted = Bry_.new_a7(" style='/* attempt to bypass $wgRestrictDisplayTitle */'")
;
private Btrie_slim_mgr style_trie = Btrie_slim_mgr.ci_a7()
.Add_str_byte__many(Byte_.By_int(0), "display", "user-select", "visibility"); // if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) {
public boolean Is_style_restricted(Bry_bfr bfr, Xoh_wtr_ctx hctx, byte[] src, Mwh_atr_itm atr, byte[] atr_key) {
if (atr_key != null
&& Bry_.Eq(atr_key, Atr_key_style)
) {
byte[] atr_val = atr.Val_as_bry(); if (atr_val == null) return false; // bounds_chk
int atr_val_len = atr_val.length;
int atr_pos = 0;
while (atr_pos < atr_val_len) {
byte b = atr_val[atr_pos];
Object o = style_trie.Match_bgn_w_byte(b, atr_val, atr_pos, atr_val_len);
if (o != null) {
bfr.Add(Msg_style_restricted);
return true;
}
++atr_pos;
if (!page.Html_data().Writing_hdr_for_toc()) {
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
}
}
return false;
}
public static final Xoh_display_ttl_wtr Instance = new Xoh_display_ttl_wtr(); Xoh_display_ttl_wtr() {}
public static final int Sub_idx_null = -1; // DELETE: placeholder for sub_idx; WHEN: need to remove Sub_grp
}
/*
NOTE_1:inline always written as <tag></tag>, not <tag/>

View File

@@ -25,6 +25,7 @@ public class Xoh_html_wtr_escaper {
}
public static void Escape(Xop_amp_mgr amp_mgr, Bry_bfr bfr, byte[] src, int bgn, int end, boolean interpret_amp, boolean nowiki_skip) {
Btrie_slim_mgr amp_trie = amp_mgr.Amp_trie();
Btrie_rv trv = new Btrie_rv();
for (int i = bgn; i < end; i++) {
byte b = src[i];
switch (b) {
@@ -48,12 +49,12 @@ public class Xoh_html_wtr_escaper {
case Byte_ascii.Amp:
if (interpret_amp) {
int text_bgn = i + 1; // i is &; i + 1 is first char after amp
Object o = (text_bgn < end) ? amp_trie.Match_bgn(src, text_bgn, end) : null; // check if this is a valid &; note must check that text_bgn < end or else arrayIndex error; occurs when src is just "&"; DATE:2013-12-19
Object o = (text_bgn < end) ? amp_trie.Match_at(trv, src, text_bgn, end) : null; // check if this is a valid &; note must check that text_bgn < end or else arrayIndex error; occurs when src is just "&"; DATE:2013-12-19
if (o == null) // invalid; EX: "a&b"; "&bad;"; "&#letters;";
bfr.Add(Gfh_entity_.Amp_bry); // escape & and continue
else { // is either (1) a name or (2) an ncr (hex/dec)
Xop_amp_trie_itm itm = (Xop_amp_trie_itm)o;
int match_pos = amp_trie.Match_pos();
int match_pos = trv.Pos();
int itm_tid = itm.Tid();
switch (itm_tid) {
case Xop_amp_trie_itm.Tid_name_std:

View File

@@ -19,36 +19,31 @@ package gplx.xowa.htmls.core.htmls.tidy; import gplx.*; import gplx.xowa.*; impo
import gplx.core.envs.*;
import gplx.langs.htmls.*;
import gplx.xowa.apps.fsys.*;
public class Xoh_tidy_mgr implements Gfo_invk {
private Xoh_tidy_wkr wkr = Xoh_tidy_wkr_.Wkr_null; // TEST: set default wkr to null
private Xoh_tidy_wkr_tidy wkr_tidy = new Xoh_tidy_wkr_tidy(); private Xoh_tidy_wkr_jtidy wkr_jtidy = new Xoh_tidy_wkr_jtidy();
public class Xoa_tidy_mgr implements Gfo_evt_itm {
public Xoa_tidy_mgr() {this.evt_mgr = new Gfo_evt_mgr(this);}
public Gfo_evt_mgr Evt_mgr() {return evt_mgr;} private final Gfo_evt_mgr evt_mgr;
public Xoh_tidy_wkr_tidy Wkr_tidy() {return wkr_tidy;} private Xoh_tidy_wkr_tidy wkr_tidy = new Xoh_tidy_wkr_tidy(); // NOTE: app-level; not thread-safe; needed b/c of Options and exe/args DATE:2016-07-12
public void Init_by_app(Xoae_app app) {
wkr_tidy.Init_by_app(app);
wkr_jtidy.Init_by_app(app);
Xoa_fsys_eval cmd_eval = app.Url_cmd_eval();
Process_adp.ini_(this, app.Usr_dlg(), wkr_tidy, cmd_eval, Process_adp.Run_mode_sync_timeout, 1 * 60, "~{<>bin_plat_dir<>}tidy" + Op_sys.Cur().Fsys_dir_spr_str() + "tidy", Xoh_tidy_wkr_tidy.Args_fmt, "source", "target");
Wkr_tid_(Xoh_tidy_wkr_.Tid_jtidy);
}
public boolean Enabled() {return enabled;} private boolean enabled = true;
public void Enabled_toggle() {enabled = !enabled;}
public void Wkr_tid_(byte v) {
wkr = v == Xoh_tidy_wkr_.Tid_jtidy
? (Xoh_tidy_wkr)wkr_jtidy
: (Xoh_tidy_wkr)wkr_tidy
;
public void Enabled_toggle() {Enabled_(!enabled);}
public byte Wkr_tid() {return wkr_tid;} private byte wkr_tid = Xoh_tidy_wkr_.Tid_jtidy;
private void Enabled_(boolean v) {
this.enabled = v;
Gfo_evt_mgr_.Pub_val(this, Evt__enabled_changed, v);
}
public void Run_tidy_html(Xoae_page page, Bry_bfr bfr, boolean indent) {
if (bfr.Len_eq_0()) return; // document is empty; do not exec b/c tidy will never generate files for 0 len files, and previous file will remain; DATE:2014-06-04
Tidy_wrap(bfr);
wkr.Indent_(indent);
wkr.Exec_tidy(page, bfr);
Tidy_unwrap(bfr);
public void Wkr_tid_(byte v) {
this.wkr_tid = v;
Gfo_evt_mgr_.Pub_val(this, Evt__engine_changed, v);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_enabled)) return Yn.To_str(enabled);
else if (ctx.Match(k, Invk_enabled_)) enabled = m.ReadYn("v");
else if (ctx.Match(k, Invk_enabled_toggle)) enabled = !enabled;
else if (ctx.Match(k, Invk_engine_type)) return Xoh_tidy_wkr_.Xto_key(wkr.Tid());
else if (ctx.Match(k, Invk_enabled_)) Enabled_(m.ReadYn("v"));
else if (ctx.Match(k, Invk_enabled_toggle)) Enabled_(!enabled);
else if (ctx.Match(k, Invk_engine_type)) return Xoh_tidy_wkr_.Xto_key(wkr_tid);
else if (ctx.Match(k, Invk_engine_type_)) Wkr_tid_(Xoh_tidy_wkr_.Xto_tid(m.ReadStr("v")));
else if (ctx.Match(k, Invk_engine_type_list)) return Xoh_tidy_wkr_.Options__list;
else if (ctx.Match(k, Invk_lib)) return wkr_tidy;
@@ -59,29 +54,5 @@ public class Xoh_tidy_mgr implements Gfo_invk {
Invk_enabled = "enabled", Invk_enabled_ = "enabled_", Invk_enabled_toggle = "enabled_toggle", Invk_lib = "lib"
, Invk_engine_type = "engine_type", Invk_engine_type_ = "engine_type_", Invk_engine_type_list = "engine_type_list"
;
public static void Tidy_wrap(Bry_bfr bfr) {
bfr.Insert_at(0, Wrap_bgn);
bfr.Add(Wrap_end);
}
public static boolean Tidy_unwrap(Bry_bfr bfr) {
byte[] bfr_bry = bfr.Bfr();
int find = Bry_find_.Find_fwd(bfr_bry, Gfh_tag_.Body_lhs); if (find == Bry_find_.Not_found) return false;
bfr.Delete_rng_to_bgn(find + Gfh_tag_.Body_lhs.length);
find = Bry_find_.Find_bwd(bfr_bry, Gfh_tag_.Body_rhs, bfr.Len()); if (find == Bry_find_.Not_found) return false;
bfr.Delete_rng_to_end(find);
return true;
}
private static final byte[] // MW:includes/parser/Tidy.php|getWrapped
Wrap_bgn = Bry_.new_a7
( "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
+ "<html>"
+ "<head>"
+ "<title>test</title>"
+ "</head>"
+ "<body>"
)
, Wrap_end = Bry_.new_a7
( "</body>"
+ "</html>"
);
public static final String Evt__enabled_changed = "enabled_changed", Evt__engine_changed = "engine_changed";
}

View File

@@ -78,12 +78,12 @@ class Xoh_tidy_mgr_fxt {
}
public void Test_wrap(String val, String expd) {
bfr.Add_str_u8(val);
Xoh_tidy_mgr.Tidy_wrap(bfr);
Xow_tidy_mgr.Tidy_wrap(bfr);
Tfds.Eq(expd, bfr.To_str_and_clear());
}
public void Test_unwrap(String val, boolean expd_pass, String expd) {
bfr.Add_str_u8(val);
boolean actl_pass = Xoh_tidy_mgr.Tidy_unwrap(bfr);
boolean actl_pass = Xow_tidy_mgr.Tidy_unwrap(bfr);
if (actl_pass != expd_pass) Tfds.Fail("expd={0} actl={1}", expd_pass, actl_pass);
else if (expd_pass) {
Tfds.Eq(expd, bfr.To_str_and_clear());

View File

@@ -19,5 +19,6 @@ package gplx.xowa.htmls.core.htmls.tidy; import gplx.*; import gplx.xowa.*; impo
public interface Xoh_tidy_wkr {
byte Tid();
void Indent_(boolean v);
void Init_by_app(Xoae_app app);
void Exec_tidy(Xoae_page page, Bry_bfr bfr);
}

View File

@@ -19,7 +19,7 @@ package gplx.xowa.htmls.core.htmls.tidy; import gplx.*; import gplx.xowa.*; impo
public class Xoh_tidy_wkr_ {
public static final byte Tid_null = 0, Tid_tidy = 1, Tid_jtidy = 2;
public static final String Key_null = "null", Key_tidy = "tidy", Key_jtidy = "jtidy";
public static final Xoh_tidy_wkr Wkr_null = new Xoh_tidy_wkr_null();
public static final Xoh_tidy_wkr Wkr_null = new Xoh_tidy_wkr_null();
public static String Xto_key(byte v) {
switch (v) {
case Tid_null: return Key_null;
@@ -39,5 +39,6 @@ public class Xoh_tidy_wkr_ {
class Xoh_tidy_wkr_null implements Xoh_tidy_wkr {
public byte Tid() {return Xoh_tidy_wkr_.Tid_null;}
public void Indent_(boolean v) {}
public void Init_by_app(Xoae_app app) {}
public void Exec_tidy(Xoae_page page, Bry_bfr bfr) {}
}

View File

@@ -0,0 +1,80 @@
/*
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.htmls.core.htmls.tidy; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.htmls.*;
import gplx.langs.htmls.*;
public class Xow_tidy_mgr implements Gfo_evt_itm {
private Xoae_app app; private Xoa_tidy_mgr tidy_mgr;
private boolean enabled = true; private Xoh_tidy_wkr wkr = Xoh_tidy_wkr_.Wkr_null; // TEST: set default wkr to null
public Xow_tidy_mgr() {this.evt_mgr = new Gfo_evt_mgr(this);}
public Gfo_evt_mgr Evt_mgr() {return evt_mgr;} private final Gfo_evt_mgr evt_mgr;
private void Wkr_(byte tid) {
switch (tid) {
case Xoh_tidy_wkr_.Tid_tidy: wkr = tidy_mgr.Wkr_tidy(); break;
case Xoh_tidy_wkr_.Tid_jtidy: wkr = new Xoh_tidy_wkr_jtidy(); break;
case Xoh_tidy_wkr_.Tid_null: wkr = Xoh_tidy_wkr_.Wkr_null; break;
default: throw Err_.new_unhandled_default(tid);
}
wkr.Init_by_app(app);
}
public void Init_by_app(Xoae_app app) {
this.app = app;
this.tidy_mgr = app.Html_mgr().Tidy_mgr();
Gfo_evt_mgr_.Sub_same_many(tidy_mgr, this, Xoa_tidy_mgr.Evt__enabled_changed, Xoa_tidy_mgr.Evt__engine_changed);
this.enabled = tidy_mgr.Enabled();
this.Wkr_(tidy_mgr.Wkr_tid());
}
public void Run_tidy_html(Xoae_page page, Bry_bfr bfr, boolean indent) {
if (!enabled) return;
if (bfr.Len_eq_0()) return; // document is empty; do not exec b/c tidy will never generate files for 0 len files, and previous file will remain; DATE:2014-06-04
Tidy_wrap(bfr);
wkr.Indent_(indent);
wkr.Exec_tidy(page, bfr);
Tidy_unwrap(bfr);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Xoa_tidy_mgr.Evt__enabled_changed)) this.enabled = m.ReadBool("v");
else if (ctx.Match(k, Xoa_tidy_mgr.Evt__engine_changed)) this.Wkr_(m.ReadByte("v"));
else return Gfo_invk_.Rv_unhandled;
return this;
}
public static void Tidy_wrap(Bry_bfr bfr) {
bfr.Insert_at(0, Wrap_bgn);
bfr.Add(Wrap_end);
}
public static boolean Tidy_unwrap(Bry_bfr bfr) {
byte[] bfr_bry = bfr.Bfr();
int find = Bry_find_.Find_fwd(bfr_bry, Gfh_tag_.Body_lhs); if (find == Bry_find_.Not_found) return false;
bfr.Delete_rng_to_bgn(find + Gfh_tag_.Body_lhs.length);
find = Bry_find_.Find_bwd(bfr_bry, Gfh_tag_.Body_rhs, bfr.Len()); if (find == Bry_find_.Not_found) return false;
bfr.Delete_rng_to_end(find);
return true;
}
private static final byte[] // MW:includes/parser/Tidy.php|getWrapped
Wrap_bgn = Bry_.new_a7
( "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
+ "<html>"
+ "<head>"
+ "<title>test</title>"
+ "</head>"
+ "<body>"
)
, Wrap_end = Bry_.new_a7
( "</body>"
+ "</html>"
);
}

View File

@@ -1,46 +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.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*;
import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.tocs.*;
class Xoh_bfr_mgr {
private Xoh_page hpg;
private Bry_bfr html_bfr;
private Bry_bfr bfr_0 = Bry_bfr_.New(), bfr_1 = Bry_bfr_.New();
private boolean toc_mode_is_pgbnr;
public Bry_bfr Init(Xoh_page hpg, Bry_bfr html_bfr) {
this.hpg = hpg; this.html_bfr = html_bfr;
this.toc_mode_is_pgbnr = false;
return bfr_0;
}
public Bry_bfr Split_by_toc(Xoh_data_itm data_itm) {
hpg.Hdump_mgr().Toc_wtr().Exists_y_();
this.toc_mode_is_pgbnr = ((Xoh_toc_data)data_itm).Toc_mode() == Xoh_toc_data.Toc_mode__pgbnr;
if (toc_mode_is_pgbnr)
hpg.Html_data().Head_mgr().Itm__pgbnr().Enabled_y_();
return bfr_1;
}
public void Commit() {
html_bfr.Add_bfr_and_clear(bfr_0);
// calc toc by iterating sections
if (hpg.Hdump_mgr().Toc_wtr().Exists())
html_bfr.Add(hpg.Hdump_mgr().Toc_wtr().To_html(toc_mode_is_pgbnr));
html_bfr.Add_bfr_and_clear(bfr_1);
}
}

View File

@@ -18,12 +18,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*;
import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.btries.*; import gplx.core.threads.poolables.*;
import gplx.langs.htmls.docs.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.*;
import gplx.xowa.wikis.ttls.*;
import gplx.xowa.wikis.ttls.*; import gplx.xowa.htmls.core.wkrs.tocs.*;
public class Xoh_hzip_mgr implements Xoh_hzip_wkr {
private final Xoh_hdoc_wkr hdoc_wkr = new Xoh_hdoc_wkr__hzip();
private final Xoh_hdoc_parser hdoc_parser;
private final Bry_rdr rdr = new Bry_rdr().Dflt_dlm_(Xoh_hzip_dict_.Escape);
private final Xoh_bfr_mgr bfr_mgr = new Xoh_bfr_mgr();
private final Xoh_page_bfr bfr_mgr = new Xoh_page_bfr();
public Xoh_hzip_mgr() {this.hdoc_parser = new Xoh_hdoc_parser(hdoc_wkr);}
public int Tid() {return Xoh_hzip_dict_.Tid__lnke;}
public String Key() {return "root";}
@@ -44,7 +44,9 @@ public class Xoh_hzip_mgr implements Xoh_hzip_wkr {
public void Decode1(Bry_bfr html_bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int src_bgn, int src_end, Xoh_data_itm data_itm) {
int pos = src_bgn, txt_bgn = -1;
boolean toc_enabled = !gplx.core.envs.Op_sys.Cur().Tid_is_drd() && !hctx.Mode_is_diff();
Bry_bfr bfr = toc_enabled ? bfr_mgr.Init(hpg, html_bfr) : html_bfr;
Bry_bfr bfr = html_bfr;
if (toc_enabled)
bfr_mgr.Init(html_bfr);
while (true) {
if (pos == src_end) break;
byte b = src[pos];
@@ -60,11 +62,6 @@ public class Xoh_hzip_mgr implements Xoh_hzip_wkr {
try {
rdr.Init_by_sect(wkr.Key(), pos, pos + hook_len);
Xoh_data_itm data = hctx.Pool_mgr__data().Get_by_tid(wkr.Tid());
if ( data != null
&& toc_enabled
&& data.Tid() == Xoh_hzip_dict_.Tid__toc) {
bfr = bfr_mgr.Split_by_toc(data);
}
wkr.Decode1(bfr, hdoc_wkr, hctx, hpg, rdr, src, pos, src_end, data);
Xoh_wtr_itm wtr = hctx.Pool_mgr__wtr().Get_by_tid(wkr.Tid());
if (data != null && wtr != null) {
@@ -73,6 +70,11 @@ public class Xoh_hzip_mgr implements Xoh_hzip_wkr {
}
if (data != null) data.Pool__rls();
if (wtr != null) wtr.Pool__rls();
if ( data != null
&& toc_enabled
&& data.Tid() == Xoh_hzip_dict_.Tid__toc) {
bfr = bfr_mgr.Split_by_toc(((Xoh_toc_data)data).Toc_mode()); // NOTE: must go after wtr.Init_by_decode else toc_mode flag won't be set correctly
}
pos = rdr.Pos();
} catch (Exception e) {
gplx.langs.htmls.Gfh_utl.Log(e, "hzip decode failed", hpg.Url_bry_safe(), src, pos);
@@ -82,7 +84,7 @@ public class Xoh_hzip_mgr implements Xoh_hzip_wkr {
}
}
if (txt_bgn != -1) bfr.Add_mid(src, txt_bgn, src_end);
if (toc_enabled) bfr_mgr.Commit();
if (toc_enabled) bfr_mgr.Commit(hpg);
}
public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; private int pool_idx;
public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_hzip_mgr rv = new Xoh_hzip_mgr(); rv.pool_mgr = mgr; rv.pool_idx = idx; rv.hook = (byte[])args[0]; return rv;}

View File

@@ -43,7 +43,7 @@ public class Xoh_make_fxt {
public void Test__make(String html, Xoh_page_chkr chkr) {
html = String_.Replace(html, "'", "\"");
Xoh_page actl = new Xoh_page();
actl.Init(parser_fxt.Wiki(), Xoa_url.blank(), parser_fxt.Wiki().Ttl_parse(Xoa_page_.Main_page_bry), 1);
actl.Ctor_by_hview(parser_fxt.Wiki(), Xoa_url.blank(), parser_fxt.Wiki().Ttl_parse(Xoa_page_.Main_page_bry), 1);
Gfo_usr_dlg_.Instance = Gfo_usr_dlg_.Test_console();
Xoh_make_mgr make_mgr = parser_fxt.Wiki().Html__hdump_mgr().Load_mgr().Make_mgr();
byte[] actl_body = make_mgr.Parse(Bry_.new_u8(html), actl, parser_fxt.Wiki());

View File

@@ -51,7 +51,7 @@ public class Xoh_hdoc_ctx {
this.fsys__file__comm = Bry_.Add(fsys__file, Xow_domain_itm_.Bry__commons, Byte_ascii.Slash_bry);
this.fsys__res = gplx.core.envs.Op_sys.Cur().Tid_is_drd() ? Fsys__res__drd : fsys__root;
Xou_cache_mgr cache_mgr = app.User().User_db_mgr().Cache_mgr();
if (cache_mgr != null) file__mgr = Xou_cache_finder_.New_db(cache_mgr); // NOTE: this effectively only loads the cache db in app mode (and not in test mode)
if (cache_mgr != null && cache_mgr.Enabled()) file__mgr = Xou_cache_finder_.New_db(cache_mgr); // NOTE: this effectively only loads the cache db in app mode (and not in test mode)
pool_mgr__hzip.Init();
}
public void Init_by_page(Xow_wiki wiki, Xoa_page page) {

View File

@@ -17,8 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.htmls.core.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*;
import gplx.xowa.htmls.core.hzips.*;
public class Xoh_hzip_bfr extends Bry_bfr { private final Xoh_hzip_int hzint = new Xoh_hzip_int();
private final byte stop_byte;
public class Xoh_hzip_bfr extends Bry_bfr { private final Xoh_hzip_int hzint = new Xoh_hzip_int();
private final byte stop_byte;
public Xoh_hzip_bfr(int bfr_max, boolean mode_is_b256, byte stop_byte) {
this.Init(bfr_max);
this.stop_byte = stop_byte;
@@ -30,6 +30,7 @@ public class Xoh_hzip_bfr extends Bry_bfr { private final Xoh_hzip_int hzint =
}
public Xoh_hzip_bfr Add_hzip_bry(byte[] bry) {Add(bry); Add_byte(stop_byte); return this;}
public Xoh_hzip_bfr Add_hzip_mid(byte[] src, int bgn, int end) {Add_mid(src, bgn, end); Add_byte(stop_byte); return this;}
public Xoh_hzip_bfr Add_hzip_double(double val) {this.Add_double(val); Add_byte(stop_byte); return this;}
public Xoh_hzip_bfr Add_hzip_int(int reqd, int val) {
hzint.Encode(reqd, this, val);
return this;

View File

@@ -30,7 +30,7 @@ public class Xoh_hzip_fxt {
Xoa_app_fxt.repo2_(parser_fxt.App(), wiki); // needed else will be old "mem/wiki/repo/trg/thumb/" instead of standard "mem/file/en.wikipedia.org/thumb/"
wiki.Html__hdump_mgr().Init_by_db(parser_fxt.Wiki());
this.hzip_mgr = parser_fxt.Wiki().Html__hdump_mgr().Hzip_mgr();
hpg.Init(wiki, Xoa_url.blank(), parser_fxt.Wiki().Ttl_parse(Xoa_page_.Main_page_bry), 1);
hpg.Ctor_by_hview(wiki, Xoa_url.blank(), parser_fxt.Wiki().Ttl_parse(Xoa_page_.Main_page_bry), 1);
}
public Xow_wiki Wiki() {return wiki;}
public Xoa_page Page() {return hpg;}

View File

@@ -18,36 +18,64 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.htmls.core.wkrs.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import gplx.langs.htmls.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.hdrs.*;
import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.addons.htmls.tocs.*;
public class Xoh_hdr_html {
public void Write_html(Bry_bfr bfr, Xoh_html_wtr wtr, Xowe_wiki wiki, Xoae_page page, Xop_ctx ctx, Xoh_wtr_ctx hctx, Xoh_html_wtr_cfg cfg, Xop_tkn_grp grp, int sub_idx, byte[] src, Xop_hdr_tkn hdr) {
if (hdr.Hdr_html_first() && cfg.Toc__show() && !page.Hdr_mgr().Toc_manual()) // __TOC__ not specified; place at top; NOTE: if __TOC__ was specified, then it would be placed wherever __TOC__ appears
wiki.Html_mgr().Toc_mgr().Html(ctx.Page(), hctx, bfr, page.Html_data().Xtn_pgbnr() != null);
private final Bry_bfr hdr_text_bfr = Bry_bfr_.New();
private final Xoh_toc_itm invalid_toc_itm = new Xoh_toc_itm().Set__txt(Bry_.Empty, Bry_.Empty);
int hdr_len = hdr.Hdr_level();
if (hdr_len > 0) { // NOTE: need to check hdr_len b/c it could be dangling
public void Write_html(Bry_bfr bfr, Xoh_html_wtr wtr, Xowe_wiki wiki, Xoae_page page, Xop_ctx ctx, Xoh_wtr_ctx hctx, Xoh_html_wtr_cfg cfg, Xop_tkn_grp grp, int sub_idx, byte[] src, Xop_hdr_tkn hdr) {
// init
int hdr_num = hdr.Num();
boolean hdr_is_valid = hdr_num > 0; // hdr_num == 0 when dangling
// register hdr with TOC
byte[] hdr_text_bry = Bld_hdr_html(hdr_text_bfr, wtr, page, ctx, hctx, src, hdr);
Xoh_toc_itm toc_itm = hdr_is_valid && hdr_text_bry.length > 0
? page.Html_data().Toc_mgr().Add(hdr_num, hdr_text_bry)
: invalid_toc_itm;
// write TOC tag if (a) TOC enabled and (b) 1st hdr
if ( hdr.First_in_doc()
&& cfg.Toc__show()
&& page.Wtxt().Toc().Enabled()
&& !page.Wtxt().Toc().Flag__toc()) // __TOC__ not specified; place at top; NOTE: if __TOC__ was specified, then it would be placed wherever __TOC__ appears
gplx.xowa.htmls.core.wkrs.tocs.Xoh_toc_wtr.Write_placeholder(page, bfr);
// write <h#><span>
if (hdr_is_valid) { // NOTE: need to check hdr_num b/c it could be dangling
Xoh_html_wtr_.Para__assert_tag_starts_on_nl(bfr, hdr.Src_bgn());
bfr.Add(Bry__hdr_lhs_bgn).Add_int(hdr_len, 1, 1); // '<h', '2'
bfr.Add(Bry__hdr_lhs_bgn).Add_int(hdr_num, 1, 1); // '<h', '2'
bfr.Add_byte(Byte_ascii.Angle_end); // '>'
if (cfg.Toc__show()) {
bfr.Add(Bry__span_lhs_bgn); // "<span class='mw-headline' id='"
bfr.Add(hdr.Hdr_html_id()); // '1'
bfr.Add(toc_itm.Anch()); // '1'
bfr.Add(Bry__span_lhs_end); // "'>"
}
}
if (hdr.Hdr_bgn_manual() > 0) bfr.Add_byte_repeat(Byte_ascii.Eq, hdr.Hdr_bgn_manual()); // '='
int subs_len = hdr.Subs_len(); // write header; note that this can have embedded html; EX: ==<b>A</b>==
for (int i = 0; i < subs_len; ++i)
wtr.Write_tkn(bfr, ctx, hctx, src, hdr, i, hdr.Subs_get(i));
if (hdr_len > 0) { // NOTE: need to check hdr_len b/c it could be dangling
if (hdr.Hdr_end_manual() > 0) bfr.Add_byte_repeat(Byte_ascii.Eq, hdr.Hdr_end_manual()); // '='
if (hdr.Manual_bgn() > 0) bfr.Add_byte_repeat(Byte_ascii.Eq, hdr.Manual_bgn()); // '='
// write text
bfr.Add(hdr_text_bry);
// write </span></h#>
if (hdr_is_valid) { // NOTE: need to check hdr_num b/c it could be dangling
if (hdr.Manual_end() > 0) bfr.Add_byte_repeat(Byte_ascii.Eq, hdr.Manual_end()); // '='
if (cfg.Toc__show())
bfr.Add(Gfh_tag_.Span_rhs); // '</span>'
bfr.Add(Bry__hdr_rhs_bgn).Add_int(hdr_len, 1, 1); // '</h', '2'
bfr.Add(Bry__hdr_rhs_bgn).Add_int(hdr_num, 1, 1); // '</h', '2'
bfr.Add(Bry__hdr_rhs_end); // '>\n'
}
}
private static final byte[] Bry__hdr_lhs_bgn = Bry_.new_a7("<h"), Bry__hdr_rhs_bgn = Bry_.new_a7("</h"), Bry__hdr_rhs_end = Bry_.new_a7(">\n")
, Bry__span_lhs_bgn = Bry_.new_a7("<span class=\"mw-headline\" id=\""), Bry__span_lhs_end = Bry_.new_a7("\">")
;
public static byte[] Bld_hdr_html(Bry_bfr rv, Xoh_html_wtr wtr, Xoa_page page, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_hdr_tkn hdr) {
page.Html_data().Writing_hdr_for_toc_y_();
int subs_len = hdr.Subs_len(); // write header; note that this can have embedded html; EX: ==<b>A</b>==
for (int i = 0; i < subs_len; ++i)
wtr.Write_tkn_to_html(rv, ctx, hctx, src, hdr, i, hdr.Subs_get(i));
page.Html_data().Writing_hdr_for_toc_n_();
return rv.To_bry_and_clear();
}
}

View File

@@ -16,11 +16,11 @@ 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.htmls.core.wkrs.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import org.junit.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.tocs.*;
import org.junit.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.addons.htmls.tocs.*;
public class Xoh_hdr_hzip_tst {
private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt();
@Before public void init() {Xoh_toc_wtr.Enabled = false;}
@After public void term() {Xoh_toc_wtr.Enabled = true;}
@Before public void init() {Xoh_toc_mgr.Enabled = false;}
@After public void term() {Xoh_toc_mgr.Enabled = true;}
@Test public void Same() {
fxt.Test__bicode(String_.Concat_lines_nl_skip_last
( "~\"'A~"

View File

@@ -36,7 +36,7 @@ public class Xoh_hdr_wtr implements gplx.core.brys.Bfr_arg, Xoh_wtr_itm {
else
hdr_id = Bry_.Replace(hdr_content, Byte_ascii.Space, Byte_ascii.Underline);
hdr_capt_rhs = data.Capt_rhs_exists() ? Bry_.Mid(src, data.Capt_rhs_bgn(), data.Capt_rhs_end()) : Bry_.Empty;
hpg.Hdump_mgr().Toc_wtr().Add(hdr_num, hdr_content);
hpg.Html_data().Toc_mgr().Add(hdr_num, hdr_content);
return true;
}
public void Bfr_arg__add(Bry_bfr bfr) {

View File

@@ -0,0 +1,37 @@
/*
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.htmls.core.wkrs.imgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import gplx.core.brys.*; import gplx.core.primitives.*;
import gplx.langs.htmls.*;
import gplx.xowa.xtns.pagebanners.*;
public class Bfr_arg__pgbnr implements Bfr_arg_clearable {
private Pgbnr_itm pgbnr;
public Bfr_arg__pgbnr Set(Pgbnr_itm pgbnr) {
this.pgbnr = pgbnr;
return this;
}
public void Bfr_arg__clear() {pgbnr = null;}
public boolean Bfr_arg__missing() {return pgbnr == null;}
public void Bfr_arg__add(Bry_bfr bfr) {
if (Bfr_arg__missing()) return;
Gfh_atr_.Add(bfr, Gfh_atr_.Bry__srcset, pgbnr.Srcset());
Gfh_atr_.Add_double(bfr, Pgbnr_itm.Atr_key__data_pos_x, pgbnr.Data_pos_x());
Gfh_atr_.Add_double(bfr, Pgbnr_itm.Atr_key__data_pos_y, pgbnr.Data_pos_y());
Gfh_atr_.Add(bfr, Gfh_atr_.Bry__style, pgbnr.Style());
}
}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.htmls.core.wkrs.imgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import org.junit.*; import gplx.core.envs.*; import gplx.xowa.htmls.core.hzips.*;
public class Xoh_img_bare_hzip__tst {
private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_();
private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_();
private int prv_os_tid = -1;
@Before public void init() {
fxt.Clear();
@@ -26,7 +26,7 @@ public class Xoh_img_bare_hzip__tst {
Op_sys.Cur_(Op_sys.Drd.Tid()); // force drd mode; needed for img_bare
}
@After public void term() {
Op_sys.Cur_(prv_os_tid); // revert back to previous mode; otherwise global Op_sys is set to Drd which will cause other tests to fail (notably tidy)
Op_sys.Cur_(prv_os_tid); // revert back to previous mode; otherwise global Op_sys is set to Drd which will cause other tests to fail (notably tidy)
}
@Test public void Hiero() {
fxt.Test__bicode

View File

@@ -19,7 +19,7 @@ package gplx.xowa.htmls.core.wkrs.imgs; import gplx.*; import gplx.xowa.*; impor
import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.threads.poolables.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.anchs.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*;
import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.files.*;
import gplx.xowa.xtns.imaps.*;
import gplx.xowa.xtns.imaps.*; import gplx.xowa.xtns.pagebanners.*;
public class Xoh_img_data implements Xoh_data_itm {
public int Tid() {return Xoh_hzip_dict_.Tid__img;}
public int Src_bgn() {return src_bgn;} private int src_bgn;
@@ -33,7 +33,7 @@ public class Xoh_img_data implements Xoh_data_itm {
public Bry_obj_ref Anch_page() {return anch_page;} private Bry_obj_ref anch_page = Bry_obj_ref.New_empty();
public Xoh_img_src_data Img_src() {return img_src;} private final Xoh_img_src_data img_src = new Xoh_img_src_data();
public Xoh_img_cls_data Img_cls() {return img_cls;} private final Xoh_img_cls_data img_cls = new Xoh_img_cls_data();
public Xoh_img_xoimg_data Img_xoimg() {return img_xoimg;} private Xoh_img_xoimg_data img_xoimg = new Xoh_img_xoimg_data();
public Xoh_img_xoimg_data Img_xoimg() {return img_xoimg;} private final Xoh_img_xoimg_data img_xoimg = new Xoh_img_xoimg_data();
public int Img_alt_bgn() {return img_alt_bgn;} private int img_alt_bgn;
public int Img_alt_end() {return img_alt_end;} private int img_alt_end;
public boolean Img_alt__diff__anch_title() {return img_alt__diff_anch_title;} private boolean img_alt__diff_anch_title;
@@ -44,12 +44,13 @@ public class Xoh_img_data implements Xoh_data_itm {
public boolean Img_wo_anch() {return img_wo_anch;} private boolean img_wo_anch;
public int Img_imap_idx() {return img_imap_idx;} private int img_imap_idx;
public boolean Img_is_gallery() {return img_is_gallery;} private boolean img_is_gallery; public void Img_is_gallery_(boolean v) {this.img_is_gallery = v;}
public Pgbnr_itm Img_pgbnr() {return img_pgbnr;} private final Pgbnr_itm img_pgbnr = new Pgbnr_itm();
public void Clear() {
this.img_alt__diff_anch_title = anch_rel_is_nofollow = img_is_vid = img_wo_anch = img_is_gallery = false;
this.src_bgn = src_end = anch_title_bgn = anch_title_end = img_w = img_h = img_alt_bgn = img_alt_end = -1;
this.img_imap_idx = -1;
anch_href.Clear(); anch_cls.Clear();
img_src.Clear(); img_cls.Clear(); img_xoimg.Clear();
img_src.Clear(); img_cls.Clear(); img_xoimg.Clear(); img_pgbnr.Clear_by_hdump();
}
public boolean Init_by_parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Gfh_tag_rdr tag_rdr, byte[] src, Gfh_tag anch_head, Gfh_tag unused) {
Gfh_tag img_tag = anch_head;
@@ -76,7 +77,9 @@ public class Xoh_img_data implements Xoh_data_itm {
img_tag = tag_rdr.Tag__move_fwd_head();
}
img_tag.Chk_name_or_fail(Gfh_tag_.Id__img); // <img
// if (img_tag.Atrs__cls_has(gplx.xowa.xtns.pagebanners.Pgbnr_xtn_mgr.Bry__cls__wpb_banner_image)) return false; // ignore pagebanner; EX: <img class="wpb-banner-image">
if (img_tag.Atrs__cls_has(gplx.xowa.xtns.pagebanners.Pgbnr_xtn_mgr.Bry__cls__wpb_banner_image)) { // handle pagebanner; EX: <img class="wpb-banner-image">
img_pgbnr.Init_by_parse(img_tag);
}
img_xoimg.Parse(err_wkr, src, img_tag); // data-xoimg='...'
this.img_w = img_tag.Atrs__get_as_int_or(Gfh_atr_.Bry__width, Xof_img_size.Size__neg1); // width='220'
this.img_h = img_tag.Atrs__get_as_int_or(Gfh_atr_.Bry__height, Xof_img_size.Size__neg1); // height='110'

View File

@@ -20,7 +20,7 @@ import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.threads
import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*; import gplx.langs.htmls.encoders.*;
import gplx.xowa.htmls.hrefs.*; import gplx.xowa.htmls.core.hzips.*;
import gplx.xowa.htmls.core.wkrs.bfr_args.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; import gplx.xowa.htmls.core.wkrs.lnkis.anchs.*;
import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.ttls.*;
import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.xtns.pagebanners.*;
import gplx.xowa.files.*; import gplx.xowa.files.repos.*;
public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm {
private final Bry_bfr tmp_bfr = Bry_bfr_.New_w_size(32);
@@ -45,7 +45,8 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm {
boolean img__alt_diff_from_anch_title = data.Img_alt__diff__anch_title();
boolean file__src_exists = !img_xoimg.Val_dat_exists();
boolean anch_href_diff_file = !img_wo_anch && !Bry_.Match(anch_page.Val(), anch_page.Val_bgn(), anch_page.Val_end(), anch_href.Ttl_page_db());
boolean img__imap_exists = flag_bldr.Set_as_bool(Flag__img__imap_exists , data.Img_imap_idx() != -1);
boolean img__is_imap = flag_bldr.Set_as_bool(Flag__img__is_imap , data.Img_imap_idx() != -1);
boolean img__is_pgbnr = flag_bldr.Set_as_bool(Flag__img__is_pgbnr , data.Img_pgbnr().Exists());
flag_bldr.Set(Flag__img__wo_anch , img_wo_anch);
flag_bldr.Set(Flag__img__is_vid , data.Img_is_vid());
flag_bldr.Set(Flag__file__w_diff_from_html , file__src_exists && data.Img_w__diff__file_w());
@@ -109,13 +110,22 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm {
if (anch_title_exists) bfr.Add_hzip_mid(src, data.Anch_title_bgn(), data.Anch_title_end());
if (img__alt_diff_from_anch_title) bfr.Add_hzip_mid(src, data.Img_alt_bgn(), data.Img_alt_end());
if (img_cls.Other_exists()) bfr.Add_hzip_mid(src, img_cls.Other_bgn(), img_cls.Other_end());
if (img__imap_exists) bfr.Add_hzip_int(1, data.Img_imap_idx());
if (img__is_imap) bfr.Add_hzip_int(1, data.Img_imap_idx());
if (img__is_pgbnr) {
Pgbnr_itm pgbnr = data.Img_pgbnr();
bfr.Add_hzip_double(pgbnr.Data_pos_x());
bfr.Add_hzip_double(pgbnr.Data_pos_y());
bfr.Add_hzip_bry(pgbnr.Srcset());
bfr.Add_hzip_bry(pgbnr.Style_if_not_dflt());
}
return this;
}
public void Decode1(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int src_bgn, int src_end, Xoh_data_itm data_itm) {
// decode flags
Xoh_img_data data = (Xoh_img_data)data_itm; data.Clear();
int flag = rdr.Read_hzip_int(2); flag_bldr.Decode(flag);
boolean img_imap_exists = flag_bldr.Get_as_bool(Flag__img__imap_exists);
boolean img__is_pgbnr = flag_bldr.Get_as_bool(Flag__img__is_pgbnr);
boolean img__is_imap = flag_bldr.Get_as_bool(Flag__img__is_imap);
boolean img_wo_anch = flag_bldr.Get_as_bool(Flag__img__wo_anch);
boolean file__is_orig = flag_bldr.Get_as_bool(Flag__file__is_orig);
boolean file__repo_is_local = flag_bldr.Get_as_bool(Flag__file__repo_is_local);
@@ -130,6 +140,8 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm {
boolean img_is_vid = flag_bldr.Get_as_bool(Flag__img__is_vid);
int img_cls = flag_bldr.Get_as_int(Flag__img__cls_tid);
int anch__href_tid = flag_bldr.Get_as_int(Flag__anch__href_tid);
// get page, file, etc.
byte[] page_db = rdr.Read_bry_to();
byte[] site_bry = null;
switch (anch__href_tid) {
@@ -176,7 +188,20 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm {
img_cls_other_bgn = rdr.Pos();
img_cls_other_end = rdr.Find_fwd_lr();
}
int img_imap_idx = img_imap_exists ? rdr.Read_hzip_int(1) : -1;
// handle imap idx
int img_imap_idx = img__is_imap ? rdr.Read_hzip_int(1) : -1;
// handle pgbnr
if (img__is_pgbnr) {
double data_pos_x = rdr.Read_double_to();
double data_pos_y = rdr.Read_double_to();
byte[] srcset = rdr.Read_bry_to();
byte[] style = rdr.Read_bry_to();
data.Img_pgbnr().Init_by_decode(data_pos_x, data_pos_y, srcset, style);
}
// transform values
boolean anch_rel_is_nofollow = false;
if (anch__href_tid == Xoh_anch_href_data.Tid__inet) {// external links should get rel=nofollow
@@ -234,25 +259,26 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm {
public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; private int pool_idx;
public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_img_hzip rv = new Xoh_img_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; rv.hook = (byte[])args[0]; return rv;}
public static int Md5_depth = 2;
private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_(1, 1, 1, 1, 1, 1 , 1 , 1, 1, 1 , 1 , 2, 1, 1 , 1, 1, 2, 2);
private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_(1, 1, 1, 1, 1, 1, 1 , 1 , 1, 1, 1 , 1 , 2, 1, 1 , 1, 1, 2, 2);
private static final int // SERIALIZED
Flag__img__imap_exists = 0
, Flag__img__wo_anch = 1
, Flag__img__is_vid = 2
, Flag__file__w_diff_from_html = 3
, Flag__file__time_exists = 4
, Flag__file__page_exists = 5
, Flag__file__is_orig = 6
, Flag__file__repo_is_local = 7
, Flag__file__src_exists = 8
, Flag__img__cls_other_exists = 9
, Flag__anch__ns_is_custom = 10
, Flag__anch__cls_tid = 11 // none, image
, Flag__anch__ns_id_needs_saving = 12
, Flag__img__alt_diff_from_anch_title = 13
, Flag__anch__href_diff_file = 14
, Flag__anch__title_missing = 15
, Flag__img__cls_tid = 16 // none, thumbimage, thumbborder
, Flag__anch__href_tid = 17 // wiki, site, anch, inet
Flag__img__is_pgbnr = 0
, Flag__img__is_imap = 1
, Flag__img__wo_anch = 2
, Flag__img__is_vid = 3
, Flag__file__w_diff_from_html = 4
, Flag__file__time_exists = 5
, Flag__file__page_exists = 6
, Flag__file__is_orig = 7
, Flag__file__repo_is_local = 8
, Flag__file__src_exists = 9
, Flag__img__cls_other_exists = 10
, Flag__anch__ns_is_custom = 11
, Flag__anch__cls_tid = 12 // none, image
, Flag__anch__ns_id_needs_saving = 13
, Flag__img__alt_diff_from_anch_title = 14
, Flag__anch__href_diff_file = 15
, Flag__anch__title_missing = 16
, Flag__img__cls_tid = 17 // none, thumbimage, thumbborder
, Flag__anch__href_tid = 18 // wiki, site, anch, inet
;
}

View File

@@ -0,0 +1,35 @@
/*
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.htmls.core.wkrs.imgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import org.junit.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.wikis.nss.*;
public class Xoh_img_hzip__dump__pgbnr__tst {
private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_();
@Before public void Clear() {fxt.Clear();}
@Test public void Basic() {
fxt.Test__bicode
( "~%}$DP@A.png~\"A~~wpb-banner-image ~00"
, "<a href=\"/wiki/File:A.png\" class=\"image\" title=\"A\" xowa_title=\"A.png\"><img data-xowa-title='A.png' data-xoimg='1|-1|-1|-1|-1|-1' src='' width='0' height='0' class='wpb-banner-image ' alt='' srcset='' data-pos-x='0' data-pos-y='0' style='max-width:-1px'></a>"
);
}
@Test public void Data_pos_x() { // PAGE:en.v:Antartica; DATE:2016-07-12
fxt.Test__bicode
( "~%}$DP@A.png~\"A~~wpb-banner-image ~1.20"
, "<a href=\"/wiki/File:A.png\" class=\"image\" title=\"A\" xowa_title=\"A.png\"><img data-xowa-title='A.png' data-xoimg='1|-1|-1|-1|-1|-1' src='' width='0' height='0' class='wpb-banner-image ' alt='' srcset='' data-pos-x='1.2' data-pos-y='0' style='max-width:-1px'></a>"
);
}
}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.htmls.core.wkrs.imgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import org.junit.*; import gplx.xowa.htmls.core.makes.tests.*; import gplx.xowa.parsers.lnkis.*;
public class Xoh_img_make__dump__tst {
private final Xoh_make_fxt fxt = new Xoh_make_fxt();
private final Xoh_make_fxt fxt = new Xoh_make_fxt();
@Before public void Init() {fxt.Clear();}
@Test public void Html_exists__n() {
String

View File

@@ -19,7 +19,7 @@ package gplx.xowa.htmls.core.wkrs.imgs; import gplx.*; import gplx.xowa.*; impor
import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.core.brys.args.*; import gplx.core.brys.fmtrs.*; import gplx.core.threads.poolables.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*; import gplx.langs.htmls.encoders.*;
import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*;
import gplx.xowa.files.*; import gplx.xowa.xtns.imaps.*;
import gplx.xowa.files.*; import gplx.xowa.xtns.imaps.*; import gplx.xowa.xtns.pagebanners.*; import gplx.xowa.parsers.lnkis.*;
public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
private final Bfr_arg_clearable[] arg_ary;
private final Bfr_arg__hatr_arg img_xowa_image = new Bfr_arg__hatr_arg(Xoh_img_xoimg_data.Bry__data_xowa_image);
@@ -34,13 +34,16 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
, img_alt = new Bfr_arg__hatr_bry(Gfh_atr_.Bry__alt)
, img_src = new Bfr_arg__hatr_bry(Gfh_atr_.Bry__src)
, img_cls = new Bfr_arg__hatr_bry(Gfh_atr_.Bry__class)
, img_xowa_title = new Bfr_arg__hatr_bry(Xoh_img_xoimg_data.Bry__data_xowa_title);
, img_xowa_title = new Bfr_arg__hatr_bry(Xoh_img_xoimg_data.Bry__data_xowa_title)
;
private final Bfr_arg__pgbnr img_pgbnr_atrs = new Bfr_arg__pgbnr();
private boolean img_is_vid; private boolean img_wo_anch;
private byte[] xowa_root_dir;
public Xoh_img_wtr() {
arg_ary = new Bfr_arg_clearable[]
{ anch_href, anch_rel, anch_cls, anch_title, anch_xowa_title
, img_id, img_xowa_title, img_xowa_image, img_src, img_w, img_h, img_cls, img_alt
, img_pgbnr_atrs
};
}
public Xof_fsdb_itm Fsdb_itm() {return fsdb_itm;} private Xof_fsdb_itm fsdb_itm;
@@ -66,6 +69,12 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
src_bry = Bry_.Replace(src_bry, Byte_ascii.Question_bry, Bry__qarg__esc); // NOTE: if drd, always escape "?" as "%3F" PAGE:en.w:Cleopatra en.w:Cave_painting; DATE:2016-01-31
img_src.Set_by_bry(src_bry);
}
private void Init_xoimg(Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] lnki_ttl, Xoh_img_xoimg_data img_xowa_image) {
fsdb_itm.Init_at_lnki(Xof_exec_tid.Tid_wiki_page, hpg.Wiki().Domain_itm().Abrv_xo(), lnki_ttl, Xop_lnki_type.To_flag(img_xowa_image.Lnki_type()), img_xowa_image.Lnki_upright(), img_xowa_image.Lnki_w(), img_xowa_image.Lnki_h(), img_xowa_image.Lnki_time(), img_xowa_image.Lnki_page(), Xof_patch_upright_tid_.Tid_all);
hctx.File__mgr().Find(hpg.Wiki(), hpg.Url_bry_safe(), fsdb_itm);
this.img_xowa_image.Set_by_arg(img_xowa_image.Clone()); // NOTE: must clone b/c img_xowa_image is member of Xoh_img_data which is poolable (and cleared); PAGE:en.w:Almagest; DATE:2016-01-05
this.Init_html(fsdb_itm.Html_w(), fsdb_itm.Html_h(), fsdb_itm.Html_view_url().To_http_file_bry());
}
public boolean Init_by_decode(Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_data_itm data_itm) {
Xoh_img_data data = (Xoh_img_data)data_itm;
this.Clear();
@@ -74,12 +83,14 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
this.fsdb_itm = hpg.Img_mgr().Make_img(data.Img_is_gallery());
byte[] file_ttl_bry = data.Img_src().File_ttl_bry();
byte[] lnki_ttl = Xoa_ttl.Replace_spaces(Gfo_url_encoder_.Href_quotes.Decode(file_ttl_bry)); // NOTE: must decode for fsdb.lnki_ttl as well as xowa_title; EX: A%C3%A9b -> A<>b
if (data.Img_xoimg().Val_dat_exists()) {
if (data.Img_pgbnr().Exists()) {
img_pgbnr_atrs.Set(data.Img_pgbnr());
hpg.Html_data().Head_mgr().Itm__pgbnr().Enabled_y_();
this.Init_xoimg(hpg, hctx, lnki_ttl, Xoh_img_xoimg_data.New__pgbnr());
}
else if (data.Img_xoimg().Val_dat_exists()) {
Xoh_img_xoimg_data img_xowa_image = data.Img_xoimg();
fsdb_itm.Init_at_lnki(Xof_exec_tid.Tid_wiki_page, hpg.Wiki().Domain_itm().Abrv_xo(), lnki_ttl, gplx.xowa.parsers.lnkis.Xop_lnki_type.To_flag(img_xowa_image.Lnki_type()), img_xowa_image.Lnki_upright(), img_xowa_image.Lnki_w(), img_xowa_image.Lnki_h(), img_xowa_image.Lnki_time(), img_xowa_image.Lnki_page(), Xof_patch_upright_tid_.Tid_all);
hctx.File__mgr().Find(hpg.Wiki(), hpg.Url_bry_safe(), fsdb_itm);
this.img_xowa_image.Set_by_arg(img_xowa_image.Clone()); // NOTE: must clone b/c img_xowa_image is member of Xoh_img_data which is poolable (and cleared); PAGE:en.w:Almagest; DATE:2016-01-05
this.Init_html(fsdb_itm.Html_w(), fsdb_itm.Html_h(), fsdb_itm.Html_view_url().To_http_file_bry());
this.Init_xoimg(hpg, hctx, lnki_ttl, img_xowa_image);
}
else if (data.Img_w() != -1) {
img_w.Set_by_int(data.Img_w());
@@ -124,8 +135,8 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
private static final byte[] Vid__bry__bgn = Bry_.new_a7("<div class=\"xowa_media_div\">\n<div>");
private static final Bry_fmtr
img_fmtr = Bry_fmtr.new_
( "<a~{anch_href}~{anch_rel}~{anch_cls}~{anch_title}~{anch_xowa_title}><img~{img_id}~{img_xowa_title}~{img_xowa_image}~{img_src}~{img_w}~{img_h}~{img_cls}~{img_alt}></a>"
, "anch_href", "anch_rel", "anch_cls", "anch_title", "anch_xowa_title", "img_id", "img_xowa_title", "img_xowa_image", "img_src", "img_w", "img_h", "img_cls", "img_alt")
( "<a~{anch_href}~{anch_rel}~{anch_cls}~{anch_title}~{anch_xowa_title}><img~{img_id}~{img_xowa_title}~{img_xowa_image}~{img_src}~{img_w}~{img_h}~{img_cls}~{img_alt}~{img_pgbnr_atrs}></a>"
, "anch_href", "anch_rel", "anch_cls", "anch_title", "anch_xowa_title", "img_id", "img_xowa_title", "img_xowa_image", "img_src", "img_w", "img_h", "img_cls", "img_alt", "img_pgbnr_atrs")
, img_wo_anch_fmtr = Bry_fmtr.new_
( "<img~{img_id}~{img_xowa_title}~{img_xowa_image}~{img_src}~{img_w}~{img_h}~{img_cls}~{img_alt}~{img_imap_usemap}>"
, "img_id", "img_xowa_title", "img_xowa_image", "img_src", "img_w", "img_h", "img_cls", "img_alt", "img_imap_usemap")

View File

@@ -16,9 +16,10 @@ 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.htmls.core.wkrs.imgs.atrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.imgs.*;
import gplx.core.brys.*;
import gplx.core.brys.*; import gplx.core.btries.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*;
public class Xoh_img_cls_data implements Bfr_arg_clearable {
private final Btrie_rv trv = new Btrie_rv();
private byte[] src;
public byte Cls_tid() {return cls_tid;} private byte cls_tid;
public int Other_bgn() {return other_bgn;} private int other_bgn;
@@ -41,8 +42,8 @@ public class Xoh_img_cls_data implements Bfr_arg_clearable {
return;
}
int src_end = atr.Val_end();
this.cls_tid = Xoh_img_cls_.Trie.Match_byte_or(src, src_bgn, src_end, Xoh_img_cls_.Tid__manual);
int pos = Xoh_img_cls_.Trie.Match_pos();
this.cls_tid = Xoh_img_cls_.Trie.Match_byte_or(trv, src, src_bgn, src_end, Xoh_img_cls_.Tid__manual);
int pos = trv.Pos();
if (pos < src_end && src[pos] == Byte_ascii.Space)
++pos;
if (cls_tid == Xoh_img_cls_.Tid__manual || pos < src_end) {

View File

@@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.htmls.core.wkrs.imgs.atrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.imgs.*;
import gplx.core.brys.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*;
import gplx.xowa.parsers.lnkis.*; import gplx.xowa.files.*;
public class Xoh_img_xoimg_data implements Bfr_arg_clearable {
private final Bry_rdr rdr = new Bry_rdr().Dflt_dlm_(Byte_ascii.Pipe);
public int Val_bgn() {return val_bgn;} private int val_bgn;
@@ -91,6 +92,11 @@ public class Xoh_img_xoimg_data implements Bfr_arg_clearable {
public static final byte[]
Bry__data_xowa_image = Bry_.new_a7("data-xoimg")
, Bry__data_xowa_title = Bry_.new_a7("data-xowa-title")
, Bry__data_xowa_image__full = Bry_.new_a7("0|-1|-1|-1|-1|-1") // for pagebanner
, Bry__data_xowa_image__full = Bry_.new_a7("1|-1|-1|-1|-1|-1") // for pagebanner
;
public static Xoh_img_xoimg_data New__pgbnr() {
Xoh_img_xoimg_data rv = new Xoh_img_xoimg_data();
rv.Set(Xop_lnki_type.Id_none, Xop_lnki_tkn.Width_null, Xop_lnki_tkn.Height_null, Xop_lnki_tkn.Upright_null, Xof_lnki_time.Null, Xof_lnki_page.Null);
return rv;
}
}

View File

@@ -22,7 +22,7 @@ import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkes.*;
import gplx.xowa.htmls.core.htmls.*;
public class Xoh_lnke_html {
private static final byte[] Disabled_button = Bry_.new_a7("&#x2297;");
public void Write_html(Bry_bfr bfr, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke) {
public void Write_html(Bry_bfr bfr, Xow_html_mgr html_mgr, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke) {
int href_bgn = lnke.Lnke_href_bgn(), href_end = lnke.Lnke_href_end(); boolean proto_is_xowa = lnke.Proto_tid() == Gfo_protocol_itm.Tid_xowa;
byte lnke_type = Calc_type(lnke);
if (proto_is_xowa && hctx.Mode() == Xoh_wtr_ctx.Mode_file_dump) { // if protocol and file-dump, then don't write link; DATE:2016-04-12
@@ -41,7 +41,7 @@ public class Xoh_lnke_html {
Write_caption(bfr, html_wtr, hctx, ctx, src, lnke, href_bgn, href_end, proto_is_xowa);
if (!hctx.Mode_is_alt()) {
if (proto_is_xowa) // add <img />
bfr.Add(Xoh_consts.Img_bgn).Add(html_wtr.Html_mgr().Img_xowa_protocol()).Add(Xoh_consts.__inline_quote);
bfr.Add(Xoh_consts.Img_bgn).Add(html_mgr.Img_xowa_protocol()).Add(Xoh_consts.__inline_quote);
bfr.Add(Gfh_bldr_.Bry__a_rhs);
}
}
@@ -86,7 +86,7 @@ public class Xoh_lnke_html {
}
else { // EX: '[http://a.org a]' -> 'a'
for (int i = 0; i < subs_len; i++)
html_wtr.Write_tkn(bfr, ctx, hctx, src, lnke, i, lnke.Subs_get(i));
html_wtr.Write_tkn_to_html(bfr, ctx, hctx, src, lnke, i, lnke.Subs_get(i));
}
}
private static byte Calc_type(Xop_lnke_tkn lnke) {

View File

@@ -22,13 +22,14 @@ import gplx.xowa.htmls.core.hzips.*;
public class Xoh_lnke_wtr implements gplx.core.brys.Bfr_arg, Xoh_wtr_itm {
private final Bfr_arg__bry anch_href = Bfr_arg__bry.New_empty(), anch_cls = Bfr_arg__bry.New_empty(), anch_content = Bfr_arg__bry.New_empty();
private final Bfr_arg__hatr_bry anch_title = new Bfr_arg__hatr_bry(Gfh_atr_.Bry__title);
private final Xoh_lnke_wtr_arg__autonum autonum_arg = new Xoh_lnke_wtr_arg__autonum();
public boolean Init_by_decode(Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_data_itm data_itm) {
Bfr_arg_.Clear(anch_href, anch_cls, anch_content, anch_title);
Xoh_lnke_data data = (Xoh_lnke_data)data_itm;
anch_href.Set_by_mid(src, data.Href_bgn(), data.Href_end());
anch_cls.Set_by_val(Xoh_lnke_dict_.To_html_class(data.Lnke_tid()));
if (data.Title_exists()) anch_title.Set_by_mid(src, data.Title_bgn(), data.Title_end());
if (data.Auto_exists()) anch_content.Set_by_arg(Xoh_lnke_wtr_arg__autonum.Instance.Set_by_auto_id(data.Auto_id()));
if (data.Auto_exists()) anch_content.Set_by_arg(autonum_arg.Set_by_auto_id(data.Auto_id()));
else if (data.Capt_exists()) anch_content.Set_by_mid(src, data.Capt_bgn(), data.Capt_end());
else anch_content.Set_by_mid(src, data.Href_bgn(), data.Href_end());
return true;
@@ -48,5 +49,4 @@ class Xoh_lnke_wtr_arg__autonum implements Bfr_arg {
public void Bfr_arg__add(Bry_bfr bfr) {
bfr.Add_byte(Byte_ascii.Brack_bgn).Add_int_variable(auto_id).Add_byte(Byte_ascii.Brack_end);
}
public static final Xoh_lnke_wtr_arg__autonum Instance = new Xoh_lnke_wtr_arg__autonum(); Xoh_lnke_wtr_arg__autonum() {}
}

View File

@@ -153,8 +153,10 @@ public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr {
, "<div><a~{id} href=\"~{a_href}\" xowa_title=\"~{a_xowa_title}\" class=\"xowa_media_play\" style=\"width:~{a_width}px;max-width:~{a_max_width}px;\" alt=\"Play sound\"></a></div>"
), "id", "a_width", "a_max_width", "a_href", "a_xowa_title");
public static final Xoh_file_html_fmtr__base Base = new Xoh_file_html_fmtr__base();
public static byte[] Escape_xowa_title(byte[] lnki_ttl) {
return Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_quotes.Encode(lnki_ttl)); // must encode xowa_title, particularly quotes; EX: xowa_title="A"b.png"; PAGE:en.w:Earth DATE:2015-11-27
}
public static byte[] Escape_xowa_title_v2(byte[] lnki_ttl) {
return Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_quotes_v2.Encode(lnki_ttl)); // must encode xowa_title, particularly quotes; EX: xowa_title="A"b.png"; PAGE:en.w:Earth DATE:2015-11-27
}
}

View File

@@ -65,5 +65,4 @@ public class Xoh_file_html_fmtr__hdump extends Xoh_file_html_fmtr__base {
// public override void Html_full_media(Bry_bfr tmp_bfr, byte[] a_href, byte[] a_title, Bfr_arg html) {
// fmtr_full_media.Bld_bfr_many(tmp_bfr, a_href, a_title, html);
// }
public static final Xoh_file_html_fmtr__hdump Hdump = new Xoh_file_html_fmtr__hdump(); Xoh_file_html_fmtr__hdump() {}
}

View File

@@ -25,18 +25,21 @@ public class Xoh_file_wtr__basic {
private final Xowe_wiki wiki; private final Xow_html_mgr html_mgr; private final Xoh_html_wtr html_wtr; private final Bry_bfr_mkr bfr_mkr; private final Bry_bfr scratch_bfr = Bry_bfr_.Reset(Io_mgr.Len_kb);
private final Xoh_lnki_text_fmtr media_alt_fmtr, caption_fmtr;
private final Xop_link_parser tmp_link_parser = new Xop_link_parser(); private Xoa_url tmp_url = Xoa_url.blank(); private final Xoh_lnki_title_fmtr anchor_title_wkr = new Xoh_lnki_title_fmtr();
private Xoh_file_html_fmtr__base html_fmtr = Xoh_file_html_fmtr__base.Base;
private Xoae_page page; private boolean cfg_alt_defaults_to_caption;
private Xoh_file_html_fmtr__base html_fmtr;
private final Xoh_file_html_fmtr__hdump fmtr__hdump = new Xoh_file_html_fmtr__hdump();
private final Xoh_file_html_fmtr__base fmtr__base = new Xoh_file_html_fmtr__base();
public Xoh_file_wtr__basic(Xowe_wiki wiki, Xow_html_mgr html_mgr, Xoh_html_wtr html_wtr) {
this.wiki = wiki; this.html_mgr = html_mgr; this.html_wtr = html_wtr; this.bfr_mkr = wiki.Utl__bfr_mkr();
this.media_alt_fmtr = new Xoh_lnki_text_fmtr(bfr_mkr, html_wtr);
this.caption_fmtr = new Xoh_lnki_text_fmtr(bfr_mkr, html_wtr);
this.html_fmtr = fmtr__base;
}
public Xoh_file_html_fmtr__base Html_fmtr() {return html_fmtr;}
public void Init_by_page(Xoh_wtr_ctx hctx, Xoae_page page) {
this.page = page;
this.cfg_alt_defaults_to_caption = wiki.Appe().Usere().Wiki().Html_mgr().Imgs_mgr().Alt_defaults_to_caption().Val();
html_fmtr = hctx.Mode_is_hdump() ? Xoh_file_html_fmtr__hdump.Hdump : Xoh_file_html_fmtr__hdump.Base;
html_fmtr = hctx.Mode_is_hdump() ? fmtr__hdump : fmtr__base;
}
public void Write_file(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xof_file_itm xfer_itm, byte[] img_alt) {
int uid = xfer_itm.Html_uid();
@@ -49,7 +52,7 @@ public class Xoh_file_wtr__basic {
if (lnki_halign == Xop_lnki_align_h_.Null)
lnki_halign = wiki.Lang().Img_thumb_halign_default(); // if halign is not supplied, then default to align for language
byte[] lnki_halign_bry = Xop_lnki_align_h_.Html_names[lnki_halign];
byte[] lnki_href = wiki.Appe().Html__href_wtr().Build_to_bry(wiki, lnki.Ttl());
byte[] lnki_href = wiki.Html__href_wtr().Build_to_bry(wiki, lnki.Ttl());
byte[] img_view_src = xfer_itm.Html_view_url().To_http_file_bry();
byte[] img_orig_src = xfer_itm.Html_orig_url().To_http_file_bry();
byte[] lnki_ttl = lnki.Ttl().Page_txt();
@@ -146,7 +149,7 @@ public class Xoh_file_wtr__basic {
byte[] xowa_title_bry = tmp_link_parser.Html_xowa_ttl(); // NOTE: xowa_title_bry will be link arg; [[File:A.png|link=file:///A.ogg]] -> A.ogg x> A.png
boolean a_href_is_file = true;
if (xowa_title_bry == null) {xowa_title_bry = lnki_ttl; a_href_is_file = false;}
link_arg = link_arg_html == null ? lnki_href: link_arg_html; // if parse fails, then assign to lnki_href; EX:link={{{1}}}
link_arg = link_arg_html == null ? lnki_href : link_arg_html; // if parse fails, then assign to lnki_href; EX:link={{{1}}}
link_arg = Gfo_url_encoder_.Href_qarg.Encode(link_arg); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16
// if (Bry_.Len_gt_0(tmp_link_parser.Html_xowa_ttl())) lnki_ttl = tmp_link_parser.Html_xowa_ttl(); // DELETE: not sure why this is here; breaks test; DATE:2015-11-28
lnki_file_wkr.Html_full_img(bfr, hctx, page, src, xfer_itm, uid, link_arg, a_href_is_file, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, Xoh_file_html_fmtr__base.Escape_xowa_title(xowa_title_bry), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other);

View File

@@ -20,7 +20,7 @@ import gplx.core.brys.*; import gplx.core.brys.fmtrs.*;
import gplx.xowa.parsers.*;
import gplx.xowa.htmls.core.htmls.*;
public class Xoh_lnki_text_fmtr implements gplx.core.brys.Bfr_arg { // formats alt or caption
private final Bry_bfr_mkr bfr_mkr; private final Xoh_html_wtr html_wtr;
private final Bry_bfr_mkr bfr_mkr; private final Xoh_html_wtr html_wtr;
private Xop_ctx ctx; private Xoh_wtr_ctx hctx; private byte[] src; private Xop_tkn_itm text_tkn; private Bry_fmtr fmtr;
private boolean called_by_alt_as_caption;
public Xoh_lnki_text_fmtr(Bry_bfr_mkr bfr_mkr, Xoh_html_wtr html_wtr) {this.bfr_mkr = bfr_mkr; this.html_wtr = html_wtr;}
@@ -30,7 +30,7 @@ public class Xoh_lnki_text_fmtr implements gplx.core.brys.Bfr_arg { // formats a
}
public void Bfr_arg__add(Bry_bfr bfr) {
Bry_bfr tmp_bfr = bfr_mkr.Get_k004();
html_wtr.Write_tkn(tmp_bfr, ctx, hctx, src, null, Xoh_html_wtr.Sub_idx_null, text_tkn);
html_wtr.Write_tkn_to_html(tmp_bfr, ctx, hctx, src, null, Xoh_html_wtr.Sub_idx_null, text_tkn);
tmp_bfr.Mkr_rls();
byte[] bry = called_by_alt_as_caption
? tmp_bfr.To_bry_and_clear_and_trim() // NOTE: Trim to handle ws-only alt; EX:[[File:A.png|thumb|alt= ]]; en.w:Bird; DATE:2015-12-28
@@ -41,5 +41,5 @@ public class Xoh_lnki_text_fmtr implements gplx.core.brys.Bfr_arg { // formats a
else
fmtr.Bld_bfr_many(bfr, bry);
}
public static final Bry_fmtr Null_fmtr = null;
public static final Bry_fmtr Null_fmtr = null;
}

View File

@@ -101,7 +101,7 @@ public class Xoh_lnki_wtr {
Write_caption(bfr, ctx, hctx, src, lnki, ttl_bry, true, caption_wkr);
else {
bfr.Add(Gfh_bldr_.Bry__a_lhs_w_href); // '<a href="'
app.Html__href_wtr().Build_to_bfr(bfr, app, hctx, wiki.Domain_bry(), lnki_ttl); // '/wiki/A'
wiki.Html__href_wtr().Build_to_bfr(bfr, app, hctx, wiki.Domain_bry(), lnki_ttl); // '/wiki/A'
if (cfg.Lnki__id()) {
int lnki_html_id = lnki.Html_uid();
if (lnki_html_id > Lnki_id_ignore) // html_id=0 for skipped lnkis; EX:anchors and interwiki
@@ -201,6 +201,6 @@ class Xop_lnki_caption_wtr_tkn implements Xop_lnki_caption_wtr {
this.html_wtr = html_wtr;
}
public void Write_tkn(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_tkn_grp grp, int sub_idx, Xop_tkn_itm tkn) {
html_wtr.Write_tkn(bfr, ctx, hctx, src, grp, sub_idx, tkn);
html_wtr.Write_tkn_to_html(bfr, ctx, hctx, src, grp, sub_idx, tkn);
}
}

View File

@@ -25,7 +25,7 @@ public class Xoh_toc_data implements Xoh_data_itm {
public byte Toc_mode() {return toc_mode;} private byte toc_mode;
public void Clear() {
this.src_bgn = this.src_end = -1;
this.toc_mode = Toc_mode__basic;
this.toc_mode = Toc_mode__none;
}
public boolean Init_by_parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Gfh_tag_rdr tag_rdr, byte[] src, Gfh_tag toc_lhs, Gfh_tag unused) {
this.Clear();
@@ -42,5 +42,5 @@ public class Xoh_toc_data implements Xoh_data_itm {
public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; private int pool_idx;
public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_toc_data rv = new Xoh_toc_data(); rv.pool_mgr = mgr; rv.pool_idx = idx; return rv;}
public static final byte Toc_mode__basic = 0, Toc_mode__pgbnr = 1;
public static final byte Toc_mode__basic = 0, Toc_mode__pgbnr = 1, Toc_mode__none = 2; // SERIALIZED
}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.htmls.core.wkrs.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.core.brys.fmtrs.*; import gplx.core.threads.poolables.*; import gplx.core.brys.args.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*;
import gplx.xowa.htmls.sections.*; import gplx.xowa.htmls.core.hzips.*;
import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.sections.*; import gplx.xowa.htmls.core.hzips.*;
public class Xoh_toc_wtr implements gplx.core.brys.Bfr_arg, Xoh_wtr_itm {
private byte toc_mode;
public void Init_by_parse(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_toc_data data) {
@@ -39,13 +39,26 @@ public class Xoh_toc_wtr implements gplx.core.brys.Bfr_arg, Xoh_wtr_itm {
public static final byte[]
Atr__class__toc = Bry_.new_a7("xo-toc")
, Atr__data__toc__mode = Bry_.new_a7("data-toc-mode")
// , Bry__placeholder = Bry_.new_a7("<!--XOWA:TOC-->\n") // NOTE: need to put \n b/c html_wtr always adds \n before each <h2> and TOC usually goes before <h2>; DATE:2016-07-16
;
public static void Write_tag(Bry_bfr bfr, boolean pgbnr_enabled) {
bfr.Add(Gfh_tag_.Div_lhs_bgn);
Gfh_atr_.Add(bfr, Gfh_atr_.Bry__class, Atr__class__toc);
if (pgbnr_enabled)
Gfh_atr_.Add(bfr, Atr__data__toc__mode, Xoh_toc_data.Toc_mode__pgbnr);
Gfh_tag_.Lhs_end_nde(bfr);
Gfh_tag_.Bld_lhs_end_nde(bfr);
bfr.Add(Gfh_tag_.Div_rhs);
}
public static void Write_placeholder(Xoa_page pg, Bry_bfr bfr) {
pg.Html_data().Toc_mgr().Toc_bgn_(bfr.Len());
}
public static void Write_toc(Bry_bfr rv, Xoa_page pg, Xoh_wtr_ctx hctx) {
int toc_bgn = pg.Html_data().Toc_mgr().Toc_bgn(); if (toc_bgn == Bry_find_.Not_found) return; // no TOC
// build body
byte[] bry = rv.To_bry_and_clear(); // NOTE: create bry to free bfr
rv.Add_mid(bry, 0, toc_bgn);
pg.Html_data().Toc_mgr().To_html(rv, hctx, pg.Html_data().Xtn_pgbnr() != null);
rv.Add_mid(bry, toc_bgn, bry.length);
}
}

View File

@@ -60,7 +60,7 @@ public class Xoh_head_mgr implements gplx.core.brys.Bfr_arg {
return this;
}
public Xoh_head_mgr Init_dflts() {
if (page.Hdr_mgr().Toc_enabled()) itm__toc.Enabled_y_();
if (page.Wtxt().Toc().Enabled()) itm__toc.Enabled_y_();
if (wiki.Html_mgr().Head_mgr().Itm__top_icon().Enabled_y()) itm__top_icon.Enabled_y_();
if (wiki.Html_mgr().Head_mgr().Itm__title_rewrite().Enabled_y()) itm__title_rewrite.Enabled_y_();
if (app.Gui_mgr().Search_cfg().Enabled()) itm__search_suggest.Enabled_y_();

View File

@@ -19,9 +19,10 @@ package gplx.xowa.htmls.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xo
import gplx.core.primitives.*; import gplx.core.btries.*; import gplx.core.net.*;
import gplx.xowa.langs.vnts.*;
public class Xoh_href_parser {
private final Btrie_rv trv = new Btrie_rv();
public void Parse_as_url(Xoa_url rv, byte[] raw, Xowe_wiki wiki, byte[] cur_page) {
int bgn = 0;
Object seg_obj = btrie.Match_bgn(raw, bgn, raw.length); // match /wiki/ or /site/ or /xcmd/
Object seg_obj = btrie.Match_at(trv, raw, bgn, raw.length); // match /wiki/ or /site/ or /xcmd/
if (seg_obj == null) {
Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr();
if (vnt_mgr.Enabled() && raw[0] == Byte_ascii.Slash) {
@@ -34,13 +35,13 @@ public class Xoh_href_parser {
else { // something matched
switch (((Byte_obj_val)seg_obj).Val()) {
case Seg_xcmd_tid: // convert "/xcmd/a" to "xowa-cmd:a"
raw = Bry_.Add(Gfo_protocol_itm.Bry_xcmd, Bry_.Mid(raw, btrie.Match_pos()));
raw = Bry_.Add(Gfo_protocol_itm.Bry_xcmd, Bry_.Mid(raw, trv.Pos()));
break;
case Seg_wiki_tid: // add domain_bry; NOTE: needed for url-like pages; EX:"/wiki/http://A"; PAGE:esolangs.org/wiki/Language_list; DATE:2015-11-14
raw = Bry_.Add(wiki.Domain_bry(), raw);
break;
case Seg_site_tid: // skip "/site"
bgn = btrie.Match_pos();
bgn = trv.Pos();
break;
default:
break;

View File

@@ -21,7 +21,7 @@ import gplx.langs.htmls.encoders.*; import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.wikis.xwikis.*;
public class Xoh_href_wtr {
private final Bry_bfr encoder_bfr = Bry_bfr_.Reset(255), tmp_bfr = Bry_bfr_.Reset(255);
private final Gfo_url_encoder encoder = Gfo_url_encoder_.Href;
private final Gfo_url_encoder encoder = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Make();
public byte[] Build_to_bry(Xow_wiki wiki, Xoa_ttl ttl) {
synchronized (tmp_bfr) {
Build_to_bfr(tmp_bfr, wiki.App(), Xoh_wtr_ctx.Basic, wiki.Domain_bry(), ttl);

View File

@@ -54,7 +54,7 @@ public class Xoh_js_cbk implements Gfo_invk {
ctx.Para().Enabled_(para_enabled);
wiki.Parser_mgr().Main().Parse_text_to_wdom(root, ctx, ctx.Tkn_mkr(), raw, 0);
byte[] data = root.Data_mid();
wiki.Html_mgr().Html_wtr().Write_all(bfr, ctx, data, root);
wiki.Html_mgr().Html_wtr().Write_doc(bfr, ctx, data, root);
return bfr.To_str_and_clear();
}
finally {

View File

@@ -30,7 +30,7 @@ class Xoh_js_cleaner_fxt {
if (mgr == null) {
app = Xoa_app_fxt.Make__app__edit();
wiki = Xoa_app_fxt.Make__wiki__edit(app);
mgr = app.Html_mgr().Js_cleaner();
mgr = wiki.Html_mgr().Js_cleaner();
}
} private Xoae_app app; Xowe_wiki wiki; Xoh_js_cleaner mgr;
public void Test_clean(String raw_str, String expd) {

View File

@@ -31,8 +31,8 @@ public class Xow_popup_html_mkr {
wiki.Eval_mgr().Eval_mgr_(fmtr_popup, fmtr_viewed, fmtr_wiki, fmtr_next_sect);
}
public byte[] Bld(Xowe_wiki cur_wiki, Xoae_page page, Xow_popup_itm popup_itm, Bry_bfr wrdx_bfr) {
if (output_js_clean) app.Html_mgr().Js_cleaner().Clean_bfr(wiki, page.Ttl(), wrdx_bfr, 0);
if (output_tidy) app.Html_mgr().Tidy_mgr().Run_tidy_html(page, wrdx_bfr, Bool_.Y);
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().Run_tidy_html(page, wrdx_bfr, Bool_.Y);
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

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.htmls.modules.popups; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.modules.*;
import gplx.core.btries.*;
import gplx.xowa.wikis.domains.*;
import gplx.xowa.apps.apis.xowa.html.modules.*; import gplx.xowa.htmls.modules.popups.keeplists.*; import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.apps.apis.xowa.html.modules.*; import gplx.xowa.htmls.modules.popups.keeplists.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.wkrs.hdrs.*;
import gplx.xowa.guis.views.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.tblws.*; import gplx.xowa.parsers.tmpls.*;
public class Xow_popup_parser {
@@ -27,6 +27,7 @@ public class Xow_popup_parser {
private Xop_ctx tmpl_ctx; private Xop_root_tkn tmpl_root, wtxt_root; private Xot_compile_data tmpl_props = new Xot_compile_data();
private Xoh_wtr_ctx hctx = Xoh_wtr_ctx.Popup;
private Xow_popup_anchor_finder hdr_finder = new Xow_popup_anchor_finder();
private final Bry_bfr hdr_html_bfr = Bry_bfr_.New();
public Xow_popup_cfg Cfg() {return cfg;} private Xow_popup_cfg cfg = new Xow_popup_cfg();
public Xow_popup_wrdx_mkr Wrdx_mkr() {return wrdx_mkr;} private Xow_popup_wrdx_mkr wrdx_mkr = new Xow_popup_wrdx_mkr();
public Xow_popup_html_mkr Html_mkr() {return html_mkr;} private Xow_popup_html_mkr html_mkr = new Xow_popup_html_mkr();
@@ -40,12 +41,12 @@ public class Xow_popup_parser {
}
public void Init_by_wiki(Xowe_wiki wiki) {
this.wiki = wiki; this.app = wiki.Appe(); this.parser = wiki.Parser_mgr().Main(); this.tkn_mkr = app.Parser_mgr().Tkn_mkr();
this.tmpl_ctx = Xop_ctx.new_main_page(wiki); this.wtxt_ctx = Xop_ctx.new_main_page(wiki);
this.tmpl_ctx = Xop_ctx.New__top(wiki); this.wtxt_ctx = Xop_ctx.New__top(wiki);
Xop_lxr_mgr tmpl_lxr_mgr = Xop_lxr_mgr.Popup_lxr_mgr;
tmpl_lxr_mgr.Init_by_wiki(wiki);
this.tmpl_trie = tmpl_lxr_mgr.Trie(); this.wtxt_trie = parser.Wtxt_lxr_mgr().Trie();
tmpl_ctx.Parse_tid_(Xop_parser_.Parse_tid_page_tmpl); wtxt_ctx.Parse_tid_(Xop_parser_.Parse_tid_page_wiki);
tmpl_ctx.Xnde_names_tid_(Xop_parser_.Parse_tid_page_wiki);
tmpl_ctx.Parse_tid_(Xop_parser_tid_.Tid__tmpl); wtxt_ctx.Parse_tid_(Xop_parser_tid_.Tid__wtxt);
tmpl_ctx.Xnde_names_tid_(Xop_parser_tid_.Tid__wtxt);
tmpl_ctx.Tid_is_popup_(true); wtxt_ctx.Tid_is_popup_(true);
tmpl_root = tkn_mkr.Root(Bry_.Empty); wtxt_root = tkn_mkr.Root(Bry_.Empty);
html_mkr.Ctor(app, wiki);
@@ -126,7 +127,7 @@ public class Xow_popup_parser {
Wtxt_ctx_init(false, wrdx_bry);
parser.Parse_to_src_end(wtxt_root, wtxt_ctx, tkn_mkr, wrdx_bry, wtxt_trie, Xop_parser_.Doc_bgn_bos, wrdx_bry.length);
wtxt_ctx.Parser__page_term(wtxt_root, wrdx_bry, wrdx_bry.length);
wiki.Html_mgr().Html_wtr().Write_all(wrdx_bfr, wtxt_ctx, hctx, wrdx_bry, wtxt_root);
wiki.Html_mgr().Html_wtr().Write_doc(wrdx_bfr, wtxt_ctx, hctx, wrdx_bry, wtxt_root);
}
private void Adjust_wrdx_end(Xow_popup_itm popup_itm, Bry_bfr wrdx_bfr) {
popup_itm.Words_found_(data.Words_found());
@@ -185,7 +186,20 @@ public class Xow_popup_parser {
}
if (last_hdr_tkn != null) {
wrdx_bfr.Trim_end(Byte_ascii.Nl);
byte[] last_hdr_bry = ((Xop_hdr_tkn)last_hdr_tkn.Tkn()).Hdr_toc_text();
// reparse hdr b/c existing hdr_tkn has Src_bgn / Src_end, but no src;
byte[] hdr_src = Bry_.Mid(wrdx_bfr.Bfr(), last_hdr_tkn.Bfr_bgn(), last_hdr_tkn.Bfr_end());
Xop_root_tkn hdr_root = wtxt_ctx.Tkn_mkr().Root(hdr_src);
wiki.Parser_mgr().Main().Parse_wtxt_to_wdom(hdr_root, wtxt_ctx, wtxt_ctx.Tkn_mkr(), hdr_src, 0);
byte[] last_hdr_bry = Bry_.Empty;
for (int i = 0; i < hdr_root.Subs_len(); ++i) {
Xop_tkn_itm sub = hdr_root.Subs_get(i);
if (sub.Tkn_tid() == Xop_tkn_itm_.Tid_hdr) {
last_hdr_bry = Xoh_hdr_html.Bld_hdr_html(hdr_html_bfr, wiki.Html_mgr().Html_wtr(), wtxt_ctx.Page(), wtxt_ctx, hctx, hdr_src, (Xop_hdr_tkn)sub);
break;
}
}
// byte[] last_hdr_bry = ((Xop_hdr_tkn)last_hdr_tkn.Tkn()).Hdr_html_text();
html_mkr.Fmtr_next_sect().Bld_bfr_one(wrdx_bfr, last_hdr_bry);
}
else {

View File

@@ -117,7 +117,7 @@ public class Xowh_sidebar_mgr implements Gfo_invk {
private byte[] Resolve_key(byte[] key) {
byte[] val = wiki.Msg_mgr().Val_by_key_obj(key);
if (Bry_.Len_eq_0(val)) val = key; // if key is not found, default to val
return wiki.Parser_mgr().Main().Parse_text_to_wtxt(val);
return wiki.Parser_mgr().Main().Expand_tmpl(val);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_html_grp_fmt_)) html_grp_fmtr.Fmt_(m.ReadBry("v"));

View File

@@ -1,91 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import gplx.langs.htmls.*;
class Xoh_toc_htmlr implements gplx.core.brys.Bfr_arg {
private final Bry_bfr bfr = Bry_bfr_.New();
private final Bry_bfr numbering_bfr = Bry_bfr_.New();
private Ordered_hash itms;
private int prv_lvl;
public void Clear() {
prv_lvl = 0;
}
public byte[] To_html(Ordered_hash itms, byte[] toc_title, boolean toc_mode_is_pgbnr) {
this.itms = itms;
fmtr_div.Bld_many(bfr, toc_mode_is_pgbnr ? Bry_.Empty : Bry_toc_cls, toc_title, this);
return bfr.To_bry_and_clear();
}
public byte[] Test__to_html(Ordered_hash itms) {
this.itms = itms;
Bfr_arg__add(bfr);
return bfr.To_bry_and_clear();
}
public void Bfr_arg__add(Bry_bfr bfr) {
int len = itms.Len();
prv_lvl = 0;
for (int i = 0; i < len; ++i) {
Xoh_toc_itm itm = (Xoh_toc_itm)itms.Get_at(i);
Write(bfr, itm);
}
// close all open levels
for (int i = prv_lvl; i > 0; --i) {
int indent = i * 2;
bfr.Add_byte_repeat(Byte_ascii.Space, indent + 2).Add(Gfh_tag_.Li_rhs).Add_byte_nl(); // EX: " </li>\n"
bfr.Add_byte_repeat(Byte_ascii.Space, indent ).Add(Gfh_tag_.Ul_rhs).Add_byte_nl(); // EX: " </ul>\n"
}
}
private void Write(Bry_bfr bfr, Xoh_toc_itm itm) {
int cur_lvl = itm.Lvl();
int indent = cur_lvl * 2;
switch (CompareAble_.Compare(cur_lvl, prv_lvl)) {
case CompareAble_.More: // start new "<ul>"
bfr.Add_byte_repeat(Byte_ascii.Space, indent).Add(Gfh_tag_.Ul_lhs).Add_byte_nl(); // EX: " <ul>\n"
break;
case CompareAble_.Same: // close old "</li>"; NOTE: Comparable_.Same will never be 1st item (so won't ever get </li><li>)
bfr.Add_byte_repeat(Byte_ascii.Space, indent + 2).Add(Gfh_tag_.Li_rhs).Add_byte_nl(); // EX: " </li>\n"
break;
case CompareAble_.Less: // close old "</ul>" and "</li>"
for (int j = prv_lvl; j > cur_lvl; --j) {
bfr.Add_byte_repeat(Byte_ascii.Space, (j * 2) + 2).Add(Gfh_tag_.Li_rhs).Add_byte_nl(); // EX: " </li>\n"
bfr.Add_byte_repeat(Byte_ascii.Space, (j * 2) ).Add(Gfh_tag_.Ul_rhs).Add_byte_nl(); // EX: " </ul>\n"
}
bfr.Add_byte_repeat(Byte_ascii.Space, indent + 2).Add(Gfh_tag_.Li_rhs).Add_byte_nl(); // EX: " </li>\n"
break;
default: throw Err_.new_unhandled_default(CompareAble_.Compare(cur_lvl, prv_lvl));
}
// write "<li ..."
bfr.Add_byte_repeat(Byte_ascii.Space, indent); // indent
fmtr_itm.Bld_many(bfr, itm.Lvl(), itm.Uid(), itm.Anch(), itm.Path_to_bry(numbering_bfr), itm.Text());
prv_lvl = cur_lvl;
}
private static final byte[] Bry_toc_cls = Bry_.new_a7(" id=\"toc\" class=\"toc\"");
private final Bry_fmt
fmtr_div = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last
( "<div~{toc}>"
, " <div id=\"toctitle\">"
, " <h2>~{contents_title}</h2>"
, " </div>"
, "~{itms}</div>"
, ""
))
, fmtr_itm = Bry_fmt.Auto
( " <li class=\"toclevel-~{level} tocsection-~{toc_idx}\"><a href=\"#~{anchor}\"><span class=\"tocnumber\">~{heading}</span> <span class=\"toctext\">~{text}</span></a>\n"
);
}

View File

@@ -1,175 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import org.junit.*; import gplx.core.tests.*;
public class Xoh_toc_htmlr__basic__tst {
@Before public void init() {fxt.Clear();} private final Xoh_toc_htmlr__basic__fxt fxt = new Xoh_toc_htmlr__basic__fxt();
@Test public void D1_S0_S0() {
fxt.Init__add(2, "a");
fxt.Init__add(2, "b");
fxt.Init__add(2, "c");
fxt.Test__html_itms
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-2\"><a href=\"#b\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-3\"><a href=\"#c\"><span class=\"tocnumber\">3</span> <span class=\"toctext\">c</span></a>"
, " </li>"
, " </ul>"
);
}
@Test public void D1_D1_D1() {
fxt.Init__add(2, "a");
fxt.Init__add(3, "a_a");
fxt.Init__add(4, "a_a_a");
fxt.Test__html_itms
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-2\"><a href=\"#a_a\"><span class=\"tocnumber\">1.1</span> <span class=\"toctext\">a_a</span></a>"
, " <ul>"
, " <li class=\"toclevel-3 tocsection-3\"><a href=\"#a_a_a\"><span class=\"tocnumber\">1.1.1</span> <span class=\"toctext\">a_a_a</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
);
}
@Test public void D1_D1_S0_U1() {
fxt.Init__add(2, "a");
fxt.Init__add(3, "a_a");
fxt.Init__add(3, "a_b");
fxt.Init__add(2, "b");
fxt.Test__html_itms
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-2\"><a href=\"#a_a\"><span class=\"tocnumber\">1.1</span> <span class=\"toctext\">a_a</span></a>"
, " </li>"
, " <li class=\"toclevel-2 tocsection-3\"><a href=\"#a_b\"><span class=\"tocnumber\">1.2</span> <span class=\"toctext\">a_b</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-4\"><a href=\"#b\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " </ul>"
);
}
@Test public void D1_D1_U1_D1() {
fxt.Init__add(2, "a");
fxt.Init__add(3, "a_a");
fxt.Init__add(2, "b");
fxt.Init__add(3, "b_a");
fxt.Test__html_itms
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-2\"><a href=\"#a_a\"><span class=\"tocnumber\">1.1</span> <span class=\"toctext\">a_a</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-3\"><a href=\"#b\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">b</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-4\"><a href=\"#b_a\"><span class=\"tocnumber\">2.1</span> <span class=\"toctext\">b_a</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
);
}
@Test public void D1_D1_D1_U2() {
fxt.Init__add(2, "a");
fxt.Init__add(3, "a_a");
fxt.Init__add(4, "a_a_a");
fxt.Init__add(2, "b");
fxt.Test__html_itms
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-2\"><a href=\"#a_a\"><span class=\"tocnumber\">1.1</span> <span class=\"toctext\">a_a</span></a>"
, " <ul>"
, " <li class=\"toclevel-3 tocsection-3\"><a href=\"#a_a_a\"><span class=\"tocnumber\">1.1.1</span> <span class=\"toctext\">a_a_a</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-4\"><a href=\"#b\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " </ul>"
);
}
@Test public void D1_D2_U1_D1() {
fxt.Init__add(2, "a");
fxt.Init__add(4, "a_a_a_a");
fxt.Init__add(3, "a_a_a");
fxt.Init__add(4, "a_a_a_b");
fxt.Test__html_itms
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-2\"><a href=\"#a_a_a_a\"><span class=\"tocnumber\">1.1</span> <span class=\"toctext\">a_a_a_a</span></a>"
, " </li>"
, " <li class=\"toclevel-2 tocsection-3\"><a href=\"#a_a_a\"><span class=\"tocnumber\">1.2</span> <span class=\"toctext\">a_a_a</span></a>"
, " <ul>"
, " <li class=\"toclevel-3 tocsection-4\"><a href=\"#a_a_a_b\"><span class=\"tocnumber\">1.2.1</span> <span class=\"toctext\">a_a_a_b</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
);
}
@Test public void Div() {
fxt.Init__init_page("Table of contents", false);
fxt.Init__add(2, "a");
fxt.Init__add(2, "b");
fxt.Init__add(2, "c");
fxt.Test__html_div
( "<div id=\"toc\" class=\"toc\">"
, " <div id=\"toctitle\">"
, " <h2>Table of contents</h2>"
, " </div>"
, " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-2\"><a href=\"#b\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-3\"><a href=\"#c\"><span class=\"tocnumber\">3</span> <span class=\"toctext\">c</span></a>"
, " </li>"
, " </ul>"
, "</div>"
);
}
}
class Xoh_toc_htmlr__basic__fxt {
private final Xoh_toc_wtr wtr = new Xoh_toc_wtr();
public void Clear() {wtr.Clear();}
public void Init__add(int hdr_num, String hdr_txt) {wtr.Add(hdr_num, Bry_.new_u8(hdr_txt));}
public void Init__init_page(String toc_title, boolean page_banner) {wtr.Init(Bry_.new_u8(toc_title), Bry_.Empty);}
public void Test__html_itms(String... expd_ary) {
Gftest.Eq__ary(expd_ary, String_.Ary(Bry_split_.Split_lines(wtr.Test__to_html())));
}
public void Test__html_div(String... expd_ary) {
Gftest.Eq__ary(expd_ary, String_.Ary(Bry_split_.Split_lines(wtr.To_html(false))));
}
}

View File

@@ -1,35 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
public class Xoh_toc_itm {// EX: <li class="toclevel-3 tocsection-3"><a href="#aaa"><span class="tocnumber">1.1.1</span> <span class="toctext">aaa</span></a></li>
public int Uid() {return uid;} private int uid; // uid of itm; HTML: "tocsection-3"
public int Lvl() {return lvl;} private int lvl; // indent level; HTML: "toclevel-3"
public int[] Path() {return path;} private int[] path; // path of itm; HTML: "1.1.1"
public byte[] Anch() {return anch;} private byte[] anch; // HTML: "#aaa"
public byte[] Text() {return text;} private byte[] text; // HTML: "aaa"
public byte[] Path_to_bry(Bry_bfr bfr) {
int len = path.length;
for (int i = 0; i < len; ++i) {
if (i != 0) bfr.Add_byte_dot();
bfr.Add_int_variable(path[i]);
}
return bfr.To_bry_and_clear();
}
public void Set__lvl(int uid, int lvl, int[] path) {this.uid = uid; this.lvl = lvl; this.path = path;}
public void Set__txt(byte[] anch, byte[] text) {this.anch = anch; this.text = text;}
}

View File

@@ -1,75 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
class Xoh_toc_wkr__lvl {
private static final int Toc_lvls_max = 7;
private final int[] sub_lvl_count = new int[Toc_lvls_max], lvl_count = new int[Toc_lvls_max];
private int prv_lvl, toc_lvl, prv_toc_lvl;
private int uid = 0;
public void Clear() {
uid = prv_lvl = toc_lvl = prv_toc_lvl = 0;
}
public void Calc_level(Xoh_toc_itm rv, int lvl) { // REF.MW:Parser.php!formatHeadings
if (lvl > prv_lvl) { // Increase TOC lvl
toc_lvl++;
sub_lvl_count[toc_lvl - List_adp_.Base1] = 0;
if (toc_lvl < Toc_lvls_max) {
prv_toc_lvl = toc_lvl;
// $toc .= Linker::tocIndent();
}
}
else if (lvl < prv_lvl && toc_lvl > 1) {// Decrease TOC lvl, find lvl to jump to
int i = toc_lvl;
for (; i > 0; i--) {
int cur_lvl_count = lvl_count[i];
if (cur_lvl_count == lvl) { // Found last matching lvl
toc_lvl = i;
break;
}
else if (cur_lvl_count < lvl) { // Found first matching lvl below current lvl
toc_lvl = i + 1;
break;
}
}
if (i == 0)
toc_lvl = 1;
if (toc_lvl < Toc_lvls_max) {
if (prv_toc_lvl < Toc_lvls_max) {
// Unindent only if the previous toc lvl was shown :p
// $toc .= Linker::tocUnindent( $prv_toc_lvl - $toc_lvl );
prv_toc_lvl = toc_lvl;
} else {
// $toc .= Linker::tocLineEnd();
}
}
}
else { // No change in lvl, end TOC line
if (toc_lvl < Toc_lvls_max) {
// $toc .= Linker::tocLineEnd();
}
}
lvl_count[toc_lvl] = lvl;
sub_lvl_count[toc_lvl - List_adp_.Base1] = sub_lvl_count[toc_lvl - List_adp_.Base1] + 1;
prv_lvl = lvl; // NOTE: same as "if ( $toclevel ) $prevlevel = $level;" but at end of block
// Tfds.Write(lvl, prv_lvl, lvl, toc_lvl, Int_.Ary_concat(",", lvl_count), Int_.Ary_concat(",", sub_lvl_count));
int[] copy = new int[toc_lvl];
Int_.Ary_copy_to(sub_lvl_count, toc_lvl, copy);
rv.Set__lvl(++uid, toc_lvl, copy);
}
}

View File

@@ -1,66 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import org.junit.*; import gplx.core.tests.*;
public class Xoh_toc_wkr__lvl__basic__tst {
@Before public void init() {fxt.Clear();} private final Xoh_toc_wkr__lvl__fxt fxt = new Xoh_toc_wkr__lvl__fxt();
@Test public void D1_S0_S0() {
fxt.Test__calc(2, fxt.Make(1, 1, Int_.Ary(1)));
fxt.Test__calc(2, fxt.Make(2, 1, Int_.Ary(2)));
fxt.Test__calc(2, fxt.Make(3, 1, Int_.Ary(3)));
}
@Test public void D1_D1_D1() {
fxt.Test__calc(2, fxt.Make(1, 1, Int_.Ary(1)));
fxt.Test__calc(3, fxt.Make(2, 2, Int_.Ary(1, 1)));
fxt.Test__calc(4, fxt.Make(3, 3, Int_.Ary(1, 1, 1)));
}
@Test public void D1_D1_S0_U1() {
fxt.Test__calc(2, fxt.Make(1, 1, Int_.Ary(1)));
fxt.Test__calc(3, fxt.Make(2, 2, Int_.Ary(1, 1)));
fxt.Test__calc(3, fxt.Make(3, 2, Int_.Ary(1, 2)));
fxt.Test__calc(2, fxt.Make(4, 1, Int_.Ary(2)));
}
@Test public void D1_D1_U1_D1() {
fxt.Test__calc(2, fxt.Make(1, 1, Int_.Ary(1)));
fxt.Test__calc(3, fxt.Make(2, 2, Int_.Ary(1, 1)));
fxt.Test__calc(2, fxt.Make(3, 1, Int_.Ary(2)));
fxt.Test__calc(3, fxt.Make(4, 2, Int_.Ary(2, 1)));
}
@Test public void D1_D1_D1_U2() {
fxt.Test__calc(2, fxt.Make(1, 1, Int_.Ary(1)));
fxt.Test__calc(3, fxt.Make(2, 2, Int_.Ary(1, 1)));
fxt.Test__calc(4, fxt.Make(3, 3, Int_.Ary(1, 1, 1)));
fxt.Test__calc(2, fxt.Make(4, 1, Int_.Ary(2)));
}
}
class Xoh_toc_wkr__lvl__fxt {
private final Xoh_toc_wkr__lvl wkr = new Xoh_toc_wkr__lvl();
private final Xoh_toc_itm actl = new Xoh_toc_itm();
public void Clear() {wkr.Clear();}
public Xoh_toc_itm Make(int uid, int lvl, int[] path) {
Xoh_toc_itm rv = new Xoh_toc_itm();
rv.Set__lvl(uid, lvl, path);
return rv;
}
public void Test__calc(int lvl, Xoh_toc_itm expd) {
wkr.Calc_level(actl, lvl);
Gftest.Eq__int(expd.Uid(), actl.Uid(), "uid");
Gftest.Eq__int(expd.Lvl(), actl.Lvl(), "lvl");
Gftest.Eq__ary(expd.Path(), actl.Path(), "path");
}
}

View File

@@ -1,173 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*; import gplx.langs.htmls.encoders.*;
import gplx.xowa.parsers.amps.*; import gplx.core.primitives.*;
class Xoh_toc_wkr__txt {
private final Gfh_tag_rdr tag_rdr = Gfh_tag_rdr.New__html();
private final Bry_bfr anch_bfr = Bry_bfr_.New(), text_bfr = Bry_bfr_.New();
private final Gfo_url_encoder anch_encoder = Gfo_url_encoder_.New__id();
private final Xop_amp_mgr amp_mgr = Xop_amp_mgr.Instance;
private final Hash_adp anch_hash = Hash_adp_bry.ci_u8(gplx.xowa.langs.cases.Xol_case_mgr_.U8());
private byte[] page_name;
public void Clear() {
anch_bfr.Clear();
text_bfr.Clear();
anch_hash.Clear();
}
public void Calc_anch_text(Xoh_toc_itm rv, byte[] page_name, byte[] src) { // text within hdr; EX: <h2>Abc</h2> -> Abc
this.page_name = page_name;
int end = src.length;
src = Remove_comment(text_bfr, src, 0, end);
end = src.length;
tag_rdr.Init(page_name, src, 0, end);
Calc_anch_text_recurse(src, 0, end);
byte[] anch_bry = anch_bfr.To_bry_and_clear_and_trim(Bool_.Y, Bool_.Y, id_trim_ary);
if (anch_hash.Has(anch_bry)) {
int anch_idx = 2;
while (true) { // NOTE: this is not big-O performant, but it mirrors MW; DATE:2016-07-09
byte[] anch_tmp = Bry_.Add(anch_bry, Byte_ascii.Underline_bry, Int_.To_bry(anch_idx++));
if (!anch_hash.Has(anch_tmp)) {
anch_bry = anch_tmp;
break;
}
}
}
anch_hash.Add_as_key_and_val(anch_bry);
rv.Set__txt
( anch_bry
, text_bfr.To_bry_and_clear_and_trim()); // NOTE: both id and text trim ends
}
private void Calc_anch_text_recurse(byte[] src, int pos, int end) {
tag_rdr.Src_rng_(pos, end);
while (pos < end) {
Gfh_tag lhs = tag_rdr.Tag__move_fwd_head();
int tag_id = lhs.Name_id();
byte[] span_dir = null;
// add any text before lhs;
int txt_end = lhs.Src_bgn();
switch (tag_id) {
case Gfh_tag_.Id__eos: txt_end = end; break; // eos; print everything until end
}
// add any text before tag
if (pos < txt_end) {
byte[] anch_bry = amp_mgr.Decode_as_bry(Bry_.Mid(src, pos, txt_end));
anch_encoder.Encode(anch_bfr, anch_bry);
text_bfr.Add_mid(src, pos, txt_end);
}
// set print_tag tag; REF.MW:Parser.php!formatHeadings
boolean print_tag = false;
switch (tag_id) {
case Gfh_tag_.Id__eos: // eos; return;
return;
case Gfh_tag_.Id__sup: // always print tag; REF.MW:Parser.php!formatHeadings!"Allowed tags are"
case Gfh_tag_.Id__sub:
case Gfh_tag_.Id__i:
case Gfh_tag_.Id__b:
case Gfh_tag_.Id__bdi:
print_tag = true;
break;
case Gfh_tag_.Id__span: // print span only if it has a dir attribute
span_dir = lhs.Atrs__get_as_bry(Gfh_atr_.Bry__dir);
print_tag = Bry_.Len_gt_0(span_dir);
break;
case Gfh_tag_.Id__comment: // never print tag
case Gfh_tag_.Id__any: // all other tags never print
default:
print_tag = false;
break;
}
// get lhs / rhs vars
byte[] lhs_bry = lhs.Name_bry();
int lhs_end = lhs.Src_end();
// ignore tags which are not closed by tidy as default; EX: <br> not <br>a</br> or <br/>
boolean lhs_is_dangling = false;
switch (tag_id) {
case Gfh_tag_.Id__img:
case Gfh_tag_.Id__br:
case Gfh_tag_.Id__hr:
lhs_is_dangling = true;
break;
}
boolean lhs_is_pair = !lhs.Tag_is_inline() && !lhs_is_dangling;
int rhs_bgn = -1, rhs_end = -1, new_pos = lhs_end;
if (lhs_is_pair) { // get rhs unless inline
if (tag_id == Gfh_tag_.Id__any) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "unknown tag: page=~{0} tag=~{1}", page_name, lhs_bry);
Gfh_tag rhs = tag_rdr.Tag__move_fwd_tail(lhs_bry);
rhs_bgn = rhs.Src_bgn(); rhs_end = rhs.Src_end();
new_pos = rhs_end;
}
else {
Gfh_tag rhs = tag_rdr.Tag__move_fwd_tail(tag_id);
rhs_bgn = rhs.Src_bgn(); rhs_end = rhs.Src_end();
new_pos = rhs_end;
}
}
// print "<tag></tag>"; also, recurse
if (print_tag) {
text_bfr.Add_byte(Byte_ascii.Angle_bgn).Add(lhs_bry);
if (span_dir != null) // if span has dir, add it; EX: <span id='1' dir='rtl'> -> <span dir='rtl'>
Gfh_atr_.Add(text_bfr, Gfh_atr_.Bry__dir, span_dir);
text_bfr.Add_byte(Byte_ascii.Angle_end); // only add name; do not add atrs; EX: <i id='1'> -> <i>
}
Calc_anch_text_recurse(src, lhs_end, rhs_bgn);
if (print_tag && lhs_is_pair)
text_bfr.Add_mid(src, rhs_bgn, rhs_end);
// set new_pos
pos = new_pos;
tag_rdr.Src_rng_(new_pos, end); // NOTE: must reinit pos and especially end
}
}
public static byte[] Remove_comment(Bry_bfr tmp, byte[] src, int bgn, int end) {
boolean dirty = false, append_to_eos = true;
int pos = bgn;
while (true) {
int comm_bgn = Bry_find_.Find_fwd(src, Gfh_tag_.Comm_bgn, pos, end);
if (comm_bgn != -1) { // comment found
int tmp_pos = comm_bgn + Gfh_tag_.Comm_bgn_len;
int comm_end = Bry_find_.Find_fwd(src, Gfh_tag_.Comm_end, tmp_pos, end);
if (comm_end == -1) { // dangling
tmp.Add_mid(src, pos, comm_bgn);
append_to_eos = false;
}
else {
dirty = true;
tmp.Add_mid(src, pos, comm_bgn);
pos = comm_end + Gfh_tag_.Comm_end_len;
continue;
}
}
break;
}
if (dirty && append_to_eos) {
tmp.Add_mid(src, pos, end);
}
return dirty ? tmp.To_bry_and_clear() : src;
}
private static final byte[] id_trim_ary = Bry_.mask_(256, Byte_ascii.Underline_bry);
}

View File

@@ -1,64 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import org.junit.*; import gplx.core.tests.*;
public class Xoh_toc_wkr__txt__basic__tst {
@Before public void init() {fxt.Clear();} private final Xoh_toc_wkr__txt__fxt fxt = new Xoh_toc_wkr__txt__fxt();
@Test public void Basic() {
fxt.Test__both("a b c", "a_b_c", "a b c");
}
@Test public void Ws() {
fxt.Test__both(" a b ", "a_b", "a b");
}
@Test public void Amp__ncr() {
fxt.Test__both("&#91;a&#93;", ".5Ba.5D", "&#91;a&#93;");
}
@Test public void Encode() {
fxt.Test__both("a+b", "a.2Bb", "a+b");
}
@Test public void Comment() {
fxt.Test__text("a<!--b-->c", "ac");
}
@Test public void Remove_comment__one() {
fxt.Test__remove_comment("a<!--b-->c", "ac");
}
@Test public void Remove_comment__many() {
fxt.Test__remove_comment("1<!--2-->3<!--4-->5", "135");
}
@Test public void Remove_comment__dangling() {
fxt.Test__remove_comment("1<!--2-->3<!--4->5", "13");
}
}
class Xoh_toc_wkr__txt__fxt {
private final Xoh_toc_wkr__txt wkr = new Xoh_toc_wkr__txt();
private final Xoh_toc_itm itm = new Xoh_toc_itm();
private final Bry_bfr tmp = Bry_bfr_.New();
public void Clear() {wkr.Clear();}
public void Test__anch(String html, String expd_anch) {Test__both(html, expd_anch, null);}
public void Test__text(String html, String expd_text) {Test__both(html, null, expd_text);}
public void Test__both(String html, String expd) {Test__both(html, expd, expd);}
public void Test__both(String html, String expd_anch, String expd_text) {
wkr.Calc_anch_text(itm, Bry_.Empty, Bry_.new_u8(html));
if (expd_anch != null) Gftest.Eq__str(expd_anch, itm.Anch(), "anch");
if (expd_text != null) Gftest.Eq__str(expd_text, itm.Text(), "text");
}
public void Test__remove_comment(String html, String expd) {
byte[] html_bry = Bry_.new_u8(html);
Gftest.Eq__str(expd, Xoh_toc_wkr__txt.Remove_comment(tmp, html_bry, 0, html_bry.length));
}
}

View File

@@ -1,42 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import org.junit.*; import gplx.core.tests.*;
public class Xoh_toc_wkr__txt__dupe__tst {
@Before public void init() {fxt.Clear();} private final Xoh_toc_wkr__txt__fxt fxt = new Xoh_toc_wkr__txt__fxt();
@Test public void Basic() {
fxt.Test__anch("a" , "a");
fxt.Test__anch("a" , "a_2");
}
@Test public void Case_insensitive() {
fxt.Test__anch("a" , "a");
fxt.Test__anch("A" , "A_2");
}
@Test public void Autonumber_exists() { // PAGE:fr.w:Itanium; EX: Itanium,Itanium_2,Itanium
fxt.Test__anch("a" , "a");
fxt.Test__anch("a_2" , "a_2");
fxt.Test__anch("a" , "a_3");
}
@Test public void Autonumber_exists_2() {
fxt.Test__anch("a_2" , "a_2");
fxt.Test__anch("a" , "a");
fxt.Test__anch("a" , "a_3");
fxt.Test__anch("a" , "a_4");
fxt.Test__anch("a_2" , "a_2_2");
}
}

View File

@@ -1,42 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import org.junit.*; import gplx.core.tests.*;
public class Xoh_toc_wkr__txt__xnde__tst {
@Before public void init() {fxt.Clear();} private final Xoh_toc_wkr__txt__fxt fxt = new Xoh_toc_wkr__txt__fxt();
@Test public void I() {fxt.Test__both("<i>a</i>" , "a", "<i>a</i>");}
@Test public void I__id() {fxt.Test__both("<i id='1'>a</i>" , "a", "<i>a</i>");}
@Test public void B() {fxt.Test__both("<b>a</b>" , "a", "<b>a</b>");}
@Test public void Sup() {fxt.Test__both("<sup>a</sup>" , "a", "<sup>a</sup>");}
@Test public void Sub() {fxt.Test__both("<sub>a</sub>" , "a", "<sub>a</sub>");}
@Test public void Bdi() {fxt.Test__both("<bdi>a</bdi>" , "a", "<bdi>a</bdi>");}
@Test public void Span() {fxt.Test__both("<span>a</span>" , "a", "a");}
@Test public void Span__id() {fxt.Test__both("<span id='1'>a</span>" , "a", "a");}
@Test public void Span__dir() {fxt.Test__both("<span dir=\"ltr\">a</span>" , "a", "<span dir=\"ltr\">a</span>");}
@Test public void Span__dir_id() {fxt.Test__both("<span id='1' dir=\"ltr\">a</span>" , "a", "<span dir=\"ltr\">a</span>");}
@Test public void Small() {fxt.Test__text("<small>a</small>" , "a");}
@Test public void A() {fxt.Test__both("<a href=\"/wiki/A\">b</a>" , "b");}
@Test public void A__nest() {fxt.Test__both("<a href=\"/wiki/A\">b<i>c</i>d</a>" , "bcd", "b<i>c</i>d");}
@Test public void Br() {fxt.Test__both("a<br/>b" , "ab");}
@Test public void Br__dangling() {fxt.Test__both("a<br>b" , "ab");}
@Test public void H2() {fxt.Test__both("a<h2>b</h2>c" , "abc");} // NOTE: not a valid test; MW actually generates "ab" b/c of tidy; see corresponding edit test; DATE:2016-06-28
@Test public void Li() {fxt.Test__text("a<ul><li>b</li></ul>c" , "abc");}
@Test public void Table() {fxt.Test__text("a<table><tr><td>b</td></tr></table>c" , "abc");}
@Test public void Unknown__i() {fxt.Test__both("a<unknown>b<i>c</i>d</unknown>e" , "abcde", "ab<i>c</i>de");} // PURPOSE: unknown tags should not fail; DATE:2016-07-09
@Test public void Unknown__a() {fxt.Test__both("a<unknown>b<a>c</a>d</unknown>e" , "abcde");} // PURPOSE: unknown tags should not fail; DATE:2016-07-09
}

View File

@@ -1,51 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import gplx.xowa.htmls.core.wkrs.tocs.*;
public class Xoh_toc_wtr {
private final Ordered_hash itms = Ordered_hash_.New_bry();
private final Xoh_toc_wkr__lvl lvl_wkr = new Xoh_toc_wkr__lvl();
private final Xoh_toc_wkr__txt txt_wkr = new Xoh_toc_wkr__txt();
private final Xoh_toc_htmlr htmlr = new Xoh_toc_htmlr();
private byte[] toc_title, page_name;
public void Clear() {
itms.Clear();
lvl_wkr.Clear();
txt_wkr.Clear();
htmlr.Clear();
this.exists = false;
}
public boolean Exists() {return exists && Enabled;} private boolean exists;
public void Exists_y_() {exists = true;}
public void Init(byte[] toc_title, byte[] page_name) {
this.Clear();
this.toc_title = toc_title;
this.page_name = page_name;
}
public void Add(int hdr_num, byte[] hdr_txt) {
Xoh_toc_itm itm = new Xoh_toc_itm();
lvl_wkr.Calc_level(itm, hdr_num);
txt_wkr.Calc_anch_text(itm, page_name, hdr_txt);
itms.Add(itm.Anch(), itm);
}
public byte[] To_html(boolean toc_mode_is_pgbnr) {return htmlr.To_html(itms, toc_title, toc_mode_is_pgbnr);}
public byte[] Test__to_html() {
return htmlr.Test__to_html(itms);
}
public static boolean Enabled = true;
}

View File

@@ -1,131 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.langs.htmls.encoders.*;
import gplx.xowa.wikis.nss.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*;
public class Xow_hdr_mgr {
private final Xoae_page page;
private final Hash_adp hdrs_hash = Hash_adp_.New(); private final Bry_bfr hdrs_bfr = Bry_bfr_.Reset(255); private final Bry_obj_ref hdrs_ref = Bry_obj_ref.New_empty();
private Xop_hdr_tkn[] hdrs_ary = new Xop_hdr_tkn[0]; private int hdrs_max, hdrs_len;
public Xow_hdr_mgr(Xoae_page page) {this.page = page;}
public boolean Toc_enabled() {
return !toc_hide // check for __NOTOC__
&& hdrs_len != 0 // never show TOC if 0 headers, even when __FORCETOC__
&& ( hdrs_len > Toc_min // show TOC automatically if 4 or more headers
|| toc_manual // or when __TOC__ specified (EX: 2 headers)
|| toc_force // or when __FORCETOC__ specified; presumably to (a) show TOC when < 4 headers and (b) let TOC show at default position; __TOC__ would force TOC to show at __TOC__; __FORCETOC__ can be placed at bottom of page
)
;
}
public boolean Toc_manual() {return toc_manual;}
public void Toc_manual_() {toc_manual = true;} private boolean toc_manual; // __TOC__
public void Toc_force_() {toc_force = true;} private boolean toc_force; // __FORCETOC__
public void Toc_hide_() {toc_hide = true;} private boolean toc_hide; // __NOTOC__
public int Len() {return hdrs_len;}
public Xop_hdr_tkn Get_at(int i) {return hdrs_ary[i];}
public void Add(Xop_ctx ctx, Xop_hdr_tkn hdr, byte[] src) {
int new_len = hdrs_len + 1;
if (new_len > hdrs_max) {
hdrs_max = (new_len * 2) + 1;
hdrs_ary = (Xop_hdr_tkn[])Array_.Resize(hdrs_ary, hdrs_max);
}
Reg(ctx, hdr, src);
hdrs_ary[hdrs_len] = hdr;
hdrs_len = new_len;
}
public void Clear() {
hdrs_len = 0;
if (hdrs_max > 32) {
hdrs_ary = new Xop_hdr_tkn[32];
hdrs_max = 32;
}
hdrs_hash.Clear();
toc_manual = toc_force = toc_hide = false;
}
private void Reg(Xop_ctx ctx, Xop_hdr_tkn hdr, byte[] src) {
if (hdrs_len == 0) hdr.Hdr_html_first_y_();
Bry_bfr_mkr bfr_mkr = Xoa_app_.Utl__bfr_mkr();
Bry_bfr raw_bfr = bfr_mkr.Get_b128(), enc_bfr = bfr_mkr.Get_b128();
Id_bld_recurse(raw_bfr, src, hdr);
Gfo_url_encoder encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Id;
encoder.Encode(enc_bfr, raw_bfr.Bfr(), 0, raw_bfr.Len());
byte[] hdrs_id = enc_bfr.To_bry();
Object o = hdrs_hash.Get_by(hdrs_ref.Val_(hdrs_id));
if (o != null) {
Xop_hdr_tkn hdr_0 = (Xop_hdr_tkn)o;
enc_bfr.Add_byte(Byte_ascii.Underline).Add_int_variable(hdr_0.Hdr_html_dupe_idx_next());
hdrs_id = enc_bfr.To_bry_and_clear();
}
else {
hdrs_bfr.Clear();
hdrs_hash.Add(Bry_obj_ref.New(hdrs_id), hdr);
}
hdr.Hdr_html_id_(hdrs_id);
hdr.Hdr_toc_text_(gplx.xowa.htmls.tocs.Xow_toc_mgr.Toc_text(ctx, page, src, hdr));
raw_bfr.Mkr_rls(); enc_bfr.Mkr_rls();
}
private void Id_bld_recurse(Bry_bfr raw_bfr, byte[] src, Xop_tkn_itm tkn) {
boolean txt_seen = false; int ws_pending = 0;
int subs_len = tkn.Subs_len();
for (int i = 0; i < subs_len; i++) {
Xop_tkn_itm sub = tkn.Subs_get(i);
byte sub_tid = sub.Tkn_tid();
if ( sub_tid != Xop_tkn_itm_.Tid_space
&& sub_tid != Xop_tkn_itm_.Tid_para) {
if (ws_pending > 0) {
raw_bfr.Add_byte_repeat(Byte_ascii.Underline, ws_pending);
ws_pending = 0;
}
txt_seen = true;
}
switch (sub.Tkn_tid()) {
case Xop_tkn_itm_.Tid_space:
if (txt_seen) ws_pending = sub.Src_end() - sub.Src_bgn();
break;
case Xop_tkn_itm_.Tid_apos: break; // noop; ignore apos in id
case Xop_tkn_itm_.Tid_txt:
raw_bfr.Add_mid(src, sub.Src_bgn(), sub.Src_end());
break;
case Xop_tkn_itm_.Tid_xnde:
Xop_xnde_tkn xnde = (Xop_xnde_tkn)sub;
Id_bld_recurse(raw_bfr, src, xnde);
break;
case Xop_tkn_itm_.Tid_lnki:
Xop_lnki_tkn lnki = (Xop_lnki_tkn)sub;
if ( lnki.Ns_id() == Xow_ns_.Tid__category // Category text should not print; DATE:2013-12-09
&& !lnki.Ttl().ForceLiteralLink()) {} // unless it is literal link; EX: [[:Category:A]]; PAGE:s.w:Wikipedia:Requests_for_deletion/Log_1 DATE:2015-11-29
else {
if (lnki.Caption_exists())
Id_bld_recurse(raw_bfr, src, lnki.Caption_val_tkn());
else
raw_bfr.Add(lnki.Ttl_ary());
}
break;
case Xop_tkn_itm_.Tid_html_ncr:
Xop_amp_tkn_num html_ncr = (Xop_amp_tkn_num)sub;
raw_bfr.Add(html_ncr.Str_as_bry());
break;
default:
raw_bfr.Add_mid(src, sub.Src_bgn(), sub.Src_end());
break;
}
}
}
public static final int Toc_min = 3;
}

View File

@@ -1,228 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import gplx.core.brys.*; import gplx.core.brys.fmtrs.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
import gplx.xowa.wikis.nss.*;
import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*;
public class Xow_toc_mgr implements gplx.core.brys.Bfr_arg {
private static final int Toc_levels = 32; // assume 6 max levels * 5 max heading (9999.); add 2 for good measure
private Xoae_page page; private Xop_toc_itm[] path_ary; private Bry_bfr path_bfr = Bry_bfr_.Reset(Toc_levels);
public Xow_toc_mgr() {
path_ary = new Xop_toc_itm[Toc_levels];
for (int i = 0; i < Toc_levels; i++)
path_ary[i] = new Xop_toc_itm();
}
public void Clear() {
for (int i = 0; i < Toc_levels; i++)
path_ary[i].Lvl_idx_(0);
}
public void Bfr_arg__add(Bry_bfr bfr) {
int path_idx = 0, toc_idx = 0, lvl_idx = 1, eq_prv = 0;
path_bfr.Clear();
Xow_hdr_mgr hdr_mgr = page.Hdr_mgr();
int hdrs_len = hdr_mgr.Len();
for (int i = 0; i < hdrs_len; i++) {
Xop_hdr_tkn hdr = hdr_mgr.Get_at(i);
int eq_cur = hdr.Hdr_level();
switch (CompareAble_.Compare(eq_cur, eq_prv)) {
case CompareAble_.More: // always increase slot
if (eq_prv != 0) { // add to path_bfr, unless 1st
path_bfr.Add_int_variable(lvl_idx).Add_byte(Byte_ascii.Dot); // build path; EX: 1.2.3
}
if (path_idx >= Toc_levels) return; // HACK:invalid <div><h2>a</h2></div> sequence causes invalid toc level generation; for now, exit; WHEN:removing dangling <div> logic; DATE:2014-06-08
path_ary[path_idx].Lvl_idx_(lvl_idx).Eq_len_((byte)eq_cur); // store cur value in path ary; EX: path_ary[1] = 2
bfr.Add_byte_repeat(Byte_ascii.Space, path_idx * 2).Add(Bry_list_bgn); // <ul>
++path_idx;
lvl_idx = 1;
eq_prv = eq_cur;
break;
case CompareAble_.Less: // decrease slot, only if <= last slot
int path_new = 0;
for (int j = path_idx - 1; j > -1; j--) {
if (eq_cur == path_ary[j].Eq_len()) {
path_new = j;
break;
}
else if (eq_cur > path_ary[j].Eq_len()) {
path_new = j + 1;
break;
}
}
if (path_new == path_idx) {
bfr.Add_byte_repeat(Byte_ascii.Space, path_idx * 2).Add(Bry_item_end); // add "</li>"
++lvl_idx;
}
else {
for (int j = path_idx; j > path_new + 1; j--) {
bfr.Add_byte_repeat(Byte_ascii.Space, path_idx * 2).Add(Bry_item_end); // </li>
--path_idx;
if (path_idx == -1) path_idx = 0;
bfr.Add_byte_repeat(Byte_ascii.Space, path_idx * 2).Add(Bry_list_end); // </ul>
lvl_idx = path_ary[path_idx].Lvl_idx();
path_bfr.Del_by(Int_.DigitCount(lvl_idx) + 1); // + 1 for dot
}
++lvl_idx;
bfr.Add_byte_repeat(Byte_ascii.Space, path_idx * 2).Add(Bry_item_end); // <li>
}
eq_prv = eq_cur;
break;
case CompareAble_.Same: // keep slot the same
bfr.Add_byte_repeat(Byte_ascii.Space, path_idx * 2).Add(Bry_item_end); // add "</li>"
++lvl_idx;
break;
}
byte[] text = hdr.Hdr_toc_text();
int lvl_idx_digits = Int_.DigitCount(lvl_idx);
path_bfr.Add_int_fixed(lvl_idx, lvl_idx_digits); // add current level
bfr.Add_byte_repeat(Byte_ascii.Space, (path_idx - 1) * 2); // indent
bfmtr_line.Bld_bfr_many(bfr, path_idx, ++toc_idx, hdr.Hdr_html_id(), path_bfr, text);
path_bfr.Del_by(lvl_idx_digits);
}
for (int i = path_idx - 1; i > -1; i--) {
bfr.Add_byte_repeat(Byte_ascii.Space, (i + 1) * 2);
bfr.Add(Bry_item_end);
bfr.Add_byte_repeat(Byte_ascii.Space, i * 2);
bfr.Add(Bry_list_end);
}
}
public static byte[] Toc_text(Xop_ctx ctx, Xoae_page page, byte[] src, Xop_tkn_itm hdr) {
try {
Xowe_wiki wiki = page.Wikie();
Bry_bfr bfr = Xoa_app_.Utl__bfr_mkr().Get_b128();
Xoh_wtr_ctx hctx = Xoh_wtr_ctx.Basic;
Xoh_html_wtr html_wtr = wiki.Html_mgr().Html_wtr(); html_wtr.Init_by_page(ctx, hctx, src, page);
Toc_text_recurse(ctx, bfr, src, html_wtr, hctx, hdr, 0);
bfr.Mkr_rls();
return bfr.To_bry_and_clear();
} catch (Exception e) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to write toc: url=~{0} err=~{1}", page.Url().To_str(), Err_.Message_gplx_full(e));
return Bry_.Empty;
}
}
private static void Toc_text_recurse(Xop_ctx ctx, Bry_bfr bfr, byte[] src, Xoh_html_wtr html_wtr, Xoh_wtr_ctx html_wtr_opts, Xop_tkn_itm tkn, int depth) {
int subs_len = tkn.Subs_len();
boolean txt_seen = false; int ws_pending = 0;
for (int i = 0; i < subs_len; i++) {
Xop_tkn_itm sub = tkn.Subs_get(i);
byte sub_tid = sub.Tkn_tid();
if (sub_tid != Xop_tkn_itm_.Tid_space) {
if (ws_pending > 0) {
bfr.Add_byte_repeat(Byte_ascii.Space, ws_pending);
ws_pending = 0;
}
txt_seen = true;
}
switch (sub.Tkn_tid()) {
case Xop_tkn_itm_.Tid_space:
if (txt_seen) ws_pending = sub.Src_end() - sub.Src_bgn();
break;
case Xop_tkn_itm_.Tid_lnki:
Xop_lnki_tkn lnki = (Xop_lnki_tkn)sub;
if (lnki.Ns_id() == Xow_ns_.Tid__category
&& !lnki.Ttl().ForceLiteralLink()) {} // Category text should not print; DATE:2013-12-09
else {
if (lnki.Caption_exists())
Toc_text_recurse(ctx, bfr, src, html_wtr, html_wtr_opts, lnki.Caption_val_tkn(), depth);
else {
if (lnki.Ns_id() == Xow_ns_.Tid__file) {} // do not print lnk_ttl in TOC; if file; tr.w:Dünya_Mirasları; DATE:2014-06-06
else
bfr.Add(lnki.Ttl_ary());
}
}
break;
case Xop_tkn_itm_.Tid_xnde:
Xop_xnde_tkn xnde = (Xop_xnde_tkn)sub;
switch (xnde.Tag().Id()) {
case Xop_xnde_tag_.Tid__br: // always ignore in TOC text; EX: en.wikipedia.org/wiki/Magnetic_resonance_imaging; ====''T''<span style="display:inline-block; margin-bottom:-0.3em; vertical-align:-0.4em; line-height:1.2em; font-size:85%; text-align:left;">*<br />2</span>-weighted MRI====
case Xop_xnde_tag_.Tid__hr: // assumed, based on above
case Xop_xnde_tag_.Tid__h1: case Xop_xnde_tag_.Tid__h2: case Xop_xnde_tag_.Tid__h3: case Xop_xnde_tag_.Tid__h4: case Xop_xnde_tag_.Tid__h5: case Xop_xnde_tag_.Tid__h6:
case Xop_xnde_tag_.Tid__ul: case Xop_xnde_tag_.Tid__ol: case Xop_xnde_tag_.Tid__dd: case Xop_xnde_tag_.Tid__dt: case Xop_xnde_tag_.Tid__li:
case Xop_xnde_tag_.Tid__table: case Xop_xnde_tag_.Tid__tr: case Xop_xnde_tag_.Tid__td: case Xop_xnde_tag_.Tid__th: case Xop_xnde_tag_.Tid__thead: case Xop_xnde_tag_.Tid__tbody: case Xop_xnde_tag_.Tid__caption:
case Xop_xnde_tag_.Tid__ref: // NOTE: don't bother printing references
// case Xop_xnde_tag_.Tid__pre: case Xop_xnde_tag_.Tid__blockquote:
break;
case Xop_xnde_tag_.Tid__b:
case Xop_xnde_tag_.Tid__i:
html_wtr.Write_tkn(bfr, ctx, html_wtr_opts, src, tkn, Xoh_html_wtr.Sub_idx_null, sub);
break;
case Xop_xnde_tag_.Tid__translate:
gplx.xowa.xtns.translates.Xop_translate_xnde translate_xnde = (gplx.xowa.xtns.translates.Xop_translate_xnde)xnde.Xnde_xtn();
html_wtr.Write_tkn(bfr, ctx, html_wtr_opts, translate_xnde.Xtn_root().Data_mid(), tkn, Xoh_html_wtr.Sub_idx_null, translate_xnde.Xtn_root());
break;
default:
if (depth > 0 && (xnde.CloseMode() == Xop_xnde_tkn.CloseMode_pair || xnde.CloseMode() == Xop_xnde_tkn.CloseMode_inline)) // do not render dangling xndes; EX: Casualties_of_the_Iraq_War; ===<small>Iraqi Health Ministry<small>===
bfr.Add_mid(src, xnde.Tag_open_bgn(), xnde.Tag_open_end());
Toc_text_recurse(ctx, bfr, src, html_wtr, html_wtr_opts, xnde, depth + 1);
if (depth > 0 && xnde.CloseMode() == Xop_xnde_tkn.CloseMode_pair) // do not render (a) dangling xndes or (b) inline (which will have negative bgn)
bfr.Add_mid(src, xnde.Tag_close_bgn(), xnde.Tag_close_end());
break;
}
break;
case Xop_tkn_itm_.Tid_txt:
html_wtr.Write_tkn(bfr, ctx, html_wtr_opts, src, tkn, Xoh_html_wtr.Sub_idx_null, sub);
break;
case Xop_tkn_itm_.Tid_apos: html_wtr.Apos (ctx, html_wtr_opts, bfr, src, (Xop_apos_tkn)sub); break;
case Xop_tkn_itm_.Tid_html_ncr: html_wtr.Html_ncr (ctx, html_wtr_opts, bfr, src, (Xop_amp_tkn_num)sub); break;
case Xop_tkn_itm_.Tid_html_ref: html_wtr.Html_ref (ctx, html_wtr_opts, bfr, src, (Xop_amp_tkn_ent)sub); break;
default:
if (sub.Subs_len() == 0) // NOTE: never call html_wtr directly unless leaf elem; DATE:2014-06-22
html_wtr.Write_tkn(bfr, ctx, html_wtr_opts, src, tkn, Xoh_html_wtr.Sub_idx_null, sub);
else
Toc_text_recurse(ctx, bfr, src, html_wtr, html_wtr_opts, sub, depth + 1);
break;
}
}
}
public void Html(Xoae_page page, Xoh_wtr_ctx hctx, Bry_bfr bfr, boolean pgbnr_mode) { // write_toc_cls needed for Page_banner
if (!page.Hdr_mgr().Toc_enabled()) return; // REF.MW: Parser.php|formatHeadings
if (hctx.Mode_is_hdump()) {
gplx.xowa.htmls.core.wkrs.tocs.Xoh_toc_wtr.Write_tag(bfr, pgbnr_mode);
return;
}
this.page = page;
byte[] bry_contents = page.Wikie().Msg_mgr().Val_by_id(Xol_msg_itm_.Id_toc);
bfmtr_main.Bld_bfr_many(bfr, pgbnr_mode ? Bry_.Empty : Bry_toc_cls, Bfr_arg_.New_bry(bry_contents), this);
}
private static final byte[]
Bry_list_bgn = Bry_.new_a7(" <ul>\n")
, Bry_list_end = Bry_.new_a7(" </ul>\n")
, Bry_item_end = Bry_.new_a7(" </li>\n")
, Bry_toc_cls = Bry_.new_a7(" id=\"toc\" class=\"toc\"")
;
private Bry_fmtr
bfmtr_main = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
( "<div~{toc}>"
, " <div id=\"toctitle\">"
, " <h2>~{contents_title}</h2>"
, " </div>"
, "~{toc_list}</div>"
, ""
)
, "toc", "contents_title", "toc_list"
)
, bfmtr_line = Bry_fmtr.new_
( " <li class=\"toclevel-~{level} tocsection-~{toc_idx}\"><a href=\"#~{anchor}\"><span class=\"tocnumber\">~{heading}</span> <span class=\"toctext\">~{text}</span></a>\n"
, "level", "toc_idx", "anchor", "heading", "text"
);
}
class Xop_toc_itm {
public int Eq_len() {return eq_len;} public Xop_toc_itm Eq_len_(int v) {eq_len = v; return this;} private int eq_len;
public int Lvl_idx() {return lvl_idx;} public Xop_toc_itm Lvl_idx_(int v) {lvl_idx = v; return this;} private int lvl_idx;
}

View File

@@ -1,599 +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.htmls.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import org.junit.*; import gplx.xowa.parsers.*; import gplx.xowa.htmls.core.htmls.*;
public class Xow_toc_mgr_tst {
@Before public void init() {fxt.Clear();} private final Xow_toc_mgr_fxt fxt = new Xow_toc_mgr_fxt();
@Test public void Basic() {
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "==a=="
, "==b=="
, "==c=="
, "==d=="
), fxt.toc_tbl_nl_y
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-2\"><a href=\"#b\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-3\"><a href=\"#c\"><span class=\"tocnumber\">3</span> <span class=\"toctext\">c</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-4\"><a href=\"#d\"><span class=\"tocnumber\">4</span> <span class=\"toctext\">d</span></a>"
, " </li>"
, " </ul>"
)
);
}
@Test public void Hier_down() {
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "==a=="
, "===b==="
, "====c===="
, "=====d====="
), fxt.toc_tbl_nl_y
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-2\"><a href=\"#b\"><span class=\"tocnumber\">1.1</span> <span class=\"toctext\">b</span></a>"
, " <ul>"
, " <li class=\"toclevel-3 tocsection-3\"><a href=\"#c\"><span class=\"tocnumber\">1.1.1</span> <span class=\"toctext\">c</span></a>"
, " <ul>"
, " <li class=\"toclevel-4 tocsection-4\"><a href=\"#d\"><span class=\"tocnumber\">1.1.1.1</span> <span class=\"toctext\">d</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
));
}
@Test public void Hier_up() {
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "==a=="
, "===b==="
, "===c==="
, "==d=="
), fxt.toc_tbl_nl_y
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-2\"><a href=\"#b\"><span class=\"tocnumber\">1.1</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " <li class=\"toclevel-2 tocsection-3\"><a href=\"#c\"><span class=\"tocnumber\">1.2</span> <span class=\"toctext\">c</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-4\"><a href=\"#d\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">d</span></a>"
, " </li>"
, " </ul>"
));
}
@Test public void Down_up() {
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "==a=="
, "===b==="
, "==c=="
, "===d==="
), fxt.toc_tbl_nl_y
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-2\"><a href=\"#b\"><span class=\"tocnumber\">1.1</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-3\"><a href=\"#c\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">c</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-4\"><a href=\"#d\"><span class=\"tocnumber\">2.1</span> <span class=\"toctext\">d</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
));
}
@Test public void D1_D1_D1_U2() {
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "==a=="
, "===b==="
, "====c===="
, "==d=="
), fxt.toc_tbl_nl_y
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-2\"><a href=\"#b\"><span class=\"tocnumber\">1.1</span> <span class=\"toctext\">b</span></a>"
, " <ul>"
, " <li class=\"toclevel-3 tocsection-3\"><a href=\"#c\"><span class=\"tocnumber\">1.1.1</span> <span class=\"toctext\">c</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-4\"><a href=\"#d\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">d</span></a>"
, " </li>"
, " </ul>"
));
}
@Test public void Err() { // PURPOSE: models strange case wherein jumping down does not work
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "==a=="
, "====b===="
, "===c==="
, "====d===="
), fxt.toc_tbl_nl_y
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-2\"><a href=\"#b\"><span class=\"tocnumber\">1.1</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " <li class=\"toclevel-2 tocsection-3\"><a href=\"#c\"><span class=\"tocnumber\">1.2</span> <span class=\"toctext\">c</span></a>"
, " <ul>"
, " <li class=\"toclevel-3 tocsection-4\"><a href=\"#d\"><span class=\"tocnumber\">1.2.1</span> <span class=\"toctext\">d</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
));
}
@Test public void Repeat_name() {
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "==a=="
, "==a=="
, "==a=="
, "==a=="
), fxt.toc_tbl_nl_y
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-2\"><a href=\"#a_2\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-3\"><a href=\"#a_3\"><span class=\"tocnumber\">3</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-4\"><a href=\"#a_4\"><span class=\"tocnumber\">4</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " </ul>"
));
}
@Test public void Id__encode() {
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==a+b=="
), fxt.toc_tbl_nl_y
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a.2Bb\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a+b</span></a>"
, " </li>"
, " </ul>"
));
}
@Test public void Ws() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "== a b =="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a_b\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a b</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='a_b'> a b </span></h2>"
));
}
@Test public void Apos_italic() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==''a''=="
)
, String_.Concat_lines_nl_skip_last
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\"><i>a</i></span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='a'><i>a</i></span></h2>"
, ""
));
}
@Test public void Xnde__italic() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==<i>a</i>=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\"><i>a</i></span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='a'><i>a</i></span></h2>"
));
}
@Test public void Xnde__small() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==<small>a</small>=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='a'><small>a</small></span></h2>"
));
}
@Test public void Xnde__li() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==a<ul><li>b</li></ul>c=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#abc\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">ac</span></a>" // NOTE: toctext should be "abc", not "ab"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='abc'>a<ul>"
, "<li>b</li></ul>c</span></h2>"
));
}
@Test public void Xnde__table() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==a<table><tr><td>b</td></tr></table>c=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a.3Ctable.3E.3Ctr.3E.3Ctd.3Eb.3C.2Ftd.3E.3C.2Ftr.3E.3C.2Ftable.3Ec\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">abc</span></a>" // NOTE: toc id should be "abc"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='a.3Ctable.3E.3Ctr.3E.3Ctd.3Eb.3C.2Ftd.3E.3C.2Ftr.3E.3C.2Ftable.3Ec'>a"
, "<table>"
, " <tr>"
, " <td>b"
, " </td>"
, " </tr>"
, "</table>"
, "c</span></h2>"
));
}
// TOMBSTONE: on MW, shows up as 'href="#ab"; <span class="toctext">ab</span>; '; TIDY doing strange things; ignore for now; DATE:2016-06-28
//@Test public void Xnde__h2() {
// fxt.Test_html_all(String_.Concat_lines_nl_skip_last
// ( "__FORCETOC__"
// , "==a<h2>b</h2>c=="
// )
// , String_.Concat_lines_nl
// ( fxt.toc_tbl_nl_n
// ( " <ul>"
// , " <li class=\"toclevel-1 tocsection-1\"><a href=\"#abc\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">ac</span></a>"
// , " </li>"
// , " </ul>"
// )
// , "<h2><span class='mw-headline' id='abc'>a<h2>b</h2>c</span></h2>"
// ));
//}
@Test public void Xnde__dangling() { // PURPOSE: do not render dangling xndes; EX: Casualties_of_the_Iraq_War; ===<small>Iraqi Health Ministry<small>===
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==<small>a<small>=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='a'><small>a<small></small></small></span></h2>"
));
}
@Test public void Nest__xnde__small() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==a <sup>b<small>c</small>d</sup> e=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a_bcd_e\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a b<small>c</small>d e</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='a_bcd_e'>a <sup>b<small>c</small>d</sup> e</span></h2>"
));
}
@Test public void Nest__lnki() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==<small>[[a|b]]</small>=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#b\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='b'><small><a href=\"/wiki/A\">b</a></small></span></h2>"
));
}
@Test public void Nest__br() { // PURPOSE: do not render inline xndes; EX: Magnetic_resonance_imaging
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==a<span id=\"b\">b<br/></span>=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#ab\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">ab</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='ab'>a<span id='b'>b<br/></span></span></h2>"
));
}
@Test public void Lnki_link() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==[[a]]=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='a'><a href=\"/wiki/A\">a</a></span></h2>"
));
}
@Test public void Lnki_caption() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==[[a|b]]=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#b\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='b'><a href=\"/wiki/A\">b</a></span></h2>"
));
}
@Test public void Lnki_caption_nest() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==[[a|b<i>c</i>d]]=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#bcd\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">b<i>c</i>d</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='bcd'><a href=\"/wiki/A\">b<i>c</i>d</a></span></h2>"
));
}
@Test public void Html_ncr() {
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==&#91;a&#93;=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#.5Ba.5D\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">&#91;a&#93;</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='.5Ba.5D'>&#91;a&#93;</span></h2>"
));
}
@Test public void Fix_large_before_small() { // PURPOSE.fix: "===a===\n===b===\n" followed by "==c==" causes improper formatting; DATE:2013-05-16
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "===a==="
, "===b==="
, "==c=="
, "==d=="
), fxt.toc_tbl_nl_y // NOTE: should all be level 2
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-2\"><a href=\"#b\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">b</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-3\"><a href=\"#c\"><span class=\"tocnumber\">3</span> <span class=\"toctext\">c</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-4\"><a href=\"#d\"><span class=\"tocnumber\">4</span> <span class=\"toctext\">d</span></a>"
, " </li>"
, " </ul>"
));
}
@Test public void Fix_large_before_small_2() { // PURPOSE.fix: similar to above, but has h3 after h2; PAGE:https://en.wikipedia.org/wiki/Wikipedia:Articles_for_creation/2006-08-27 DATE:2014-06-09
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "===a_0==="
, "==b_0=="
, "===b_1==="
, "==c_0=="
), fxt.toc_tbl_nl_y
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#a_0\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a_0</span></a>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-2\"><a href=\"#b_0\"><span class=\"tocnumber\">2</span> <span class=\"toctext\">b_0</span></a>"
, " <ul>"
, " <li class=\"toclevel-2 tocsection-3\"><a href=\"#b_1\"><span class=\"tocnumber\">2.1</span> <span class=\"toctext\">b_1</span></a>"
, " </li>"
, " </ul>"
, " </li>"
, " <li class=\"toclevel-1 tocsection-4\"><a href=\"#c_0\"><span class=\"tocnumber\">3</span> <span class=\"toctext\">c_0</span></a>"
, " </li>"
, " </ul>"
));
}
@Test public void Translate_and_comment() { // PURPOSE: <translate> is an xtn and parses its innerText separately; meanwhile, toc_mgr defaults to using the innerText to build toc; EX:Wikidata:Introduction; DATE:2013-07-16
fxt.Test_html_toc(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==<translate><!--b-->ac</translate>=="
), fxt.toc_tbl_nl_y
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#.3C.21--b--.3Eac\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">ac</span></a>"
, " </li>"
, " </ul>"
));
}
@Test public void Ref() { // PURPOSE: ref contents should not print in TOC; DATE:2013-07-23
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==a<ref>b</ref>=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#ab\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">a</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='ab'>a<sup id=\"cite_ref-0\" class=\"reference\"><a href=\"#cite_note-0\">[1]</a></sup></span></h2>"
));
}
@Test public void Category() { // PURPOSE: Category should not show in in TOC; DATE:2013-12-09
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==A[[Category:B]]=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#A\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">A</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='A'>A</span></h2>"
));
}
@Test public void Category_literal() { // PURPOSE: literal Category should show in in TOC; EX: de.w:1234; DATE:2014-01-21
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==A[[:Category:B]]=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#ACategory:B\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">ACategory:B</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='ACategory:B'>A<a href=\"/wiki/Category:B\">Category:B</a></span></h2>"
));
}
@Test public void File() { // PURPOSE: file should show in in TOC; EX: tr.w:D<>nya_Miraslari; DATE:2014-06-06
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==[[File:A.png]] b=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#File:A.png_b\"><span class=\"tocnumber\">1</span> <span class=\"toctext\"> b</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='File:A.png_b'><a href=\"/wiki/File:A.png\" class=\"image\" xowa_title=\"A.png\"><img id=\"xoimg_0\" alt=\"\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" /></a> b</span></h2>"
));
}
@Test public void Lnki_invalid() { // PURPOSE: invalid lnki was causing null ref; DATE:2014-02-07
fxt.Test_html_all(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==[[]]=="
)
, String_.Concat_lines_nl
( fxt.toc_tbl_nl_n
( " <ul>"
, " <li class=\"toclevel-1 tocsection-1\"><a href=\"#.5B.5B.5D.5D\"><span class=\"tocnumber\">1</span> <span class=\"toctext\">[[]]</span></a>"
, " </li>"
, " </ul>"
)
, "<h2><span class='mw-headline' id='.5B.5B.5D.5D'>[[]]</span></h2>"
));
}
@Test public void File_in_tbl() { // PURPOSE: two issues (a) don't show file if in tbl; (b) if v2, file inside tbl fails; PAGE:en.w:Holmes County,_Mississippi; DATE:2014-06-22
fxt.Test_html_frag(String_.Concat_lines_nl_skip_last
( "__FORCETOC__"
, "==a <table><tr><td>[[File:A.png]]b</td></tr></table> c=="
)
, "<span class=\"toctext\">a b c</span>" // note that "b" inside tbl shows
);
}
}
class Xow_toc_mgr_fxt {
private Xow_toc_mgr toc_mgr = new Xow_toc_mgr();
private Bry_bfr tmp = Bry_bfr_.New();
public Xop_fxt Fxt() {return fxt;} private final Xop_fxt fxt = new Xop_fxt();
public void Clear() {
fxt.Reset();
toc_mgr.Clear();
tmp.Clear();
}
public void Test_html_toc(String raw, String expd) {
toc_mgr.Clear();
byte[] raw_bry = Bry_.new_u8(raw);
Xop_root_tkn root = fxt.Ctx().Tkn_mkr().Root(raw_bry);
fxt.Parser().Parse_page_all_clear(root, fxt.Ctx(), fxt.Ctx().Tkn_mkr(), raw_bry);
toc_mgr.Html(fxt.Page(), Xoh_wtr_ctx.Basic, tmp, false);
Tfds.Eq_ary(String_.SplitLines_nl(expd), String_.SplitLines_nl(tmp.To_str_and_clear()), raw);
}
public void Test_html_all(String raw, String expd) {
expd = Xoh_consts.Escape_apos(expd);
fxt.Wtr_cfg().Toc__show_(Bool_.Y);
toc_mgr.Clear();
fxt.Test_parse_page_all_str(raw, expd);
fxt.Wtr_cfg().Toc__show_(Bool_.N);
}
public void Test_html_frag(String raw, String frag) {
fxt.Wtr_cfg().Toc__show_(Bool_.Y);
toc_mgr.Clear();
fxt.Test_html_full_frag(raw, frag);
fxt.Wtr_cfg().Toc__show_(Bool_.N);
}
public String toc_tbl_nl_y(String... ary) {return toc_tbl(Bool_.Y, ary);}
public String toc_tbl_nl_n(String... ary) {return toc_tbl(Bool_.N, ary);}
public String toc_tbl(boolean nl, String... ary) {
return String_.Concat_lines_nl_skip_last
( "<div id=\"toc\" class=\"toc\">"
, " <div id=\"toctitle\">"
, " <h2>Contents</h2>"
, " </div>"
, String_.Concat_lines_nl_skip_last(ary)
, "</div>" + (nl ? "\n" : "")
);
}
}