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

@@ -20,6 +20,7 @@ import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; import gplx.core.brys.ar
import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*;
public class Ref_html_wtr {
private final Xoh_ref_list_fmtr grp_list_fmtr = new Xoh_ref_list_fmtr();
public Ref_html_wtr(Xowe_wiki wiki) {
cfg = Ref_html_wtr_cfg.new_();
}
@@ -65,9 +66,9 @@ public class Ref_html_wtr {
}
return rv;
}
public void Xnde_references(Xoh_html_wtr wtr, Xop_ctx ctx, Xoh_wtr_ctx opts, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) {
public void Xnde_references(Xoh_html_wtr wtr, Xop_ctx ctx, Xoh_wtr_ctx opts, Xoae_page wpg, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) {
References_nde references = (References_nde)xnde.Xnde_xtn();
Ref_itm_lst lst = ctx.Page().Ref_mgr().Lst_get(references.Group(), references.List_idx()); // get group; EX: <references group="note"/>
Ref_itm_lst lst = wpg.Ref_mgr().Lst_get(references.Group(), references.List_idx()); // get group; EX: <references group="note"/>
if (lst == null) return; // NOTE: possible to have a grouped references without references; EX: Infobox planet; <references group=note> in sidebar, but no refs
if (lst.Itms_len() == 0) return;
bfr.Add(cfg.Grp_bgn());
@@ -79,7 +80,7 @@ public class Ref_html_wtr {
grp_list_fmtr.Init(ctx.Wiki(), cfg, head_itm);
Ref_nde text_itm = grp_list_fmtr.IdentifyTxt(); // find the item that has the text (there should only be 0 or 1)
if (text_itm.Body() != null)
wtr.Write_tkn(tmp, ctx, opts, text_itm.Body().Root_src(), null, Xoh_html_wtr.Sub_idx_null, text_itm.Body());
wtr.Write_tkn_to_html(tmp, ctx, opts, text_itm.Body().Root_src(), null, Xoh_html_wtr.Sub_idx_null, text_itm.Body());
// add follows
int related_len = head_itm.Related_len();
@@ -87,7 +88,7 @@ public class Ref_html_wtr {
Ref_nde related_itm = head_itm.Related_get(k);
if (related_itm.Follow_y()) { // NOTE: both follow and related are in the related list; only add follow
tmp.Add_byte_space(); // always add space; REF.MW:Cite_body.php;$this->mRefs[$group][$follow]['text'] = $this->mRefs[$group][$follow]['text'] . ' ' . $str;
wtr.Write_tkn(tmp, ctx, opts, related_itm.Body().Root_src(), null, Xoh_html_wtr.Sub_idx_null, related_itm.Body());
wtr.Write_tkn_to_html(tmp, ctx, opts, related_itm.Body().Root_src(), null, Xoh_html_wtr.Sub_idx_null, related_itm.Body());
}
}
@@ -108,44 +109,4 @@ public class Ref_html_wtr {
}
bfr.Add(cfg.Grp_end());
}
private static Xoh_ref_list_fmtr grp_list_fmtr = new Xoh_ref_list_fmtr();
}
class Xoh_ref_list_fmtr implements gplx.core.brys.Bfr_arg {
public void Init(Xowe_wiki wiki, Ref_html_wtr_cfg cfg, Ref_nde itm) {
this.wiki = wiki; this.cfg = cfg; this.itm = itm;
} private Xowe_wiki wiki; private Ref_nde itm; private Ref_html_wtr_cfg cfg;
public Ref_nde IdentifyTxt() {
if (HasTxt(itm)) return itm;
int itm_related_len = itm.Related_len();
for (int i = 0; i < itm_related_len; i++) {
Ref_nde rel = itm.Related_get(i);
if (HasTxt(rel)) return rel;
}
return itm; // no itm has text; TODO_OLD:WARN
}
private boolean HasTxt(Ref_nde v) {return v.Body() != null && v.Body().Root_src().length > 0;}
public void Bfr_arg__add(Bry_bfr bfr) {
int related_len = itm.Related_len();
Bry_fmtr itm_fmtr = cfg.Grp_html_list();
Fmt(itm_fmtr, wiki, bfr, itm);
for (int i = 0; i < related_len; i++) {
Ref_nde link_itm = itm.Related_get(i);
if (link_itm.Nested()) continue;
Fmt(itm_fmtr, wiki, bfr, link_itm);
}
}
private void Fmt(Bry_fmtr itm_fmtr, Xowe_wiki wiki, Bry_bfr trg, Ref_nde itm) {
int itm_idx_minor = itm.Idx_minor();
if (itm_idx_minor < 0) return; // HACK: <ref follow created a negative index; ignore these references for now; de.wikisource.org/wiki/Seite:Die Trunksucht.pdf/63; DATE:2013-06-22
byte[] backlabel
= itm_idx_minor < cfg.Backlabels_len()
? cfg.Backlabels()[itm.Idx_minor()]
: wiki.Parser_mgr().Main().Parse_text_to_html(wiki.Parser_mgr().Ctx(), wiki.Msg_mgr().Val_by_key_args(Ref_html_wtr_cfg.Msg_backlabels_err, itm.Idx_minor()))
;
itm_fmtr.Bld_bfr_many(trg
, fmtr.Set(cfg.Itm_id_key_one(), itm.Name(), itm.Idx_major(), itm.Idx_minor())
, backlabel
);
}
private Bfr_arg__bry_fmtr fmtr = Bfr_arg_.New_bry_fmtr__null();
}

View File

@@ -56,7 +56,7 @@ public class Ref_nde implements Xox_xnde, Mwh_atr_itm_owner1 {
ctx.Page().Ref_mgr().Grps_add(group, name, follow, this);
this.xnde = xnde;
}
public void Xtn_write(Bry_bfr bfr, Xoae_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, byte[] src) {
public void Xtn_write(Bry_bfr bfr, Xoae_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xoae_page wpg, Xop_xnde_tkn xnde, byte[] src) {
html_wtr.Ref_wtr().Xnde_ref(hctx, bfr, src, xnde);
}
private static final Ref_nde[] Ary_empty = new Ref_nde[0];

View File

@@ -37,7 +37,7 @@ public class References_nde implements Xox_xnde, Mwh_atr_itm_owner1 {
Xox_xnde_.Xatr__set(wiki, this, xatrs_hash, src, xnde);
if (xnde.CloseMode() == Xop_xnde_tkn.CloseMode_pair) { // "<references>", "</references>"; parse anything in between but only to pick up <ref> tags; discard everything else; DATE:2014-06-27
int itm_bgn = xnde.Tag_open_end(), itm_end = xnde.Tag_close_bgn();
Xop_ctx references_ctx = Xop_ctx.new_sub_page_(wiki, ctx, ctx.Lst_page_regy()).References_group_(group); // changed from following: "Xop_ctx references_ctx = Xop_ctx.new_sub_(wiki).References_group_(group);"; DATE:2015-05-16;
Xop_ctx references_ctx = Xop_ctx.New__sub__reuse_lst(wiki, ctx, ctx.Lst_page_regy()).References_group_(group); // changed from following: "Xop_ctx references_ctx = Xop_ctx.New__sub(wiki).References_group_(group);"; DATE:2015-05-16;
references_ctx.Para().Enabled_n_(); // disable para during <references> parsing
byte[] references_src = Bry_.Mid(src, itm_bgn, itm_end);
Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
@@ -49,8 +49,8 @@ public class References_nde implements Xox_xnde, Mwh_atr_itm_owner1 {
}
list_idx = ref_mgr.Grps_get(group).Grp_seal(); // NOTE: needs to be sealed at end; else inner refs will end up in new group; EX: <references><ref>don't seal prematurely</ref></references>
}
public void Xtn_write(Bry_bfr bfr, Xoae_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, byte[] src) {
html_wtr.Ref_wtr().Xnde_references(html_wtr, ctx, hctx, bfr, src, xnde);
public void Xtn_write(Bry_bfr bfr, Xoae_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xoae_page wpg, Xop_xnde_tkn xnde, byte[] src) {
html_wtr.Ref_wtr().Xnde_references(html_wtr, ctx, hctx, wpg, bfr, src, xnde);
}
private static final byte Xatr_id_group = 0;
public static boolean Enabled = true;

View File

@@ -0,0 +1,59 @@
/*
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.xtns.cites; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; import gplx.core.brys.args.*;
class Xoh_ref_list_fmtr implements gplx.core.brys.Bfr_arg {
private Xowe_wiki wiki; private Ref_html_wtr_cfg cfg; private Ref_nde itm;
private final Bfr_arg__bry_fmtr fmtr = Bfr_arg_.New_bry_fmtr__null();
public void Init(Xowe_wiki wiki, Ref_html_wtr_cfg cfg, Ref_nde itm) {
this.wiki = wiki; this.cfg = cfg; this.itm = itm;
}
public Ref_nde IdentifyTxt() {
if (HasTxt(itm)) return itm;
int itm_related_len = itm.Related_len();
for (int i = 0; i < itm_related_len; i++) {
Ref_nde rel = itm.Related_get(i);
if (HasTxt(rel)) return rel;
}
return itm; // no itm has text; TODO_OLD:WARN
}
private boolean HasTxt(Ref_nde v) {return v.Body() != null && v.Body().Root_src().length > 0;}
public void Bfr_arg__add(Bry_bfr bfr) {
int related_len = itm.Related_len();
Bry_fmtr itm_fmtr = cfg.Grp_html_list();
Fmt(itm_fmtr, wiki, bfr, itm);
for (int i = 0; i < related_len; i++) {
Ref_nde link_itm = itm.Related_get(i);
if (link_itm.Nested()) continue;
Fmt(itm_fmtr, wiki, bfr, link_itm);
}
}
private void Fmt(Bry_fmtr itm_fmtr, Xowe_wiki wiki, Bry_bfr trg, Ref_nde itm) {
int itm_idx_minor = itm.Idx_minor();
if (itm_idx_minor < 0) return; // HACK: <ref follow created a negative index; ignore these references for now; de.wikisource.org/wiki/Seite:Die Trunksucht.pdf/63; DATE:2013-06-22
byte[] backlabel
= itm_idx_minor < cfg.Backlabels_len()
? cfg.Backlabels()[itm.Idx_minor()]
: wiki.Parser_mgr().Main().Parse_text_to_html(wiki.Parser_mgr().Ctx(), wiki.Msg_mgr().Val_by_key_args(Ref_html_wtr_cfg.Msg_backlabels_err, itm.Idx_minor()))
;
itm_fmtr.Bld_bfr_many(trg
, fmtr.Set(cfg.Itm_id_key_one(), itm.Name(), itm.Idx_major(), itm.Idx_minor())
, backlabel
);
}
}