/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.parsers.hdrs.sections; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.hdrs.*;
import gplx.langs.htmls.*;
import gplx.xowa.mediawiki.includes.parsers.headingsOld.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.htmls.core.htmls.tidy.*;
public class Xop_section_mgr implements Gfo_invk {
private Xoae_app app; private Xowe_wiki wiki;
private Xow_tidy_mgr_interface tidy_mgr;
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
private byte[] bry__edit_text;
private final Bry_fmt fmt__edit_hint = Bry_fmt.New("")
, fmt__section_editable = Bry_fmt.Auto_nl_apos
( "<span class='mw-editsection'><span class='mw-editsection-bracket'>[</span><a href='/wiki/~{page_ttl}?action=edit§ion_key=~{section_key}' title='~{edit_hint}' class='xowa-hover-off'>~{edit_text}</a><span class='mw-editsection-bracket'>]</span></span>"
)
;
public boolean Enabled() {return enabled;} private boolean enabled;
public void Init_by_wiki(Xowe_wiki wiki) {
this.app = wiki.Appe();
this.wiki = wiki;
wiki.App().Cfg().Bind_many_wiki(this, wiki, Cfg__section_editing__enabled);
this.tidy_mgr = wiki.Html_mgr().Tidy_mgr();
}
public byte[] Slice_section(Xoa_url url, Xoa_ttl ttl, byte[] src) {
// return orig if section_editing not enabled
if (!enabled) return src;
// return orig if section_key not in qargs
byte[] section_key = url.Qargs_mgr().Get_val_bry_or(Qarg__section_key, null);
if (section_key == null) return src;
// parse wikitext into list of headers
Xop_section_list section_list = new Xop_section_list().Parse(wiki, tidy_mgr, src);
byte[] rv = section_list.Slice_bry_or_null(section_key);
if (rv == null) {
app.Gui_mgr().Kit().Ask_ok("", "", String_.Format("Section extraction failed!\nPlease do not edit this page else data will be lost!!\n\nwiki={0}\npage={1}\nsection={2}", url.Wiki_bry(), ttl.Full_db(), section_key));
throw Err_.new_wo_type("section_key not found", "wiki", url.Wiki_bry(), "page", ttl.Full_db(), "section_key", section_key);
}
return rv;
}
public byte[] Merge_section(Xoa_url url, byte[] edit, byte[] orig) {
// return edit if not enabled
if (!enabled) return edit;
// return edit if section_key not in qargs
byte[] section_key = url.Qargs_mgr().Get_val_bry_or(Qarg__section_key, null);
if (section_key == null) return edit;
// parse orig
Xop_section_list section_list = new Xop_section_list().Parse(wiki, tidy_mgr, orig);
byte[] rv = section_list.Merge_bry_or_null(section_key, edit);
if (rv == null)
throw Err_.new_wo_type("could not merge section_key", "page", url.To_str(), "section_key", section_key);
return rv;
}
public void Write_html(Bry_bfr bfr, byte[] page_ttl, byte[] section_key, byte[] section_hint) {
if (bry__edit_text == null) { // LAZY: cannot call in Init_by_wiki b/c of circularity; section_mgr is init'd by parser_mgr which is init'd before msg_mgr which is used below
this.bry__edit_text = wiki.Msg_mgr().Val_by_key_obj("editlink");
this.fmt__edit_hint.Fmt_(String_.new_u8(wiki.Msg_mgr().Val_by_key_obj("editsectionhint")));
}
section_key = wiki.Parser_mgr().Uniq_mgr().Convert(section_key); // need to swap out uniqs for Math; DATE:2016-12-09
byte[] edit_hint = fmt__edit_hint.Bld_many_to_bry(tmp_bfr, section_hint);
fmt__section_editable.Bld_many(bfr, page_ttl, section_key, edit_hint, bry__edit_text);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Cfg__section_editing__enabled)) enabled = m.ReadBool("v");
else return Gfo_invk_.Rv_unhandled;
return this;
}
public static final byte[] Bry__meta = Bry_.new_a7("<!--xo_meta|section_edit|");
public static final int Len__meta = Bry__meta.length;
private static final byte[] Qarg__section_key = Bry_.new_u8("section_key");
private static final String Cfg__section_editing__enabled = "xowa.wiki.edit.section.enabled";
}