"
@@ -68,7 +69,6 @@ class Hdump_html_mgr_fxt {
private Hdump_html_mgr html_mgr = new Hdump_html_mgr();
private Hdump_page_itm page = new Hdump_page_itm();
private Bry_bfr bfr = Bry_bfr.reset_(255);
- private Bry_fmtr skin_fmtr = Bry_fmtr.new_("~{display_ttl}~{content_sub}~{sidebar_divs}~{body_html}", "display_ttl", "content_sub", "sidebar_divs", "body_html");
private ListAdp img_list = ListAdp_.new_();
private Xow_wiki wiki;
public void Clear() {
@@ -80,7 +80,7 @@ class Hdump_html_mgr_fxt {
public Hdump_html_mgr_fxt Init_img(int id, int w, int h, String ttl, String src) {img_list.Add(new Hdump_img_itm(id, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;}
public Hdump_html_mgr_fxt Test_html(String expd) {
if (img_list.Count() > 0) page.Img_itms_((Hdump_img_itm[])img_list.XtoAryAndClear(Hdump_img_itm.class));
- html_mgr.Write(bfr, wiki, skin_fmtr, page);
+ html_mgr.Write(bfr, wiki, page);
Tfds.Eq_str_lines(expd, bfr.XtoStrAndClear());
return this;
}
diff --git a/400_xowa/src/gplx/xowa/dbs/hdumps/loads/Hdump_load_mgr.java b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java
similarity index 61%
rename from 400_xowa/src/gplx/xowa/dbs/hdumps/loads/Hdump_load_mgr.java
rename to 400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java
index 7b1adbfeb..e34e59513 100644
--- a/400_xowa/src/gplx/xowa/dbs/hdumps/loads/Hdump_load_mgr.java
+++ b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java
@@ -15,32 +15,30 @@ 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
.
*/
-package gplx.xowa.dbs.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.hdumps.*;
-import gplx.dbs.*; import gplx.ios.*;
-import gplx.core.btries.*; import gplx.xowa.pages.*;
-class Hdump_load_mgr {
- private Hdump_db_mgr db_mgr;
+package gplx.xowa.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
+import gplx.core.brys.*; import gplx.core.btries.*; import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.pages.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*;
+public class Hdump_load_mgr {
+ private Xodb_hdump_mgr hdump_mgr;
private Io_stream_zip_mgr zip_mgr = new Io_stream_zip_mgr();
- private int page_version;
private byte[] page_text, display_ttl, content_sub;
private ListAdp sidebar_divs = ListAdp_.new_(), img_itms = ListAdp_.new_();
private Hdump_text_tbl text_tbl = new Hdump_text_tbl(); private ListAdp tmp_text_itms = ListAdp_.new_();
- private Bry_rdr bry_rdr = new Bry_rdr();
- private byte zip_tid;
- public Hdump_load_mgr(Hdump_db_mgr db_mgr, byte zip_tid) {this.db_mgr = db_mgr; this.zip_tid = zip_tid;}
+ private Bry_rdr bry_rdr = new Bry_rdr();
+ public Hdump_load_mgr(Xodb_hdump_mgr hdump_mgr) {this.hdump_mgr = hdump_mgr;}
+ public byte Zip_tid() {return zip_tid;} public void Zip_tid_(byte v) {zip_tid = v;} private byte zip_tid = gplx.ios.Io_stream_.Tid_file;
+ public void Tbl_(Hdump_text_tbl v) {text_tbl = v;}
public void Clear() {
- page_version = -1;
page_text = display_ttl = content_sub = null;
sidebar_divs.Clear();
img_itms.Clear();
}
- public void Load(Hdump_page_itm page, int page_id, byte[] page_url) {
- Db_provider provider = db_mgr.Db_provider_by_page(page_id);
+ public void Load(Hdump_page_itm page, int page_id, Xoa_url page_url) {
+ Db_provider provider = hdump_mgr.Db_provider_by_page(page_id);
text_tbl.Provider_(provider);
text_tbl.Select_by_page(tmp_text_itms, page_id);
Load_itm(page, page_id, page_url, tmp_text_itms);
}
- public void Load_itm(Hdump_page_itm page, int page_id, byte[] page_url, ListAdp itms) {
+ public void Load_itm(Hdump_page_itm page, int page_id, Xoa_url page_url, ListAdp itms) {
this.Clear();
int len = itms.Count();
for (int i = 0; i < len; ++i) {
@@ -53,23 +51,25 @@ class Hdump_load_mgr {
case Hdump_text_row_tid.Tid_content_sub: content_sub = zip_mgr.Unzip(zip_tid, itm.Data()); break;
}
}
- page.Init(page_id, page_url, page_version, display_ttl, content_sub, page_text
+ page.Init(page_id, page_url, 0, display_ttl, content_sub, page_text
, (byte[][])sidebar_divs.XtoAryAndClear(byte[].class)
, (Hdump_img_itm[])img_itms.XtoAryAndClear(Hdump_img_itm.class)
);
+ itms.Clear();
}
public void Load_itm_body(Hdump_text_row itm) {
- page_version = itm.Version_id();
page_text = zip_mgr.Unzip(zip_tid, itm.Data());
}
public void Load_itm_img(Hdump_text_row itm) {
bry_rdr.Src_(itm.Data());
- int uid = bry_rdr.Read_int_to_pipe();
- int w = bry_rdr.Read_int_to_pipe();
- int h = bry_rdr.Read_int_to_pipe();
- byte[] ttl = bry_rdr.Read_bry_to_pipe();
- byte[] src = bry_rdr.Read_bry_to_pipe();
- Hdump_img_itm img_itm = new Hdump_img_itm(uid, w, h, ttl, src);
- img_itms.Add(img_itm);
+ while (!bry_rdr.Pos_is_eos()) {
+ int uid = bry_rdr.Read_int_to_pipe();
+ int w = bry_rdr.Read_int_to_pipe();
+ int h = bry_rdr.Read_int_to_pipe();
+ byte[] ttl = bry_rdr.Read_bry_to_pipe();
+ byte[] src = bry_rdr.Read_bry_to_nl();
+ Hdump_img_itm img_itm = new Hdump_img_itm(uid, w, h, ttl, src);
+ img_itms.Add(img_itm);
+ }
}
}
diff --git a/400_xowa/src/gplx/xowa/dbs/hdumps/loads/Hdump_load_mgr_tst.java b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java
similarity index 56%
rename from 400_xowa/src/gplx/xowa/dbs/hdumps/loads/Hdump_load_mgr_tst.java
rename to 400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java
index 6d41bd1cf..ff79c5405 100644
--- a/400_xowa/src/gplx/xowa/dbs/hdumps/loads/Hdump_load_mgr_tst.java
+++ b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java
@@ -15,8 +15,8 @@ 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
.
*/
-package gplx.xowa.dbs.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.hdumps.*;
-import org.junit.*;
+package gplx.xowa.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
+import org.junit.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.saves.*;
public class Hdump_load_mgr_tst {
@Before public void init() {fxt.Clear();} private Hdump_load_mgr_fxt fxt = new Hdump_load_mgr_fxt();
@Test public void Body() {
@@ -25,8 +25,10 @@ public class Hdump_load_mgr_tst {
fxt.Test_load(0);
}
@Test public void Img() {
- fxt.Init_row_img(0, "0|220|110|A.png|commons.wikimedia.org/thumb/7/0/A.png/220.png");
- fxt.Init_row_img(1, "1|200|100|B.png|commons.wikimedia.org/thumb/7/0/B.png/200.png");
+ fxt.Init_row_img
+ ( fxt.Make_img(0, 220, 110, "A.png", "commons.wikimedia.org/thumb/7/0/A.png/220.png")
+ , fxt.Make_img(1, 200, 100, "B.png", "commons.wikimedia.org/thumb/7/0/B.png/200.png")
+ );
fxt.Expd_img(0, 220, 110, "A.png", "commons.wikimedia.org/thumb/7/0/A.png/220.png");
fxt.Expd_img(1, 200, 100, "B.png", "commons.wikimedia.org/thumb/7/0/B.png/200.png");
fxt.Test_load(0);
@@ -38,19 +40,29 @@ class Hdump_load_mgr_fxt {
private ListAdp init_rows = ListAdp_.new_();
private String expd_body;
private ListAdp expd_imgs = ListAdp_.new_();
- private int page_id = 0;
+ private int page_id = 0; private Xoa_url page_url;
public void Clear() {
- load_mgr = new Hdump_load_mgr(null, gplx.ios.Io_stream_.Tid_file);
+ load_mgr = new Hdump_load_mgr(null);
+ load_mgr.Zip_tid_(gplx.ios.Io_stream_.Tid_file);
init_rows.Clear();
expd_body = null;
expd_imgs.Clear();
+ page_url = Xoa_url.new_(Bry_.new_ascii_("enwiki"), Bry_.new_ascii_("Page_1"));
}
- public Hdump_load_mgr_fxt Init_row_body(String data) {init_rows.Add(new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_body, 0, 0, Bry_.new_utf8_(data))); return this;}
- public Hdump_load_mgr_fxt Init_row_img (int uid, String data) {init_rows.Add(new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_img , uid, 0, Bry_.new_utf8_(data))); return this;}
+ public Xof_xfer_itm Make_img(int uid, int img_w, int img_h, String lnki_ttl, String img_src_rel) {return new Xof_xfer_itm().Init_for_test__hdump(uid, img_w, img_h, Bry_.new_utf8_(lnki_ttl), Bry_.new_utf8_(img_src_rel));}
+ public void Init_row_img(Xof_xfer_itm... itms) {
+ ListAdp tmp_list = ListAdp_.new_();
+ Bry_bfr bfr = Bry_bfr.new_(255);
+ tmp_list.AddMany((Object[])itms);
+ byte[] imgs_bry = Hdump_save_mgr.Write_imgs(bfr, tmp_list);
+ init_rows.Add(new Hdump_text_row(0, Hdump_text_row_tid.Tid_img, imgs_bry));
+ }
+ public Hdump_load_mgr_fxt Init_row_body(String data) {init_rows.Add(new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_body, Bry_.new_utf8_(data))); return this;}
+ public Hdump_load_mgr_fxt Init_row_img (String data) {init_rows.Add(new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_img , Bry_.new_utf8_(data))); return this;}
public Hdump_load_mgr_fxt Expd_body(String v) {this.expd_body = v; return this;}
public Hdump_load_mgr_fxt Expd_img(int idx, int w, int h, String ttl, String src) {expd_imgs.Add(new Hdump_img_itm(idx, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;}
public Hdump_load_mgr_fxt Test_load(int page_id) {
- load_mgr.Load_itm(page, page_id, Bry_.Empty, init_rows);
+ load_mgr.Load_itm(page, page_id, page_url, init_rows);
if (expd_body != null) Tfds.Eq(expd_body, String_.new_utf8_(page.Page_body()));
if (expd_imgs.Count() != 0) Tfds.Eq_ary_str((Hdump_img_itm[])expd_imgs.XtoAryAndClear(Hdump_img_itm.class), page.Img_itms());
return this;
diff --git a/400_xowa/src/gplx/xowa/dbs/hdumps/Xopg_hdump_data.java b/400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_data.java
similarity index 82%
rename from 400_xowa/src/gplx/xowa/dbs/hdumps/Xopg_hdump_data.java
rename to 400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_data.java
index 5ab5680a6..14bfaf6fb 100644
--- a/400_xowa/src/gplx/xowa/dbs/hdumps/Xopg_hdump_data.java
+++ b/400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_data.java
@@ -15,9 +15,9 @@ 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
.
*/
-package gplx.xowa.dbs.hdumps; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*;
+package gplx.xowa.hdumps.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
public class Xopg_hdump_data {
- public ListAdp Imgs() {return imgs;} private ListAdp imgs = ListAdp_.new_();
+ public ListAdp Imgs() {return imgs;} private final ListAdp imgs = ListAdp_.new_();
public byte[] Body() {return body;} public void Body_(byte[] v) {body = v;} private byte[] body;
public void Clear() {
imgs.Clear();
diff --git a/400_xowa/src/gplx/xowa/dbs/hdumps/Xopg_hdump_img_itm.java b/400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_img_itm.java
similarity index 75%
rename from 400_xowa/src/gplx/xowa/dbs/hdumps/Xopg_hdump_img_itm.java
rename to 400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_img_itm.java
index a601a72e3..613c180d5 100644
--- a/400_xowa/src/gplx/xowa/dbs/hdumps/Xopg_hdump_img_itm.java
+++ b/400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_img_itm.java
@@ -15,15 +15,15 @@ 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
.
*/
-package gplx.xowa.dbs.hdumps; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*;
+package gplx.xowa.hdumps.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
public class Xopg_hdump_img_itm {
- public int Uid() {return uid;} private int uid;
- public int Img_w() {return img_w;} private int img_w;
- public int Img_h() {return img_h;} private int img_h;
- public byte[] Img_src() {return img_src;} private byte[] img_src;
public Xopg_hdump_img_itm(int uid, int img_w, int img_h, byte[] img_src) {
this.uid = uid; this.img_w = img_w; this.img_h = img_h; this.img_src = img_src;
}
+ public int Uid() {return uid;} private final int uid;
+ public int Img_w() {return img_w;} private final int img_w;
+ public int Img_h() {return img_h;} private final int img_h;
+ public byte[] Img_src() {return img_src;} private final byte[] img_src;
@Override public String toString() {
return String_.Concat_with_str("|", Int_.XtoStr(uid), Int_.XtoStr(img_w), Int_.XtoStr(img_h), String_.new_utf8_(img_src));
}
diff --git a/400_xowa/src/gplx/xowa/dbs/hdumps/saves/Hdump_save_mgr.java b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java
similarity index 61%
rename from 400_xowa/src/gplx/xowa/dbs/hdumps/saves/Hdump_save_mgr.java
rename to 400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java
index 032a021de..94bd2a395 100644
--- a/400_xowa/src/gplx/xowa/dbs/hdumps/saves/Hdump_save_mgr.java
+++ b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java
@@ -15,8 +15,9 @@ 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
.
*/
-package gplx.xowa.dbs.hdumps.saves; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.hdumps.*;
-import gplx.dbs.*; import gplx.xowa.files.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*;
+package gplx.xowa.hdumps.saves; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
+import gplx.dbs.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*;
+import gplx.xowa.hdumps.pages.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*;
public class Hdump_save_mgr {
private Bry_bfr tmp_bfr = Bry_bfr.reset_(10 * Io_mgr.Len_mb);
private Hdump_text_tbl text_tbl;
@@ -27,27 +28,24 @@ public class Hdump_save_mgr {
this.Insert(page);
}
public void Insert(Xoa_page page) {
+ tmp_bfr.Clear();
int page_id = page.Revision_data().Id();
Xopg_html_data html_data = page.Html_data();
Xopg_hdump_data hdump_data = page.Hdump_data();
- text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_body, 0, 0, hdump_data.Body());
+ text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_body, hdump_data.Body());
Insert_files(page_id, hdump_data.Imgs());
Insert_if_exists(page_id, Hdump_text_row_tid.Tid_display_ttl, html_data.Display_ttl());
Insert_if_exists(page_id, Hdump_text_row_tid.Tid_content_sub, html_data.Content_sub());
Insert_sidebars(page_id, page, html_data.Xtn_skin_mgr());
}
private void Insert_files(int page_id, ListAdp imgs) {
- int len = imgs.Count();
- for (int i = 0; i < len; ++i) {
- Xof_xfer_itm img = (Xof_xfer_itm)imgs.FetchAt(i);
- int uid = img.Html_uid();
- byte[] data = Hdump_text_row.data_img_(tmp_bfr, uid, img.Html_w(), img.Html_h(), img.Lnki_ttl(), img.Html_view_src_rel());
- text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_img, uid, 0, data);
- }
+ byte[] imgs_bry = Write_imgs(tmp_bfr, imgs);
+ if (imgs_bry != null)
+ text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_img, imgs_bry);
}
private void Insert_if_exists(int page_id, int tid, byte[] val) {
if (Bry_.Len_gt_0(val))
- text_tbl.Insert(page_id, tid, 0, 0, val);
+ text_tbl.Insert(page_id, tid, val);
}
private void Insert_sidebars(int page_id, Xoa_page page, Xopg_xtn_skin_mgr xtn_skin_mgr) {
int len = xtn_skin_mgr.Count();
@@ -55,8 +53,32 @@ public class Hdump_save_mgr {
Xopg_xtn_skin_itm itm = xtn_skin_mgr.Get_at(i);
if (itm.Tid() == Xopg_xtn_skin_itm_tid.Tid_sidebar) {
itm.Write(tmp_bfr, page);
- text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_sidebar_div, i, 0, tmp_bfr.XtoAryAndClear());
+ text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_sidebar_div, tmp_bfr.XtoAryAndClear());
}
}
}
+ public static byte[] Write_imgs(Bry_bfr bfr, ListAdp imgs) {
+ int len = imgs.Count(); if (len == 0) return null; // no images; exit early, else will write blank String
+ for (int i = 0; i < len; ++i) {
+ Xof_xfer_itm img = (Xof_xfer_itm)imgs.FetchAt(i);
+ Write_img(bfr, img.Html_uid(), img.Html_w(), img.Html_h(), img.Lnki_ttl(), img.Html_view_src_rel());
+ }
+ return bfr.XtoAryAndClear();
+ }
+ private static void Write_img(Bry_bfr bfr, int uid, int img_w, int img_h, byte[] lnki_ttl, byte[] img_src_rel) {
+ bfr .Add_int_variable(uid)
+ .Add_byte_pipe().Add_int_variable(img_w)
+ .Add_byte_pipe().Add_int_variable(img_h)
+ .Add_byte_pipe().Add(lnki_ttl)
+ .Add_byte_pipe().Add(img_src_rel)
+ .Add_byte_nl()
+ ;
+ }
}
+/*
+<0/>|0|metadata
+<1/>|title
+<2/>|content_sub
+<3/>|sidebar
+<4/>|body
+*/
\ No newline at end of file
diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java
index f96f7dfe5..98a87effa 100644
--- a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java
+++ b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java
@@ -94,8 +94,8 @@ public class Xoh_page_wtr_mgr implements GfoInvkAble {
Xow_wiki wiki = page.Wiki();
if (init) {
init = false;
- page_edit_fmtr.Eval_mgr_(wiki.Eval_mgr());
page_read_fmtr.Eval_mgr_(wiki.Eval_mgr());
+ page_edit_fmtr.Eval_mgr_(wiki.Eval_mgr());
page_html_fmtr.Eval_mgr_(wiki.Eval_mgr());
}
Bry_bfr tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_m001();
diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java
index 71d34986d..fcc417919 100644
--- a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java
+++ b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr.java
@@ -106,6 +106,11 @@ public class Xoh_page_wtr_wkr implements Bry_fmtr_arg {
}
}
private void Write_body_wikitext(Bry_bfr bfr, Xoa_app app, Xow_wiki wiki, byte[] data_raw, Xoh_wtr_ctx hctx, Xoa_page page, int ns_id) {
+ byte[] hdump_data = page.Hdump_data().Body();
+ if (Bry_.Len_gt_0(hdump_data)) {
+ bfr.Add(hdump_data);
+ return;
+ }
if (ns_id == Xow_ns_.Id_mediawiki) { // if MediaWiki and wikitext, must be a message; convert args back to php; DATE:2014-06-13
bfr.Add(gplx.xowa.apps.Xoa_gfs_php_mgr.Xto_php(tmp_bfr, Bool_.N, data_raw));
return;
diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__base.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__base.java
index b642bd28a..e855d3e8e 100644
--- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__base.java
+++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__base.java
@@ -16,26 +16,30 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see
.
*/
package gplx.xowa.html.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*;
-import gplx.xowa.files.*; import gplx.xowa.dbs.hdumps.htmls.*;
+import gplx.xowa.files.*; import gplx.xowa.hdumps.htmls.*;
class Xoh_file_html_fmtr__hdump extends Xoh_file_html_fmtr__base {
+ private Bry_bfr tmp_bfr = Bry_bfr.reset_(128);
@gplx.Internal @Override protected Xoh_arg_img_core New_arg_img_core() {return new Xoh_arg_img_core__hdump();}
- @Override public void Html_thumb_core(Bry_bfr tmp_bfr, int uid, byte[] div1_halign, int div2_width, byte[] div2_content) {
- Write_fmt(tmp_bfr, Hdump_html_fmtr__body.Key_img_w, uid);
+ @Override public void Html_thumb_core(Bry_bfr bfr, int uid, byte[] div1_halign, int div2_width, byte[] div2_content) {
+ tmp_bfr.Add(Hdump_html_fmtr__body.Key_img_style);
+ tmp_bfr.Add_int_variable(uid);
+ tmp_bfr.Add_byte_apos();
byte[] div2_width_repl = tmp_bfr.XtoAryAndClear();
- fmtr_thumb_core.Bld_bfr_many(tmp_bfr, uid, div1_halign, div2_width_repl, div2_content);
+ fmtr_thumb_core.Bld_bfr_many(bfr, uid, div1_halign, div2_width_repl, div2_content);
}
- @Override public void Html_thumb_part_magnify(Bry_bfr tmp_bfr, int uid, byte[] a_href, byte[] a_title, byte[] img_src) {Write_fmt(tmp_bfr, Hdump_html_fmtr__body.Key_mda_mgnf, uid);}
- @Override public void Html_thumb_part_info(Bry_bfr tmp_bfr, int uid, byte[] a_href, byte[] img_src) {Write_fmt(tmp_bfr, Hdump_html_fmtr__body.Key_mda_info, uid);}
- @Override public void Html_thumb_part_play(Bry_bfr tmp_bfr, int uid, int a_width, int a_max_width, byte[] a_href, byte[] a_xowa_title, byte[] img_src) {Write_fmt(tmp_bfr, Hdump_html_fmtr__body.Key_mda_play, uid);}
- public static void Write_fmt(Bry_bfr bfr, byte[] key, int uid) {
+ @Override public void Html_thumb_part_magnify(Bry_bfr bfr, int uid, byte[] a_href, byte[] a_title, byte[] img_src) {Write_xnde(bfr, Hdump_html_fmtr__body.Key_file_mgnf, uid);}
+ @Override public void Html_thumb_part_info(Bry_bfr bfr, int uid, byte[] a_href, byte[] img_src) {Write_xnde(bfr, Hdump_html_fmtr__body.Key_file_info, uid);}
+ @Override public void Html_thumb_part_play(Bry_bfr bfr, int uid, int a_width, int a_max_width, byte[] a_href, byte[] a_xowa_title, byte[] img_src) {Write_xnde(bfr, Hdump_html_fmtr__body.Key_file_play, uid);}
+ public static void Write_xnde(Bry_bfr bfr, byte[] key, int uid) {
bfr.Add(key);
bfr.Add_int_variable(uid);
- bfr.Add_byte(Byte_ascii.Gt);
- }
+ bfr.Add(Bry_xnde_end);
+ } private static final byte[] Bry_xnde_end = Bry_.new_ascii_("'/>");
public static final Xoh_file_html_fmtr__hdump Hdump = new Xoh_file_html_fmtr__hdump(); Xoh_file_html_fmtr__hdump() {}
}
public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr {
- private final Xoh_arg_img_core arg_img_core; //Xoh_arg_img_core arg_img_mgnf;
+ private final Xoh_arg_img_core arg_img_core;
+ private Bry_bfr scratch_bfr = Bry_bfr.reset_(128);
public Xoh_file_html_fmtr__base() {
arg_img_core = New_arg_img_core();
}
@@ -56,16 +60,19 @@ public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr {
);
@gplx.Virtual public void Html_thumb_core(Bry_bfr tmp_bfr, int uid, byte[] div1_halign, int div2_width, byte[] div2_content) {
- fmtr_thumb_core.Bld_bfr_many(tmp_bfr, uid, div1_halign, div2_width, div2_content);
- }
+ scratch_bfr.Add(Bry_style_bgn);
+ scratch_bfr.Add_int_variable(div2_width);
+ scratch_bfr.Add(Bry_style_end);
+ fmtr_thumb_core.Bld_bfr_many(tmp_bfr, uid, div1_halign, scratch_bfr.XtoAryAndClear(), div2_content);
+ } private static final byte[] Bry_style_bgn = Bry_.new_ascii_("style=\"width:"), Bry_style_end = Bry_.new_ascii_("px;\"");
protected Bry_fmtr fmtr_thumb_core = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last // REF.MW: Linker.php|makeImageLink2
( "
"
- , "
"
+ , "
"
, "~{div2_content}"
, "
"
, "
"
, ""
- ), "uid", "div1_halign", "div2_width", "div2_content"
+ ), "uid", "div1_halign", "style", "div2_content"
);
public byte[] Html_thumb_part_img(Bry_bfr tmp_bfr, Xoa_page page, Xof_xfer_itm xfer_itm, Xop_lnki_tkn lnki, int uid, byte[] a_href, byte[] img_src, byte[] img_alt) {
Html_thumb_part_img(tmp_bfr, page, xfer_itm, uid, a_href, lnki.Ttl().Page_txt(), xfer_itm.Html_w(), xfer_itm.Html_h(), img_src, img_alt);
@@ -162,7 +169,10 @@ class Xoh_arg_img_core__hdump implements Xoh_arg_img_core {
return this;
}
public void XferAry(Bry_bfr bfr, int idx) {
- Xoh_file_html_fmtr__hdump.Write_fmt(bfr, Hdump_html_fmtr__body.Key_img, uid);
+ bfr.Add_str(" xowa_img='");
+ bfr.Add_int_variable(uid);
+ bfr.Add_str("'");
+// Xoh_file_html_fmtr__hdump.Write_fmt(bfr, Hdump_html_fmtr__body.Key_img, uid);
}
}
class Xoh_arg_img_core__basic implements Xoh_arg_img_core {
diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java
index e3303f0b0..9a83ee651 100644
--- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java
+++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java
@@ -57,27 +57,27 @@ public class Xoh_file_wtr__basic {
) {
img_orig_src = img_view_src = Bry_.Empty; // null out src
}
- if (lnki.Ns_id() == Xow_ns_.Id_media) { // NOTE: regardless of ext (ogg vs jpeg) and literal status (Media vs :Media), [[Media]] links are always rendered the same way; REF.MW:Linker.php|makeMediaLinkObj; PAGE:en.w:Beethoven; EX: [[:Media:De-Ludwig_van_Beethoven.ogg|listen]]); [[File:Beethoven 3.jpg|The [[Media:BeethovenWithLyreGuitar( W. J. Mahler - 1804).jpg|complete painting]]...]]
+ if (lnki.Ns_id() == Xow_ns_.Id_media) // NOTE: regardless of ext (ogg vs jpeg) and literal status (Media vs :Media), [[Media]] links are always rendered the same way; REF.MW:Linker.php|makeMediaLinkObj; PAGE:en.w:Beethoven; EX: [[:Media:De-Ludwig_van_Beethoven.ogg|listen]]); [[File:Beethoven 3.jpg|The [[Media:BeethovenWithLyreGuitar( W. J. Mahler - 1804).jpg|complete painting]]...]]
this.Write_file_ns_media(bfr, ctx, src, lnki, img_orig_src);
- return;
- }
- if ( Xof_ext_.Id_is_video_strict(lnki_ext.Id()) // id is .ogv or .webm
- || ( lnki_ext.Id_is_ogg() // id is ogg
- && wiki.File_mgr().Version_1_y() // version is v1 (v2 always marks ogg as aud); DATE:2014-02-01
- && ( xfer_itm.Html_pass() // NOTE: xfer_itm.Html_pass() checks for video .ogg files (ext = .ogg and thumb is available); EX: WWI;
- || xfer_itm.Meta_itm().State_new() // NOTE: State_new() will always assume that ogg is video; needed for 1st load and dynamic updates
+ else {
+ if ( Xof_ext_.Id_is_video_strict(lnki_ext.Id()) // id is .ogv or .webm
+ || ( lnki_ext.Id_is_ogg() // id is ogg
+ && wiki.File_mgr().Version_1_y() // version is v1 (v2 always marks ogg as aud); DATE:2014-02-01
+ && ( xfer_itm.Html_pass() // NOTE: xfer_itm.Html_pass() checks for video .ogg files (ext = .ogg and thumb is available); EX: WWI;
+ || xfer_itm.Meta_itm().State_new() // NOTE: State_new() will always assume that ogg is video; needed for 1st load and dynamic updates
+ )
)
- )
- ) {
- xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_vid);
- this.Write_file_video(bfr, ctx, src, lnki, uid, div_width, lnki_halign_bry, lnki_href, img_view_src, img_orig_src, img_alt, xfer_itm);
+ ) {
+ xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_vid);
+ this.Write_file_video(bfr, ctx, src, lnki, uid, div_width, lnki_halign_bry, lnki_href, img_view_src, img_orig_src, img_alt, xfer_itm);
+ }
+ else if (lnki_ext.Id_is_audio()) // audio
+ this.Write_file_audio(bfr, ctx, src, lnki, uid, div_width, lnki_halign_bry, lnki_href, img_orig_src, img_alt);
+ else // image
+ this.Write_file_image(bfr, ctx, hctx, src, lnki, xfer_itm, uid, div_width, lnki_halign, lnki_halign_bry, lnki_ttl, lnki_ext, lnki_href, img_view_src, img_orig_src, img_alt);
}
- else if (lnki_ext.Id_is_audio()) // audio
- this.Write_file_audio(bfr, ctx, src, lnki, uid, div_width, lnki_halign_bry, lnki_href, img_orig_src, img_alt);
- else // image
- this.Write_file_image(bfr, ctx, hctx, src, lnki, xfer_itm, uid, div_width, lnki_halign, lnki_halign_bry, lnki_ttl, lnki_ext, lnki_href, img_view_src, img_orig_src, img_alt);
if (hctx.Mode_is_hdump()) {
- byte[] rel_src = Bry_.Len_eq_0(img_view_src) ? Bry_.Empty : Bry_.Mid(img_view_src, xfer_itm.Trg_repo_root().length);
+ byte[] rel_src = Bry_.Len_eq_0(img_view_src) ? Bry_.Empty : Bry_.Mid(img_view_src, wiki.App().Fsys_mgr().File_dir().To_http_file_bry().length);
xfer_itm.Html_view_src_rel_(rel_src);
page.Hdump_data().Imgs().Add(xfer_itm.Clone());
}
diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java
index 0ecd37d70..77f039775 100644
--- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java
+++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java
@@ -92,7 +92,14 @@ public class Xow_popup_mgr implements GfoInvkAble, GfoEvObj {
}
private byte[] Get_popup_html(Xoa_page cur_page, Xow_popup_itm itm) {
try {
- synchronized (async_thread_guard) {
+ synchronized (async_thread_guard) { // queue popups to reduce contention with Load_page_wkr; DATE:2014-08-24
+// Load_popup_wkr load_popup_wkr = new Load_popup_wkr(wiki, cur_page, itm, temp_href, ns_allowed_regy, ns_allowed_regy_key);
+// app.Thread_mgr().Page_load_mgr().Add_at_end(load_popup_wkr);
+// load_popup_wkr.Exec();
+// while (!load_popup_wkr.Rslt_done()) {
+// ThreadAdp_.Sleep(100);
+// }
+// return load_popup_wkr.Rslt_bry();
if (itm.Canceled()) return null;
cur_page.Popup_mgr().Itms().AddReplace(itm.Popup_id(), itm);
app.Href_parser().Parse(temp_href, itm.Page_href(), wiki, cur_page.Ttl().Full_url()); // NOTE: use Full_url, not Page_url, else anchors won't work for non-main ns; PAGE:en.w:Project:Sandbox; DATE:2014-08-07
@@ -112,7 +119,7 @@ public class Xow_popup_mgr implements GfoInvkAble, GfoEvObj {
return null;
}
}
- private static void Update_progress_bar(Xoa_app app, Xoa_page cur_page, Xow_popup_itm itm) {
+ public static void Update_progress_bar(Xoa_app app, Xoa_page cur_page, Xow_popup_itm itm) {
byte[] href = itm.Page_href();
byte[] tooltip = itm.Tooltip();
if (Bry_.Len_gt_0(tooltip))
@@ -216,3 +223,41 @@ class Xow_popup_mgr_ {
return js_wtr.Xto_str_and_clear();
}
}
+class Load_popup_wkr implements Gfo_thread_wkr {
+ private Xow_popup_itm itm; private Xoa_page cur_page; private Xoh_href temp_href;
+ private HashAdp ns_allowed_regy;
+ private Int_obj_ref ns_allowed_regy_key = Int_obj_ref.zero_();
+ public Load_popup_wkr(Xow_wiki wiki, Xoa_page cur_page, Xow_popup_itm itm, Xoh_href temp_href, HashAdp ns_allowed_regy, Int_obj_ref ns_allowed_regy_key) {
+ this.wiki = wiki; this.cur_page = cur_page; this.itm = itm; this.temp_href = temp_href; this.ns_allowed_regy = ns_allowed_regy; this.ns_allowed_regy_key = ns_allowed_regy_key;
+ }
+ public String Name() {return "xowa.load_popup_wkr";}
+ public boolean Resume() {return false;}
+ public Xow_wiki Wiki() {return wiki;} private Xow_wiki wiki;
+ public byte[] Rslt_bry() {return rslt_bry;} private byte[] rslt_bry;
+ public boolean Rslt_done() {return rslt_done;} private boolean rslt_done;
+ public void Rslt_(byte[] bry) {this.rslt_done = true; rslt_bry = bry;}
+ public void Exec() {
+ Xoa_app app = wiki.App();
+ try {
+ if (itm.Canceled()) {Rslt_(null); return;}
+ cur_page.Popup_mgr().Itms().AddReplace(itm.Popup_id(), itm);
+ app.Href_parser().Parse(temp_href, itm.Page_href(), wiki, cur_page.Ttl().Full_url()); // NOTE: use Full_url, not Page_url, else anchors won't work for non-main ns; PAGE:en.w:Project:Sandbox; DATE:2014-08-07
+ Xow_wiki popup_wiki = app.Wiki_mgr().Get_by_key_or_null(temp_href.Wiki());
+ popup_wiki.Init_assert();
+ Xoa_ttl popup_ttl = Xoa_ttl.parse_(popup_wiki, temp_href.Page_and_anchor());
+ if (ns_allowed_regy.Count() > 0 && !ns_allowed_regy.Has(ns_allowed_regy_key.Val_(popup_ttl.Ns().Id()))) {Rslt_(Bry_.Empty); return;}
+ itm.Init(popup_wiki.Domain_bry(), popup_ttl);
+ Xoa_page popup_page = popup_wiki.Data_mgr().Get_page(popup_ttl, false);
+ byte[] rv = popup_wiki.Html_mgr().Module_mgr().Popup_mgr().Parser().Parse(wiki, popup_page, cur_page.Tab(), itm);
+ Xow_popup_mgr.Update_progress_bar(app, cur_page, itm);
+ Rslt_(rv);
+ }
+ catch(Exception e) {
+ app.Usr_dlg().Warn_many("", "", "failed to get popup: href=~{0} err=~{1}", String_.new_utf8_(itm.Page_href()), Err_.Message_gplx_brief(e));
+ Rslt_(null);
+ }
+ finally {
+ app.Thread_mgr().Page_load_mgr().Resume();
+ }
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java b/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java
index 3e11dbf4c..897e97388 100644
--- a/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java
+++ b/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java
@@ -98,7 +98,7 @@ public class Xow_toc_mgr implements Bry_fmtr_arg {
trg.Add(Bry_list_end);
}
}
- public static byte[] Toc_text(Xop_ctx ctx, Xoa_page page, byte[] src, Xop_hdr_tkn hdr) {
+ public static byte[] Toc_text(Xop_ctx ctx, Xoa_page page, byte[] src, Xop_tkn_itm hdr) {
try {
Xow_wiki wiki = page.Wiki();
Bry_bfr bfr = wiki.Utl_bry_bfr_mkr().Get_b128();
diff --git a/400_xowa/src/gplx/xowa/pages/Xopg_tmpl_prepend_mgr.java b/400_xowa/src/gplx/xowa/pages/Xopg_tmpl_prepend_mgr.java
new file mode 100644
index 000000000..05424aa85
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/pages/Xopg_tmpl_prepend_mgr.java
@@ -0,0 +1,61 @@
+/*
+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
.
+*/
+package gplx.xowa.pages; import gplx.*; import gplx.xowa.*;
+import gplx.core.btries.*;
+public class Xopg_tmpl_prepend_mgr {
+ private Bry_bfr[] stack = Bry_bfr_.Ary_empty; private int stack_len, stack_max;
+ public void Clear() {
+ stack = Bry_bfr_.Ary_empty; stack_len = stack_max = 0;
+ }
+ public boolean Tmpl_args_parsing() {return tmpl_args_parsing;} public void Tmpl_args_parsing_(boolean v) {tmpl_args_parsing = v;} private boolean tmpl_args_parsing;
+ public Xopg_tmpl_prepend_mgr Bgn(Bry_bfr bfr) {
+ int new_len = stack_len + 1;
+ if (new_len > stack_max) {
+ stack_max += 8;
+ Bry_bfr[] new_stack = new Bry_bfr[stack_max];
+ Array_.CopyTo(stack, new_stack, 0);
+ stack = new_stack;
+ }
+ stack[stack_len] = bfr;
+ stack_len = new_len;
+ return this;
+ }
+ public void End(Xop_ctx ctx, Bry_bfr bfr, byte[] val, int val_len, boolean called_from_tmpl) {
+ if ( val_len > 0 // val is not empty
+ && tmpl_prepend_nl_trie.Match_bgn(val, 0, val_len) != null // val starts with {| : ; # *; REF.MW:Parser.php|braceSubstitution
+ ) {
+ boolean add = true;
+ if (called_from_tmpl) { // called from tmpl
+ for (int i = stack_len - 1; i > -1; --i) { // iterate backwards over tmpl_stack;
+ Bry_bfr stack_bfr = stack[i];
+ switch (stack_bfr.Get_at_last_or_nil_if_empty()) {
+ case Byte_ascii.Nil: continue; // bfr is empty; ignore it
+ case Byte_ascii.NewLine: add = false; i = -1; break; // bfr ends in \n; don't add and stop; PAGE:bn.w:লিওনেল_মেসি |ko.w:도쿄_지하철_히비야_선|DATE:2014-05-27
+ default: i = -1; break; // bfr has char; stop
+ }
+ }
+ }
+ else // called from func arg; always add \n; EX:vi.w:Friedrich_II_của_Phổ; DATE:2014-04-26
+ add = true;
+ if (add)
+ bfr.Add_byte(Byte_ascii.NewLine);
+ }
+ if (called_from_tmpl) --stack_len;
+ }
+ private static final Btrie_fast_mgr tmpl_prepend_nl_trie = Xop_curly_bgn_lxr.tmpl_bgn_trie_();
+}
diff --git a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java
index cbfe3dc8a..34d62b7da 100644
--- a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java
+++ b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java
@@ -67,6 +67,7 @@ class Xou_history_mgr_fxt {
byte[] ttl_bry = Bry_.new_utf8_(ttl_str);
Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ttl_bry);
Xoa_page page = Xoa_page.test_(wiki, ttl);
+ page.Revision_data().Modified_on_(DateAdp_.Now());
byte[] url_bry = ttl_bry;
if (arg_str != null) url_bry = Bry_.Add(url_bry, Bry_.new_utf8_(arg_str));
Xoa_url url = app.Url_parser().Parse(url_bry);
diff --git a/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java b/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java
index 7c0e3dc45..2cb9561fc 100644
--- a/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java
+++ b/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java
@@ -34,6 +34,7 @@ public class Xoa_wiki_mgr implements GfoInvkAble {
css_installer.Init_by_app(app);
}
public int Count() {return hash.Count();}
+ public void Del(byte[] key) {hash.Del(key);}
public Xow_wiki Get_at(int i) {return Int_.Between(i, 0, this.Count() - 1) ? (Xow_wiki)list.FetchAt(i) : null;}
public Xow_wiki Get_by_key_or_null(byte[] key) {return Bry_.Len_eq_0(key) ? null : (Xow_wiki)hash.Fetch(key);}
public Xow_wiki Get_by_key_or_null(byte[] src, int bgn, int end) {return (Xow_wiki)hash.Get_by_mid(src, bgn, end);}
diff --git a/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache.java b/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache.java
index 19d597a40..570a3aecc 100644
--- a/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache.java
+++ b/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache.java
@@ -22,7 +22,7 @@ public class Xow_page_cache {
public Xow_page_cache(Xow_wiki wiki) {this.wiki = wiki;}
public byte[] Get_or_load_as_src(Xoa_ttl ttl) {
Xow_page_cache_itm rv = Get_or_load_as_itm(ttl);
- return rv == null ? null : rv.Src();
+ return rv == null ? null : rv.Wtxt();
}
public Xow_page_cache_itm Get_or_load_as_itm(Xoa_ttl ttl) {
byte[] ttl_full_db = ttl.Full_db();
diff --git a/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache_itm.java b/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache_itm.java
index c31b7fd86..4798af678 100644
--- a/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache_itm.java
+++ b/400_xowa/src/gplx/xowa/wikis/caches/Xow_page_cache_itm.java
@@ -17,12 +17,11 @@ along with this program. If not, see
.
*/
package gplx.xowa.wikis.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
public class Xow_page_cache_itm {
- public Xow_page_cache_itm(Xoa_ttl ttl, byte[] src, byte[] redirected_src) {
- this.ttl = ttl; this.src = src;
- this.redirected_src = redirected_src;
+ public Xow_page_cache_itm(Xoa_ttl ttl, byte[] wtxt, byte[] redirected_src_wtxt) {
+ this.ttl = ttl; this.wtxt = wtxt; this.redirected_src_wtxt = redirected_src_wtxt;
}
public Xoa_ttl Ttl() {return ttl;} private Xoa_ttl ttl;
- public byte[] Src() {return src;} private byte[] src;
- public byte[] Redirected_src() {return redirected_src;} private byte[] redirected_src;
+ public byte[] Wtxt() {return wtxt;} private byte[] wtxt;
+ public byte[] Redirected_src_wtxt() {return redirected_src_wtxt;} private byte[] redirected_src_wtxt;
public static final Xow_page_cache_itm Null = null;
}
diff --git a/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pages_using_pending_changes_func.java b/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pages_using_pending_changes_func.java
new file mode 100644
index 000000000..cfe05123d
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pages_using_pending_changes_func.java
@@ -0,0 +1,27 @@
+/*
+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
.
+*/
+package gplx.xowa.xtns.flaggedRevs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
+import gplx.xowa.html.*; import gplx.xowa.pages.skins.*; import gplx.xowa.xtns.pfuncs.*;
+public class Pages_using_pending_changes_func extends Pf_func_base {
+ @Override public int Id() {return Xol_kwd_grp_.Id_pagesUsingPendingChanges;}
+ @Override public Pf_func New(int id, byte[] name) {return new Pages_using_pending_changes_func().Name_(name);}
+ @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr) {
+ bfr.Add_int_fixed(0, 1);
+ }
+ public static final Pages_using_pending_changes_func _ = new Pages_using_pending_changes_func(); Pages_using_pending_changes_func() {}
+}
diff --git a/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pages_using_pending_changes_func_tst.java b/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pages_using_pending_changes_func_tst.java
new file mode 100644
index 000000000..e95c03bfe
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pages_using_pending_changes_func_tst.java
@@ -0,0 +1,25 @@
+/*
+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
.
+*/
+package gplx.xowa.xtns.flaggedRevs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
+import org.junit.*; import gplx.xowa.pages.skins.*;
+public class Pages_using_pending_changes_func_tst {
+ @Before public void init() {fxt.Reset();} private Xop_fxt fxt = new Xop_fxt();
+ @Test public void Basic() {
+ fxt.Test_html_full_str("{{PAGESUSINGPENDINGCHANGES}}", "0");
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pending_change_level_func.java b/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pending_change_level_func.java
new file mode 100644
index 000000000..bc650754f
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pending_change_level_func.java
@@ -0,0 +1,25 @@
+/*
+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
.
+*/
+package gplx.xowa.xtns.flaggedRevs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
+import gplx.xowa.html.*; import gplx.xowa.pages.skins.*; import gplx.xowa.xtns.pfuncs.*;
+public class Pending_change_level_func extends Pf_func_base {
+ @Override public int Id() {return Xol_kwd_grp_.Id_pendingChangeLevel;}
+ @Override public Pf_func New(int id, byte[] name) {return new Pending_change_level_func().Name_(name);}
+ @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr) {}// NOOP
+ public static final Pending_change_level_func _ = new Pending_change_level_func(); Pending_change_level_func() {}
+}
diff --git a/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pending_change_level_func_tst.java b/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pending_change_level_func_tst.java
new file mode 100644
index 000000000..3d4c0f9cf
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/xtns/flaggedRevs/Pending_change_level_func_tst.java
@@ -0,0 +1,25 @@
+/*
+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
.
+*/
+package gplx.xowa.xtns.flaggedRevs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
+import org.junit.*; import gplx.xowa.pages.skins.*;
+public class Pending_change_level_func_tst {
+ @Before public void init() {fxt.Reset();} private Xop_fxt fxt = new Xop_fxt();
+ @Test public void Basic() {
+ fxt.Test_html_full_str("{{PENDINGCHANGELEVEL}}", "");
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base_basic_tst.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base_basic_tst.java
index f4a27da0d..63b30685d 100644
--- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base_basic_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base_basic_tst.java
@@ -125,7 +125,10 @@ public class Gallery_mgr_base_basic_tst {
@Test public void Link_is_empty() { // PURPOSE: "link=" causes null pointer exception; DATE:2014-06-15
fxt.Test_html_frag("
File:A.png|link=", "href=\"/wiki/File:A.png\"");
}
-// @Test public void Ttl_caption() { // PURPOSE: category entries get rendered with name only (no ns)
+ @Test public void Dangling_autcloses() { // PURPOSE: dangling gallery should auto-close, not escape; PAGE:en.w:Wikipedia:Featured_pictures_thumbs_43 DATE:2014-08-23
+ fxt.Test_html_frag("
File:A.png|b", ""
// , "
B"
diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java
index 6ab7e10f7..74298675e 100644
--- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java
+++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java
@@ -44,7 +44,7 @@ class Imap_parser {
public Imap_map Parse(Xow_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) {
Imap_map rv = new Imap_map(ctx.Cur_page().Html_data().Xtn_imap_next_id());
Init(wiki, ctx.Cur_page().Url(), wiki.App().Usr_dlg());
- this.Parse(rv, src, xnde.Tag_open_end(), xnde.Tag_close_bgn());
+ this.Parse(rv, src, xnde.Tag_open_end(), xnde.Tag_close_bgn());
return rv;
}
public void Parse(Imap_map rv, byte[] src, int src_bgn, int src_end) {
@@ -66,7 +66,7 @@ class Imap_parser {
}
try {
if (itm_idx == 0)
- Parse_img(rv, itm_bgn, itm_end);
+ itm_end = Parse_img(rv, itm_bgn, itm_end, src_end);
else {
Object tid_obj = tid_trie.Match_bgn_w_byte(b, src, itm_bgn, itm_end);
byte tid_val = tid_obj == null ? Imap_itm_.Tid_invalid : ((Byte_obj_val)tid_obj).Val();
@@ -208,11 +208,12 @@ class Imap_parser {
pts.Add(Double_obj_val.new_(num));
return Bry_finder.Trim_fwd_space_tab(src, num_end, itm_end);
}
- private void Parse_img(Imap_map imap, int itm_bgn, int itm_end) {
- int pos = Bry_finder.Trim_fwd_space_tab(src, itm_bgn, itm_end);
- imap_img_src = Bry_.Add(Xop_tkn_.Lnki_bgn, Bry_.Mid(src, pos, itm_end), Xop_tkn_.Lnki_end);
+ private int Parse_img(Imap_map imap, int itm_bgn, int itm_end, int src_end) {
+ int img_bgn = Bry_finder.Trim_fwd_space_tab(src, itm_bgn, itm_end); // trim ws
+ int img_end = Parse_img__get_img_end(itm_end, src_end);
+ imap_img_src = Bry_.Add(Xop_tkn_.Lnki_bgn, Bry_.Mid(src, img_bgn, img_end), Xop_tkn_.Lnki_end);
Xop_lnki_tkn lnki_tkn = (Xop_lnki_tkn)Parse_link(imap_img_src);
- imap_img_src = imap_root.Data_mid(); // NOTE: need to re-set src to pick up templates; EX:
File:A.png|thumb|{{Test_template}}\n; PAGE:en.w:Kilauea; DATE:2014-07-27
+ imap_img_src = imap_root.Data_mid(); // need to re-set src to pick up templates; EX:
File:A.png|thumb|{{Test_template}}\n; PAGE:en.w:Kilauea; DATE:2014-07-27
Xop_lnki_logger file_wkr = wiki_ctx.Lnki().File_wkr(); // NOTE: do not do imap_ctx.Lnki(); imap_ctx is brand new
if (lnki_tkn == null)
imap_ctx.Wiki().App().Usr_dlg().Warn_many("", "", "image_map failed to find lnki; page=~{0} imageMap=~{1}", String_.new_utf8_(imap_ctx.Cur_page().Ttl().Full_txt()), String_.new_utf8_(imap_img_src));
@@ -222,8 +223,33 @@ class Imap_parser {
wiki_ctx.Cur_page().Lnki_list().Add(lnki_tkn);
if (file_wkr != null) file_wkr.Wkr_exec(wiki_ctx, src, lnki_tkn, gplx.xowa.bldrs.files.Xob_lnki_src_tid.Tid_imageMap);
}
+ return img_end;
}
- private static Btrie_slim_mgr tid_trie = Btrie_slim_mgr.ci_ascii_() // NOTE: names are not i18n'd; // NOTE:ci.ascii:MW_const.en
+ private int Parse_img__get_img_end(int line_end, int src_end) { // heuristic to handle images that span more than one line via ref; en.w:Archaea DATE:2014-08-22
+ int rv = line_end;
+ int pos = line_end + 1;
+ while (pos < src_end) {
+ pos = Bry_finder.Trim_fwd_space_tab(src, pos, src_end); // trim ws
+ if (pos == src_end) break;
+ byte b = src[pos];
+ if (b == Byte_ascii.NewLine) // new-line; end
+ break;
+ else {
+ Object tid_obj = tid_trie.Match_bgn_w_byte(b, src, pos, src_end);
+ if (tid_obj == null) { // not a known imap line; assume continuation of img line and skip to next line
+ imap_ctx.Wiki().App().Usr_dlg().Note_many("", "", "image_map extending image over multiple lines; page=~{0} imageMap=~{1}", String_.new_utf8_(imap_ctx.Cur_page().Ttl().Full_txt()), String_.new_utf8_(imap_img_src));
+ int next_line = Bry_finder.Find_fwd(src, Byte_ascii.NewLine, pos);
+ if (next_line == Bry_finder.Not_found) next_line = src_end;
+ rv = next_line;
+ pos = rv + 1;
+ }
+ else // known imap line; stop
+ break;
+ }
+ }
+ return rv;
+ }
+ private static Btrie_slim_mgr tid_trie = Btrie_slim_mgr.ci_ascii_() // names are not i18n'd; // NOTE:ci.ascii:MW_const.en
.Add_str_byte("desc" , Imap_itm_.Tid_desc)
.Add_str_byte("#" , Imap_itm_.Tid_comment)
.Add_bry_bval(Imap_itm_.Key_dflt , Imap_itm_.Tid_dflt)
diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde_html_all_tst.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde_html_all_tst.java
index 274c0817c..357d85f7c 100644
--- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde_html_all_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde_html_all_tst.java
@@ -198,6 +198,14 @@ public class Imap_xnde_html_all_tst {
, "
"
));
}
+ @Test public void Template_multi_line() { // PURPOSE: handle multiple-line captions; PAGE:en.w:Archaea; DATE:2014-08-22
+ fxt.Test_html_full_frag(String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "File:A.png|thumb|[text"
+ , "]"
+ , ""
+ ), "id=\"cite_ref-0\"");
+ }
}
class Imap_xnde_html_fxt {
public void Reset() {
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java
index f414d03ac..2a117a348 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java
@@ -205,7 +205,8 @@ public class Pf_func_ {
, Xol_kwd_grp_.Id_insider
, Xol_kwd_grp_.Id_massMessage_target
, Xol_kwd_grp_.Id_cascadingSources
- , Xol_kwd_grp_.Id_pendingChangesLevel
+ , Xol_kwd_grp_.Id_pendingChangeLevel
+ , Xol_kwd_grp_.Id_pagesUsingPendingChanges
, Xol_kwd_grp_.Id_bang
};
public static Xot_defn Get_prototype(int id) {
@@ -360,8 +361,10 @@ public class Pf_func_ {
case Xol_kwd_grp_.Id_massMessage_target: return gplx.xowa.xtns.massMessage.Message_target_func._;
+ case Xol_kwd_grp_.Id_pendingChangeLevel: return gplx.xowa.xtns.flaggedRevs.Pending_change_level_func._;
+ case Xol_kwd_grp_.Id_pagesUsingPendingChanges: return gplx.xowa.xtns.flaggedRevs.Pages_using_pending_changes_func._;
+
case Xol_kwd_grp_.Id_cascadingSources:
- case Xol_kwd_grp_.Id_pendingChangesLevel:
return new Pf_func_noop(id);
case Xol_kwd_grp_.Id_bang: return Pf_func_bang._;
default: throw Err_mgr._.unhandled_(id);
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle.java
index 19fbe9657..102137b42 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle.java
@@ -16,18 +16,32 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see
.
*/
package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*;
+import gplx.xowa.html.*;
public class Pfunc_displaytitle extends Pf_func_base {
@Override public int Id() {return Xol_kwd_grp_.Id_page_displaytitle;}
@Override public Pf_func New(int id, byte[] name) {return new Pfunc_displaytitle().Name_(name);}
@Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr) {
byte[] val_dat_ary = Eval_argx(ctx, src, caller, self);
Xow_wiki wiki = ctx.Wiki(); Xop_parser parser = wiki.Parser();
- Xop_ctx new_ctx = Xop_ctx.new_sub_(wiki);
- Xop_root_tkn new_root = parser.Parse_text_to_wdom(new_ctx, val_dat_ary, false);
+ Xop_ctx display_ttl_ctx = Xop_ctx.new_sub_(wiki);
+ Xop_root_tkn display_ttl_root = parser.Parse_text_to_wdom(display_ttl_ctx, val_dat_ary, false);
Bry_bfr tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_b512();
- wiki.Html_mgr().Html_wtr().Write_tkn(tmp_bfr, new_ctx, gplx.xowa.html.Xoh_wtr_ctx.Display_title, new_root.Data_mid(), new_root, 0, new_root);
- byte[] val_html = tmp_bfr.Mkr_rls().XtoAryAndClear();
+ boolean restrict = wiki.Cfg_parser().Display_title_restrict();
+ Xoh_wtr_ctx hctx = restrict ? Xoh_wtr_ctx.Display_title : Xoh_wtr_ctx.Basic; // restrict removes certain HTML (display:none)
+ wiki.Html_mgr().Html_wtr().Write_tkn(tmp_bfr, display_ttl_ctx, hctx, display_ttl_root.Data_mid(), display_ttl_root, 0, display_ttl_root);
+ byte[] val_html = tmp_bfr.XtoAryAndClear();
+ if (restrict) { // restrict only allows displayTitles which have text similar to the pageTitle; PAGE:de.b:Kochbuch/_Druckversion; DATE:2014-08-18
+ Xoa_page page = ctx.Cur_page();
+ wiki.Html_mgr().Html_wtr().Write_tkn(tmp_bfr, display_ttl_ctx, Xoh_wtr_ctx.Alt, display_ttl_root.Data_mid(), display_ttl_root, 0, display_ttl_root);
+ byte[] val_html_as_text_only = tmp_bfr.XtoAryAndClear();
+ gplx.xowa.langs.cases.Xol_case_mgr case_mgr = wiki.Lang().Case_mgr();
+ val_html_as_text_only = case_mgr.Case_build_lower(val_html_as_text_only);
+ byte[] page_ttl_lc = case_mgr.Case_build_lower(page.Ttl().Page_txt());
+ if (!Bry_.Eq(val_html_as_text_only, page_ttl_lc))
+ val_html = null;
+ }
ctx.Cur_page().Html_data().Display_ttl_(val_html);
+ tmp_bfr.Mkr_rls();
}
public static final Pfunc_displaytitle _ = new Pfunc_displaytitle(); Pfunc_displaytitle() {}
}
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle_tst.java
index 033f82b5b..baebc9a3b 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle_tst.java
@@ -19,22 +19,29 @@ package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import g
import org.junit.*;
public class Pfunc_displaytitle_tst {
@Before public void init() {fxt.Reset();} private Pfunc_displaytitle_fxt fxt = new Pfunc_displaytitle_fxt();
- @Test public void Basic() {fxt.Test("{{DISPLAYTITLE:a}}" , "a");}
- @Test public void Apos_italic() {fxt.Test("{{DISPLAYTITLE:''a''}}" , "
a");}
+ @Test public void Basic() {fxt.Init_restrict(Bool_.N).Test("{{DISPLAYTITLE:B A}}" , "B A");}
+ @Test public void Apos_italic() {fxt.Init_restrict(Bool_.N).Test("{{DISPLAYTITLE:''B A''}}" , "
B A");}
+ @Test public void Restrict_skip() {fxt.Init_restrict(Bool_.Y).Test("{{DISPLAYTITLE:B A}}" , null);} // PURPOSE: skip if text does not match title; PAGE:de.b:Kochbuch/_Druckversion; DATE:2014-08-18
+ @Test public void Restrict_keep_ci() {fxt.Init_restrict(Bool_.Y).Test("{{DISPLAYTITLE:a B}}" , "a B");} // PURPOSE: keep b/c case-insensitiv match; DATE:2014-08-18
+ @Test public void Restrict_keep_tags() {fxt.Init_restrict(Bool_.Y).Test("{{DISPLAYTITLE:
a B}}" , "
a B");}// PURPOSE: keep b/c text match (tags ignored); DATE:2014-08-18
@Test public void Strip_display() {
- String expd_fail = "
a";
- fxt.Test("{{DISPLAYTITLE:
a}}" , expd_fail);
- fxt.Test("{{DISPLAYTITLE:
a}}" , expd_fail);
- fxt.Test("{{DISPLAYTITLE:
a}}" , expd_fail);
- fxt.Test("{{DISPLAYTITLE:
display:none}}" , "
display:none");
+ String expd_fail = "
A b";
+ fxt.Init_restrict(Bool_.Y);
+ fxt.Test("{{DISPLAYTITLE:
A b}}" , expd_fail);
+ fxt.Test("{{DISPLAYTITLE:
A b}}" , expd_fail);
+ fxt.Test("{{DISPLAYTITLE:
A b}}" , expd_fail);
+ fxt.Test("{{DISPLAYTITLE:
display:none}}" , null);
}
}
class Pfunc_displaytitle_fxt {
private Xop_fxt fxt = new Xop_fxt();
public void Reset() {
fxt.Reset();
+ fxt.Page_ttl_("A b");
}
+ public Pfunc_displaytitle_fxt Init_restrict(boolean v) {fxt.Wiki().Cfg_parser().Display_title_restrict_(v); return this;}
public void Test(String raw, String expd) {
+ fxt.Page().Html_data().Display_ttl_(null); // TEST: always reset; needed for Strip_display which calls multiple times
fxt.Test_parse_tmpl_str_test(raw, "{{test}}", "");
Tfds.Eq(expd, String_.new_utf8_(fxt.Page().Html_data().Display_ttl()));
}
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_misc_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_misc_tst.java
index 9e6ecca95..e0fa8b746 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_misc_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_misc_tst.java
@@ -21,5 +21,4 @@ public class Pfunc_misc_tst {
private Xop_fxt fxt = new Xop_fxt();
@Before public void init() {fxt.Reset();}
@Test public void CascadingSources() {fxt.Test_parse_page_all_str("{{CASCADINGSOURCES}}", "");} // PURPOSE: noop; DATE:2014-04-09
- @Test public void PendingChangesLevel() {fxt.Test_parse_page_all_str("{{PENDINGCHANGESLEVEL}}", "");} // PURPOSE: noop; DATE:2014-04-09
}
diff --git a/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java b/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java
index 63f1fb935..4bd1c99ff 100644
--- a/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java
+++ b/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java
@@ -17,7 +17,7 @@ along with this program. If not, see
.
*/
package gplx.xowa.xtns.proofreadPage; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import gplx.xowa.html.*; import gplx.xowa.parsers.amps.*;
-import gplx.xowa.xtns.lst.*;
+import gplx.xowa.xtns.lst.*; import gplx.xowa.pages.*;
public class Pp_pages_nde implements Xox_xnde, Xop_xnde_atr_parser {
private boolean xtn_literal = false;
private Xop_root_tkn xtn_root;
@@ -345,8 +345,9 @@ public class Pp_pages_nde implements Xox_xnde, Xop_xnde_atr_parser {
if (end_sect_bry != null)
cur_sect_end = end_sect_bry;
}
+ Xopg_tmpl_prepend_mgr prepend_mgr = ctx.Cur_page().Tmpl_prepend_mgr().Bgn(full_bfr);
lst_pfunc_wkr.Init_include(ttl.Full_db(), cur_sect_bgn, cur_sect_end).Exec(page_bfr, ctx);
- ctx.Tmpl_prepend_nl(full_bfr, page_bfr.Bfr(), page_bfr.Len());
+ prepend_mgr.End(ctx, full_bfr, page_bfr.Bfr(), page_bfr.Len(), Bool_.Y);
full_bfr.Add_bfr_and_clear(page_bfr);
full_bfr.Add(gplx.html.Html_entity_.Space_bry);
}
diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java
index af8fad711..920dc0b82 100644
--- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java
+++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java
@@ -137,13 +137,13 @@ public class Scrib_lib_title implements Scrib_lib {
Xow_page_cache_itm page_itm = wiki.Cache_mgr().Page_cache().Get_or_load_as_itm(ttl);
byte[] rv = null;
if (page_itm != null) {
- byte[] redirected_src = page_itm.Redirected_src();
+ byte[] redirected_src = page_itm.Redirected_src_wtxt();
if (redirected_src != null) { // page is redirect; use its src, not its target's src; DATE:2014-07-11
rv = redirected_src;
core.Frame_parent().Rslt_is_redirect_(true); // flag frame as redirect, so that \n won't be prepended; EX:"#REDIRECT" x> "\n#REDIRECT"
}
else
- rv = page_itm.Src();
+ rv = page_itm.Wtxt();
}
return rv == null ? rslt.Init_obj(null) : rslt.Init_obj(String_.new_utf8_(rv));
}
diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java
index c4d11a6e3..97e7c10f8 100644
--- a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java
+++ b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java
@@ -128,9 +128,9 @@ public class Xow_wiki implements GfoInvkAble {
file_mgr.Meta_mgr().Clear();
db_mgr.Load_mgr().Clear();
}
- public Xoa_page GetPageByTtl(Xoa_url url, Xoa_ttl ttl) {return GetPageByTtl(url, ttl, lang, app.Gui_mgr().Browser_win().Active_tab());}
- public Xoa_page GetPageByTtl(Xoa_url url, Xoa_ttl ttl, Xog_tab_itm tab) {return GetPageByTtl(url, ttl, lang, tab);}
- private Xoa_page GetPageByTtl(Xoa_url url, Xoa_ttl ttl, Xol_lang lang, Xog_tab_itm tab) {
+ public Xoa_page GetPageByTtl(Xoa_url url, Xoa_ttl ttl) {return GetPageByTtl(url, ttl, lang, app.Gui_mgr().Browser_win().Active_tab(), true);}
+ public Xoa_page GetPageByTtl(Xoa_url url, Xoa_ttl ttl, Xog_tab_itm tab) {return GetPageByTtl(url, ttl, lang, tab, true);}
+ public Xoa_page GetPageByTtl(Xoa_url url, Xoa_ttl ttl, Xol_lang lang, Xog_tab_itm tab, boolean parse_page) {
if (init_needed) Init_wiki(app.User());
Xoa_page page = data_mgr.Get_page(url, ttl, false, false); // get page from data_mgr
if (page.Missing()) { // page doesn't exist
@@ -138,7 +138,7 @@ public class Xow_wiki implements GfoInvkAble {
Xow_wiki commons_wiki = app.Wiki_mgr().Get_by_key_or_null(commons_wiki_key);
if (commons_wiki != null
&& !Bry_.Eq(domain_bry, commons_wiki.Domain_bry())) // if file, check commons wiki; note that !Bry_.Eq is recursion guard
- return commons_wiki.GetPageByTtl(url, ttl, this.lang, tab);
+ return commons_wiki.GetPageByTtl(url, ttl, this.lang, tab, true);
}
else
return page.Missing_();
@@ -146,15 +146,14 @@ public class Xow_wiki implements GfoInvkAble {
if (page.Missing()) return page; // NOTE: commons can return null page
page.Tab_(tab);
page.Lang_(lang);
- gplx.xowa.xtns.scribunto.Scrib_core.Core_page_changed(page); // notify scribunto about page changed
- ParsePage(page, false); // NOTE: do not clear page b/c reused for search
+ if (parse_page)
+ ParsePage(page, false); // NOTE: do not clear page b/c reused for search
return page;
}
- public void ParsePage_root(Xoa_page page, boolean clear) {
- ParsePage(page, clear);
- }
+ public void ParsePage_root(Xoa_page page, boolean clear) {ParsePage(page, clear);}
public void ParsePage(Xoa_page page, boolean clear) {
if (init_needed && !Env_.Mode_testing()) Init_wiki(app.User());
+ gplx.xowa.xtns.scribunto.Scrib_core.Core_page_changed(page); // notify scribunto about page changed
ctx.Cur_page_(page);
Xop_root_tkn root = ctx.Tkn_mkr().Root(page.Data_raw());
if (clear) {page.Clear();}
@@ -224,8 +223,9 @@ public class Xow_wiki implements GfoInvkAble {
if (sqlite_url != null) {
Xodb_mgr_sql db_mgr_sql = this.Db_mgr_create_as_sql();
db_mgr_sql.Init_load(gplx.dbs.Db_connect_.sqlite_(sqlite_url));
- db_mgr_sql.Html_mgr().Enabled_(hdump_enabled);
+ db_mgr_sql.Html_db_enabled_(hdump_enabled);
}
+ if (!Xob_import_marker.Check(this)) {app.Wiki_mgr().Del(domain_bry); init_needed = false; return;} // NOTE: must call after Db_mgr_create_as_sql(); also, must delete wiki from mgr; DATE:2014-08-24
db_mgr.Load_mgr().Load_init(this);
app.Gfs_mgr().Run_url_for(this, fsys_mgr.Cfg_wiki_core_fil());
gplx.xowa.utls.upgrades.Xoa_upgrade_mgr.Check(this);
diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xowc_parser.java b/400_xowa/src_120_wiki/gplx/xowa/Xowc_parser.java
index 535ea9ec1..1655fd149 100644
--- a/400_xowa/src_120_wiki/gplx/xowa/Xowc_parser.java
+++ b/400_xowa/src_120_wiki/gplx/xowa/Xowc_parser.java
@@ -21,12 +21,16 @@ public class Xowc_parser implements GfoInvkAble {
public Xowc_parser(Xow_wiki wiki) {
lnki_cfg = new Xoc_lnki_cfg(wiki);
}
- public boolean Flag_xtns_pages_init() {return flag_xtns_pages_init;} public Xowc_parser Flag_xtns_pages_init_(boolean v) {flag_xtns_pages_init = v; return this;} private boolean flag_xtns_pages_init = true;
public Xoc_lnki_cfg Lnki_cfg() {return lnki_cfg;} private Xoc_lnki_cfg lnki_cfg;
public Xowc_xtns Xtns() {return xtns;} private Xowc_xtns xtns = new Xowc_xtns();
+ public boolean Display_title_restrict() {return display_title_restrict;} public void Display_title_restrict_(boolean v) {display_title_restrict = v;} private boolean display_title_restrict = true;
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
- if (ctx.Match(k, Invk_xtns)) return xtns;
- else if (ctx.Match(k, Invk_lnki)) return lnki_cfg;
- else return GfoInvkAble_.Rv_unhandled;
- } private static final String Invk_xtns = "xtns", Invk_lnki = "lnki";
+ if (ctx.Match(k, Invk_xtns)) return xtns;
+ else if (ctx.Match(k, Invk_lnki)) return lnki_cfg;
+ else if (ctx.Match(k, Invk_display_title_restrict)) return display_title_restrict;
+ else if (ctx.Match(k, Invk_display_title_restrict_)) display_title_restrict = m.ReadYn("v");
+ else return GfoInvkAble_.Rv_unhandled;
+ return this;
+ }
+ private static final String Invk_xtns = "xtns", Invk_lnki = "lnki", Invk_display_title_restrict = "display_title_restrict", Invk_display_title_restrict_ = "display_title_restrict_";
}
diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page.java b/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page.java
index cc2f92ef2..557e1274d 100644
--- a/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page.java
+++ b/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page.java
@@ -28,6 +28,7 @@ public class Xodb_page implements Xobl_data_itm {
public boolean Exists() {return exists;} public Xodb_page Exists_(boolean v) {exists = v; return this;} private boolean exists;
public int Db_file_idx() {return db_file_idx;} public Xodb_page Db_file_idx_(int v) {db_file_idx = v; return this;} private int db_file_idx;
public int Db_row_idx() {return db_row_idx;} public Xodb_page Db_row_idx_(int v) {db_row_idx = v; return this;} private int db_row_idx;
+ public int Html_db_id() {return html_db_id;} public Xodb_page Html_db_id_(int v) {html_db_id = v; return this;} private int html_db_id;
public DateAdp Modified_on() {return modified_on;} public Xodb_page Modified_on_(DateAdp v) {modified_on = v; return this;} DateAdp modified_on;
public Xow_ns Ns() {return ns;} private Xow_ns ns;
public Object Xtn() {return xtn;} public Xodb_page Xtn_(Object v) {this.xtn = v; return this;} Object xtn;
@@ -69,6 +70,7 @@ public class Xodb_page implements Xobl_data_itm {
type_redirect = exists = false;
modified_on = DateAdp_.MinValue;
id_val = null;
+ html_db_id = -1;
}
public void Copy(Xodb_page orig) {
this.id = orig.id;
@@ -84,6 +86,7 @@ public class Xodb_page implements Xobl_data_itm {
this.exists = orig.exists;
this.modified_on = orig.modified_on;
this.id_val = null;
+ this.html_db_id = orig.html_db_id;
}
public Xodb_page Set_all_(int id, int db_file_idx, int db_row_idx, boolean redirect, int text_len, byte[] ttl_wo_ns) {
this.id = id; this.db_file_idx = db_file_idx; this.db_row_idx = db_row_idx; this.type_redirect = redirect; this.text_len = text_len; this.ttl_wo_ns = ttl_wo_ns;
diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java b/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java
index bd2e340e5..5c755e914 100644
--- a/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java
+++ b/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java
@@ -19,10 +19,9 @@ package gplx.xowa; import gplx.*;
import gplx.lists.*; /*ComparerAble*/ import gplx.xowa.bldrs.imports.ctgs.*;
import gplx.xowa.dbs.*; import gplx.xowa.wikis.*; import gplx.xowa.langs.msgs.*;
public class Xow_data_mgr implements GfoInvkAble {
- public Xow_data_mgr(Xow_wiki wiki) {
- this.wiki = wiki; this.redirect_mgr = wiki.Redirect_mgr();
- } private Xop_redirect_mgr redirect_mgr;
+ private Xop_redirect_mgr redirect_mgr;
private Xoa_url tmp_url = Xoa_url.blank_();
+ public Xow_data_mgr(Xow_wiki wiki) {this.wiki = wiki; this.redirect_mgr = wiki.Redirect_mgr();}
public Xow_wiki Wiki() {return wiki;} private Xow_wiki wiki;
public Xoa_page Get_page(Xoa_ttl ttl, boolean called_from_tmpl) {wiki.App().Url_parser().Parse(tmp_url, ttl.Raw()); return Get_page(tmp_url, ttl, called_from_tmpl, false);}
public Xoa_page Get_page_from_msg(Xoa_ttl ttl) {wiki.App().Url_parser().Parse(tmp_url, ttl.Raw()); return Get_page(tmp_url, ttl, false, true);}
@@ -60,7 +59,7 @@ public class Xow_data_mgr implements GfoInvkAble {
wiki.App().Gui_wtr().Prog_many(GRP_KEY, "file_load", "loading page for ~{0}", String_.new_utf8_(ttl.Raw()));
wiki.Db_mgr().Load_mgr().Load_page(db_page, ns, !called_from_tmpl);
byte[] bry = db_page.Text();
- rv.Data_raw_(bry).Revision_data().Modified_on_(db_page.Modified_on()).Id_(db_page.Id());
+ rv.Data_raw_(bry).Revision_data().Modified_on_(db_page.Modified_on()).Id_(db_page.Id()).Html_db_id_(db_page.Html_db_id());
if (redirect_force) return rv;
Xoa_ttl redirect_ttl = redirect_mgr.Extract_redirect(bry, bry.length);
if ( redirect_ttl == null // not a redirect
diff --git a/400_xowa/src_140_lang/gplx/xowa/Xol_kwd_grp_.java b/400_xowa/src_140_lang/gplx/xowa/Xol_kwd_grp_.java
index 446cffcc9..fef442757 100644
--- a/400_xowa/src_140_lang/gplx/xowa/Xol_kwd_grp_.java
+++ b/400_xowa/src_140_lang/gplx/xowa/Xol_kwd_grp_.java
@@ -206,10 +206,11 @@ public static final int
, Id_insider = 185
, Id_massMessage_target = 186
, Id_cascadingSources = 187
-, Id_pendingChangesLevel = 188
-, Id_bang = 189
+, Id_pendingChangeLevel = 188
+, Id_pagesUsingPendingChanges = 189
+, Id_bang = 190
;
-public static final int Id__max = 190;
+public static final int Id__max = 191;
private static byte[] ary_itm_(int id) {
switch (id) {
@@ -401,7 +402,8 @@ case Xol_kwd_grp_.Id_relatedArticles: return Bry_.new_utf8_("relatedArticles");
case Xol_kwd_grp_.Id_insider: return Bry_.new_utf8_("insider");
case Xol_kwd_grp_.Id_massMessage_target: return Bry_.new_utf8_("target");
case Xol_kwd_grp_.Id_cascadingSources: return Bry_.new_utf8_("cascadingSources");
-case Xol_kwd_grp_.Id_pendingChangesLevel: return Bry_.new_utf8_("pendingChangesLevel");
+case Xol_kwd_grp_.Id_pendingChangeLevel: return Bry_.new_utf8_("pendingChangeLevel");
+case Xol_kwd_grp_.Id_pagesUsingPendingChanges: return Bry_.new_utf8_("pagesUsingPendingChanges");
case Xol_kwd_grp_.Id_bang: return Bry_.new_utf8_("!");
default: throw Err_mgr._.unhandled_(id);
}
diff --git a/400_xowa/src_140_lang/gplx/xowa/Xol_lang_.java b/400_xowa/src_140_lang/gplx/xowa/Xol_lang_.java
index 4c75ce08b..04dbedb0c 100644
--- a/400_xowa/src_140_lang/gplx/xowa/Xol_lang_.java
+++ b/400_xowa/src_140_lang/gplx/xowa/Xol_lang_.java
@@ -234,7 +234,8 @@ kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_relatedArticles , "#related");
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_insider , "#insider");
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_massMessage_target , "#target");
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_cascadingSources , "CASCADINGSOURCES");
-kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_pendingChangesLevel , "PENDINGCHANGESLEVEL");
+kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_pendingChangeLevel , "PENDINGCHANGELEVEL");
+kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_pagesUsingPendingChanges , "PAGESUSINGPENDINGCHANGES");
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_bang , "!");
}
}
diff --git a/400_xowa/src_210_bldr_core/gplx/xowa/Xobc_parse_run.java b/400_xowa/src_210_bldr_core/gplx/xowa/Xobc_parse_run.java
deleted file mode 100644
index b67ae8850..000000000
--- a/400_xowa/src_210_bldr_core/gplx/xowa/Xobc_parse_run.java
+++ /dev/null
@@ -1,163 +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
.
-*/
-//namespace gplx.xowa {
-// using gplx.xowa.bldrs; using gplx.xowa.wikis.caches; using gplx.xowa.parsers.lnkis; using gplx.xowa.xtns.pfuncs.ifs;
-// public class Xobc_parse_run : Xob_itm_basic_base, Xob_cmd, GfoInvkAble {
-// public Xobc_parse_run(Xob_bldr bldr, Xow_wiki wiki) {this.Cmd_ctor(bldr, wiki);}
-// public String Cmd_key() {return KEY;} public static final String KEY = "parse.run";
-// public void Cmd_ini(Xob_bldr bldr) {}
-// public void Cmd_bgn(Xob_bldr bldr) {
-// Xow_ns_mgr_.rebuild_(wiki.Lang(), wiki.Ns_mgr()); // rebuild; different lang will change namespaces; EX: de.wikisource.org will have Seite for File and none of {{#lst}} will work
-// ctx = wiki.Ctx(); parser = wiki.Parser();
-// msg_log = ctx.Msg_log();
-// log_dump = new Xoad_wtr_dump(bldr.App().Fsys_mgr().Temp_dir().GenSubDir("parser_dump"));
-// root = ctx.Tkn_mkr().Root(Bry_.Empty);
-// img_dump = new Xobc_lnki_wkr_file(bldr, wiki);
-// ctx.Lnki().File_wkr_(img_dump);
-// math_dump = new Xobc_xnde_math_dump(bldr, wiki);
-// math_dump.Wkr_bgn(bldr);
-// ctg_dump = new Xobc_lnki_wkr_ctg(bldr, wiki);
-// ctx.Xnde().File_wkr_(math_dump);
-// ctx.Tmpl_load_enabled_(false);
-// if (tmpl_on) Tmpl_load(wiki);
-// img_dump.Wkr_bgn(bldr);
-// cur_ns = wiki.Ns_mgr().Ns_main();
-// redirect_mgr = wiki.Redirect_mgr();
-// Xot_invk_tkn.Cache_enabled = true;
-// bldr.App().Wiki_mgr().Wdata_mgr().Enabled_(false);
-// } private Xop_parser parser; Xop_ctx ctx; Gfo_msg_log msg_log; Xoad_wtr_dump log_dump; Xop_root_tkn root;
-// public boolean Tmpl_on() {return tmpl_on;} public Xobc_parse_run Tmpl_on_(boolean v) {tmpl_on = v; return this;} private boolean tmpl_on;
-//// Xobc_lnki_wkr_file img_dump; Xobc_xnde_math_dump math_dump; Xobc_lnki_wkr_ctg ctg_dump;
-// public void Cmd_run() {
-// raw_parser.Init(bldr.Usr_dlg(), wiki, load_len);
-//// compress_max = 50;
-//// Parse_ns(wiki.Ns_mgr().Get_by_id(Xow_ns_.Id_help));
-// compress_max = 10;
-// Parse_ns(wiki.Ns_mgr().Ns_main());
-// compress_max = 5;
-// Parse_ns(wiki.Ns_mgr().Ns_category());
-// compress_max = 20;
-// Parse_ns(wiki.Ns_mgr().Ns_template());
-//// ConsoleAdp._.WriteLine(Int_.XtoStr(Pfunc_ifexist.Count));
-// }
-// public void Cmd_end() {
-// img_dump.Wkr_end();
-// math_dump.Wkr_end();
-// wiki.Cache_mgr().Free_mem_all();
-// }
-// public void Cmd_print() {}
-// private void Parse_ns(Xow_ns ns) {
-// cur_ns = ns;
-// Io_url ns_dir = wiki.Fsys_mgr().Ns_dir().GenSubDir_nest(ns.Num_str(), Xow_dir_info_.Name_page);
-// raw_parser.Init_ns(ns);
-// ns_is_tmpl = ns.Id() == Xow_ns_.Id_template;
-// Parse_dir(ns_dir);
-// Free();
-// log_dump.Flush();
-// } boolean ns_is_tmpl; int compress_max = 20, compress_idx = 0; Xow_ns cur_ns;
-// private void Parse_dir(Io_url dir) {
-// Io_url[] itms = Io_mgr._.QueryDir_args(dir).DirInclude_().ExecAsUrlAry();
-// bldr.Usr_dlg().Prog_many(GRP_KEY, "load_dir", "loading dir: ~{0}", dir.NameAndExt());
-// int itms_len = itms.length;
-// for (int i = 0; i < itms_len; i++) {
-// Io_url itm = itms[i];
-// if (itm.Type_dir()) Parse_dir(itm);
-// else Parse_fil(itm);
-// }
-// }
-// private void Parse_fil(Io_url fil) {
-//// if (String_.Compare(fil.NameOnly(), "0000000927") <= CompareAble_.Same) return;
-// raw_parser.Reset_one(fil);
-// while (raw_parser.Read(raw_page)) {
-// Parse_page(raw_page);
-// }
-// if (++compress_idx >= compress_max) {
-// Free();
-// compress_idx = 0;
-//// Io_mgr._.AppendFilStr("C:\\dump.txt", Xop_xnde_wkr.TEMP_TIMELINE.XtoStrAndClear());
-// }
-// } private Xodb_page_raw_parser raw_parser = new Xodb_page_raw_parser(); Xodb_page raw_page = new Xodb_page();
-// private void Free() {
-// ctx.App().Free_mem(true);
-// gplx.xowa.xtns.scribunto.Scrib_core.Core_invalidate();
-// Env_.GarbageCollect();
-//// Tfds.Write(ctx.App().Tmpl_result_cache().Count());
-// }
-// public void Parse_page(Xodb_page xml_page) {
-// byte[] src = xml_page.Text(), ttl_bry = xml_page.Ttl_w_ns();
-//// Io_mgr._.AppendFilStr("C:\\dump.txt", String_.new_utf8_(ttl_bry) + "\n");
-//// if (String_.Eq(String_.new_utf8_(ttl_bry), "en:Iowa"))
-//// Tfds.Write();
-//// Tfds.Write(String_.new_utf8_(ttl_bry));
-// if (cur_ns.Id() != Xow_ns_.Id_main) // add ns to ttl_bry; EX: A -> Category:A
-// ttl_bry = Bry_.Add(cur_ns.Name_db_w_colon(), ttl_bry);
-// ctx.Cur_page().Ttl_(Xoa_ttl.parse_(wiki, ttl_bry));
-// try {
-// msg_log.Clear();
-// if (ns_is_tmpl)
-// parser.Parse_text_to_defn_obj(ctx, ctx.Tkn_mkr(), wiki.Ns_mgr().Ns_template(), ttl_bry, src);
-// else {
-// parser.Parse_page_all_clear(root, ctx, ctx.Tkn_mkr(), src);
-// root.Clear();
-// }
-// pageCount++;
-// redirect_mgr.Extract_redirect(src, src.length);
-// if (msg_log.Ary_len() > 0) {
-// pageError++;
-// log_dump.Write(ttl_bry, pageCount, ctx.Msg_log());
-// }
-// if (ctx.Wiki().Cache_mgr().Tmpl_result_cache().Count() > 50000) {
-//// sm.Write_info("clearing tmpls");
-// ctx.Wiki().Cache_mgr().Tmpl_result_cache().Clear();
-// }
-// ctx.App().Utl_bry_bfr_mkr().Clear_fail_check();
-// }
-// catch (Exception exc) {
-// bldr.Usr_dlg().Warn_many(GRP_KEY, "parse", "failed to parse ~{0} error ~{1}", ctx.Cur_page().Url().Xto_full_str_safe(), Err_.Message_gplx_brief(exc));
-// ctx.App().Utl_bry_bfr_mkr().Clear();
-// }
-// } private Xop_redirect_mgr redirect_mgr;
-// private void Tmpl_load(Xow_wiki wiki) {
-// Xodb_page_raw_parser raw_parser = new Xodb_page_raw_parser();
-// Io_url dir = wiki.Fsys_mgr().Tmp_dir().GenSubDir_nest(Xobc_parse_dump_templates.KEY, "dump");
-// Io_url[] urls = Io_mgr._.QueryDir_fils(dir);
-// if (urls.length == 0) {
-// bldr.Usr_dlg().Note_many(GRP_KEY, "tmpl_load", "no templates found: ~{0}", dir.Raw());
-// return;
-// }
-// Xow_ns ns_tmpl = wiki.Ns_mgr().Ns_template();
-// raw_parser.Load(bldr.Usr_dlg(), wiki, ns_tmpl, urls, load_len);
-// Xodb_page xml_page = new Xodb_page();
-// Xow_defn_cache tmpl_regy = wiki.Cache_mgr().Defn_cache();
-// while (raw_parser.Read(xml_page)) {
-// Xot_defn_tmpl defn = new Xot_defn_tmpl();
-// defn.Init_by_new(ns_tmpl, xml_page.Ttl_w_ns(), xml_page.Text(), null, false); // NOTE: passing null, false; will be overriden later when Parse is called
-// tmpl_regy.Add(defn, ns_tmpl.Case_match() );
-// }
-// bldr.Usr_dlg().Prog_none(GRP_KEY, "done", "tmpl_load done");
-// }
-// public override Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
-// if (ctx.Match(k, Invk_templates_on_)) tmpl_on = m.ReadBoolOrFalse("v");
-// else return super.Invk(ctx, ikey, k, m);
-// return this;
-// } private static final String Invk_templates_on_ = "templates_on_";
-// public int Load_len() {return load_len;} public Xobc_parse_run Load_len_(int v) {load_len = v; return this;} private int load_len = Io_mgr.Len_mb;
-// public static int pageCount; int pageError;
-// static final String GRP_KEY = "xowa.bldr.parse";
-// }
-//}
diff --git a/400_xowa/src_300_html/gplx/xowa/Xoa_page.java b/400_xowa/src_300_html/gplx/xowa/Xoa_page.java
index 4a5cd7933..8a61b1c7e 100644
--- a/400_xowa/src_300_html/gplx/xowa/Xoa_page.java
+++ b/400_xowa/src_300_html/gplx/xowa/Xoa_page.java
@@ -18,7 +18,7 @@ along with this program. If not, see
.
package gplx.xowa; import gplx.*;
import gplx.xowa.gui.*; import gplx.xowa.gui.views.*; import gplx.xowa.html.*; import gplx.xowa.pages.*;
import gplx.xowa.files.*; import gplx.xowa.xtns.cite.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.html.tocs.*;
-import gplx.xowa.html.modules.popups.*; import gplx.xowa.dbs.hdumps.*;
+import gplx.xowa.html.modules.popups.*; import gplx.xowa.hdumps.pages.*;
public class Xoa_page {
Xoa_page(Xow_wiki wiki, Xoa_ttl ttl) {
this.wiki = wiki; this.ttl = ttl;
@@ -58,6 +58,7 @@ public class Xoa_page {
public boolean Lang_convert_title() {return lang_convert_title;} public Xoa_page Lang_convert_title_(boolean v) {lang_convert_title = v; return this;} private boolean lang_convert_title = true;
public Wdata_external_lang_links_data Wdata_external_lang_links() {return wdata_external_lang_links;} private Wdata_external_lang_links_data wdata_external_lang_links = new Wdata_external_lang_links_data();
public boolean Pages_recursed() {return pages_recursed;} public void Pages_recursed_(boolean v) {pages_recursed = v; } private boolean pages_recursed;
+ public Xopg_tmpl_prepend_mgr Tmpl_prepend_mgr() {return tmpl_prepend_mgr;} private Xopg_tmpl_prepend_mgr tmpl_prepend_mgr = new Xopg_tmpl_prepend_mgr();
public void Tmpl_stack_del() {--tmpl_stack_ary_len;}
public boolean Tmpl_stack_add(byte[] key) {
for (int i = 0; i < tmpl_stack_ary_len; i++) {
@@ -90,6 +91,8 @@ public class Xoa_page {
tmpl_stack_ary = Bry_.Ary_empty;
tmpl_stack_ary_len = tmpl_stack_ary_max = 0;
popup_mgr.Clear();
+ revision_data.Clear();
+ tmpl_prepend_mgr.Clear();
}
public static final Xoa_page Empty = new Xoa_page().Missing_();
public static final Xoa_page Null = null;
diff --git a/400_xowa/src_300_html/gplx/xowa/Xoa_revision_data.java b/400_xowa/src_300_html/gplx/xowa/Xoa_revision_data.java
index d841ccc02..35266be31 100644
--- a/400_xowa/src_300_html/gplx/xowa/Xoa_revision_data.java
+++ b/400_xowa/src_300_html/gplx/xowa/Xoa_revision_data.java
@@ -18,7 +18,10 @@ along with this program. If not, see
.
package gplx.xowa; import gplx.*;
public class Xoa_revision_data {
public int Id() {return id;} public Xoa_revision_data Id_(int v) {id = v; return this;} private int id;
- public DateAdp Modified_on() {return modified_on;} public Xoa_revision_data Modified_on_(DateAdp v) {modified_on = v; return this;} DateAdp modified_on = DateAdp_.Now();
+ public DateAdp Modified_on() {return modified_on;} public Xoa_revision_data Modified_on_(DateAdp v) {modified_on = v; return this;} private DateAdp modified_on = DateAdp_.MinValue;
public byte[] User() {return user;} public Xoa_revision_data User_(byte[] v) {user = v; return this;} private byte[] user = Bry_.Empty;
public byte[] Protection_level() {return protection_level;} public Xoa_revision_data Protection_level_(byte[] v) {protection_level = v; return this;} private byte[] protection_level = Bry_.Empty;
+ public int Html_db_id() {return html_db_id;} public void Html_db_id_(int v) {html_db_id = v;} private int html_db_id = -1;
+ public void Clear() {// NOTE: do not clear data b/c saving in Edit will call clear and id will be reset to 0
+ }
}
diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java b/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java
index 05ba1ef00..cd22f7974 100644
--- a/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java
+++ b/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java
@@ -51,7 +51,7 @@ public class Xop_ctx {
public int Tmpl_tkn_max() {return tmpl_tkn_max;} public void Tmpl_tkn_max_(int v) {tmpl_tkn_max = v;} private int tmpl_tkn_max = Int_.MaxValue;
public Xop_keeplist_wiki Tmpl_keeplist() {return tmpl_keeplist;} public void Tmpl_keeplist_(Xop_keeplist_wiki v) {this.tmpl_keeplist = v;} private Xop_keeplist_wiki tmpl_keeplist;
public boolean Tmpl_args_parsing() {return tmpl_args_parsing;} public Xop_ctx Tmpl_args_parsing_(boolean v) {tmpl_args_parsing = v; return this;} private boolean tmpl_args_parsing;
- public Bry_bfr Tmpl_output() {return tmpl_output;} public Xop_ctx Tmpl_output_(Bry_bfr v) {tmpl_output = v; return this;} private Bry_bfr tmpl_output;
+ public Bry_bfr Tmpl_output() {return tmpl_output;} public Xop_ctx Tmpl_output_(Bry_bfr v) {tmpl_output = v; return this;} private Bry_bfr tmpl_output; // OBSOLETE: after tmpl_prepend_nl rewrite; DATE:2014-08-21
public Xot_defn_trace Defn_trace() {return defn_trace;} public Xop_ctx Defn_trace_(Xot_defn_trace v) {defn_trace = v; return this;} private Xot_defn_trace defn_trace = Xot_defn_trace_null._;
public boolean Only_include_evaluate() {return only_include_evaluate;} public Xop_ctx Only_include_evaluate_(boolean v) {only_include_evaluate = v; return this;} private boolean only_include_evaluate;
public Lst_section_nde_mgr Lst_section_mgr() {if (lst_section_mgr == null) lst_section_mgr = new Lst_section_nde_mgr(); return lst_section_mgr;} private Lst_section_nde_mgr lst_section_mgr;
@@ -298,22 +298,6 @@ public class Xop_ctx {
if (stack_pos == -1) return;
ctx.Stack_pop_til(root, src, stack_pos, true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_txt);
}
- public void Tmpl_prepend_nl(Bry_bfr cur, byte[] val, int val_len) { // cur=current bfr; tmpl_output=main bfr that cur will eventually be appended to; val=result of template
- if ( val_len == 0 // val is empty
- || cur.Match_end_byt(Byte_ascii.NewLine) // if cur has \n already, don't add; bn.w:লিওনেল_মেসি |ko.w:도쿄_지하철_히비야_선|DATE:2014-05-27
- || tmpl_prepend_nl_trie.Match_bgn(val, 0, val_len) == null // val does not start with {| : ; # *; REF.MW:Parser.php|braceSubstitution
- ) return;
- Bry_bfr prv_bfr = cur.Len() == 0 // note that cur_bfr should be checked first before tmpl_output
- ? tmpl_output // main template bfr
- : cur // current bfr, which may be localized to within a template; see prepend tests
- ;
- if ( tmpl_args_parsing // if processing template args, always add \n; EX:vi.w:Friedrich_II_của_Phổ; DATE:2014-04-26
- || ( prv_bfr != null // note that prv_bfr can be null when called from a subparse, as in Scrib.Preprocess; EX:w:Portal:Canada; DATE:2014-02-13
- && !prv_bfr.Match_end_byt(Byte_ascii.NewLine)) // previous char is not \n;
- ) {
- cur.Add_byte(Byte_ascii.NewLine);
- }
- } private static final Btrie_fast_mgr tmpl_prepend_nl_trie = Xop_curly_bgn_lxr.tmpl_bgn_trie_();
public static Xop_ctx new_(Xow_wiki wiki) {
Xop_ctx rv = new Xop_ctx(wiki, Xoa_page.new_(wiki, Xoa_ttl.parse_(wiki, Xoa_page_.Main_page_bry))); // HACK: use "Main_Page" to put in valid page title
return rv;
diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_fxt.java b/400_xowa/src_400_parser/gplx/xowa/Xop_fxt.java
index 3ad7e4668..9d5c659b3 100644
--- a/400_xowa/src_400_parser/gplx/xowa/Xop_fxt.java
+++ b/400_xowa/src_400_parser/gplx/xowa/Xop_fxt.java
@@ -60,6 +60,7 @@ public class Xop_fxt {
wiki.Db_mgr().Load_mgr().Clear();
app.Wiki_mgr().Clear();
Io_mgr._.InitEngine_mem(); // clear created pages
+ wiki.Cfg_parser().Display_title_restrict_(false); // default to false, as a small number of tests assume restrict = false;
return this;
}
public Xop_fxt Reset_for_msgs() {
@@ -226,6 +227,12 @@ public class Xop_fxt {
Tfds.Eq(expd, String_.new_utf8_(actl));
tst_Log_check();
}
+ public Xop_root_tkn Test_parse_page_tmpl_tkn(String raw) {
+ byte[] raw_bry = Bry_.new_utf8_(raw);
+ Xop_root_tkn root = tkn_mkr.Root(raw_bry);
+ parser.Parse_text_to_wtxt(root, ctx, tkn_mkr, raw_bry);
+ return root;
+ }
public void Test_parse_page_tmpl(String raw, Tst_chkr... expd_ary) {
byte[] raw_bry = Bry_.new_utf8_(raw);
Xop_root_tkn root = tkn_mkr.Root(raw_bry);
diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_redirect_mgr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_redirect_mgr.java
index 6cbb60223..0b2530e70 100644
--- a/400_xowa/src_400_parser/gplx/xowa/Xop_redirect_mgr.java
+++ b/400_xowa/src_400_parser/gplx/xowa/Xop_redirect_mgr.java
@@ -17,9 +17,9 @@ along with this program. If not, see
.
*/
package gplx.xowa; import gplx.*;
import gplx.xowa.html.*;
-public class Xop_redirect_mgr {
- private Hash_adp_bry redirect_hash;
- public Xop_redirect_mgr(Xow_wiki wiki) {this.wiki = wiki;} private Xow_wiki wiki;
+public class Xop_redirect_mgr {
+ private final Xow_wiki wiki; private final Url_encoder url_decoder; private Hash_adp_bry redirect_hash;
+ public Xop_redirect_mgr(Xow_wiki wiki) {this.wiki = wiki; this.url_decoder = wiki.App().Encoder_mgr().Url_ttl();} // NOTE: must be Url_ttl, not Url; PAGE:en.w:Template:Positionskarte+ -> Template:Location_map+, not Template:Location_map DATE:2014-08-21
public void Clear() {redirect_hash = null;} // TEST:
public boolean Is_redirect(byte[] text, int text_len) {return this.Extract_redirect(text, text_len) != null;}
public Xoa_ttl Extract_redirect_loop(byte[] src) {
@@ -45,8 +45,9 @@ public class Xop_redirect_mgr {
ttl_bgn += Xop_tkn_.Lnki_bgn.length;
int ttl_end = Bry_finder.Find_fwd(src, Xop_tkn_.Lnki_end, ttl_bgn);
if (ttl_end == Bry_.NotFound) return Redirect_null_ttl;
- byte[] redirect_ary = Bry_.Mid(src, ttl_bgn, ttl_end);
- return Xoa_ttl.parse_(wiki, redirect_ary);
+ byte[] redirect_bry = Bry_.Mid(src, ttl_bgn, ttl_end);
+ redirect_bry = url_decoder.Decode(redirect_bry); // NOTE: url-decode links; PAGE: en.w:Watcher_(Buffy_the_Vampire_Slayer); DATE:2014-08-18
+ return Xoa_ttl.parse_(wiki, redirect_bry);
}
public static final Xoa_ttl Extract_redirect_is_null = null;
public static final int Redirect_max_allowed = 4;
diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_redirect_mgr_tst.java b/400_xowa/src_400_parser/gplx/xowa/Xop_redirect_mgr_tst.java
index 5a2f56fad..04b4c98a5 100644
--- a/400_xowa/src_400_parser/gplx/xowa/Xop_redirect_mgr_tst.java
+++ b/400_xowa/src_400_parser/gplx/xowa/Xop_redirect_mgr_tst.java
@@ -34,6 +34,11 @@ public class Xop_redirect_mgr_tst {
fxt.Test_redirect("#перенаправление [[A]]", "A");
fxt.Test_redirect("#ПЕРЕНАПРАВЛЕНИЕ [[A]]", "A");
}
+ @Test public void Url_decode() {fxt.Test_redirect("#REDIRECT [[A%28B%29]]" , "A(B)");} // PURPOSE: url-decode links; PAGE:en.w:Watcher_(Buffy_the_Vampire_Slayer); DATE:2014-08-18
+ @Test public void Url_decode_plus() {fxt.Test_redirect("#REDIRECT [[A%28B%29+]]", "A(B)+");} // PURPOSE: do not url-decode +; PAGE:en.w:Template:Positionskarte+; DATE:2014-08-22
+ @Test public void Frame_ttl() { // PURPOSE: redirect should set invk frame title to redirect_trg, not original; PAGE:en.w:Statutory_city DATE:2014-08-22
+ fxt.Test_frame_ttl("Template:A", "#REDIRECT [[Template:B]]", "Template:B", "Template:B");
+ }
}
class Xop_redirect_mgr_fxt {
private Xop_fxt fxt = new Xop_fxt();
@@ -44,6 +49,14 @@ class Xop_redirect_mgr_fxt {
public void Init_utf8() {
fxt.Wiki().Lang().Case_mgr_utf8_();
}
+ public void Test_frame_ttl(String tmpl_ttl_str, String tmpl_wtxt_str, String redirect_ttl, String expd_frame_ttl) {
+ fxt.Init_page_create(tmpl_ttl_str, tmpl_wtxt_str); // create redirect_src
+ fxt.Init_page_create(redirect_ttl, "test"); // create redirect_trg
+ fxt.Test_parse_page_tmpl_tkn("{{" + tmpl_ttl_str + "}}"); // parse {{redirect_src}}
+ Xoa_ttl tmpl_ttl = Xoa_ttl.parse_(fxt.Wiki(), Bry_.new_utf8_(tmpl_ttl_str));
+ Xot_defn_tmpl defn_tmpl = (Xot_defn_tmpl)fxt.Wiki().Cache_mgr().Defn_cache().Get_by_key(tmpl_ttl.Page_db()); // get defn (which parse should have created)
+ Tfds.Eq(expd_frame_ttl, String_.new_utf8_(defn_tmpl.Frame_ttl())); // check frame_ttl
+ }
public void Test_redirect(String raw_str, String expd_str) {
Xop_redirect_mgr redirect_mgr = fxt.Ctx().Wiki().Redirect_mgr();
redirect_mgr.Clear();
diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java
index 917ca7e77..a941dacf4 100644
--- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java
+++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java
@@ -42,12 +42,10 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
int stack_pos = ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_lnki);
if (stack_pos == Xop_ctx.Stack_not_found) return ctx.Lxr_make_txt_(cur_pos); // "]]" found but no "[[" in stack; return literal "]]"
Xop_lnki_tkn lnki = (Xop_lnki_tkn)ctx.Stack_pop_til(root, src, stack_pos, false, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_lnki_end);
- if (Xop_lnki_wkr_.Adjust_for_brack_end_len_of_3(ctx, tkn_mkr, root, src, src_len, cur_pos, lnki)) { // convert "]]]" into "]" + "]]", not "]]" + "]"
- root.Subs_add(tkn_mkr.Bry(bgn_pos, bgn_pos + 1, Byte_ascii.Brack_end_bry)); // add "]" as bry
- ++bgn_pos; ++cur_pos; // position "]]" at end of "]]]"
- }
if (!arg_bldr.Bld(ctx, tkn_mkr, this, Xop_arg_wkr_.Typ_lnki, root, lnki, bgn_pos, cur_pos, lnki.Tkn_sub_idx() + 1, root.Subs_len(), src))
return Xop_lnki_wkr_.Invalidate_lnki(ctx, src, root, lnki, bgn_pos);
+ if (Xop_lnki_wkr_.Adjust_for_brack_end_len_of_3(ctx, tkn_mkr, root, src, src_len, cur_pos, lnki)) // convert "]]]" into "]" + "]]", not "]]" + "]"
+ ++cur_pos; // position "]]" at end of "]]]"
cur_pos = Xop_lnki_wkr_.Chk_for_tail(ctx.Lang(), src, cur_pos, src_len, lnki);
lnki.Src_end_(cur_pos); // NOTE: must happen after Chk_for_tail; redundant with above, but above needed b/c of returns
root.Subs_del_after(lnki.Tkn_sub_idx() + 1); // all tkns should now be converted to args in owner; delete everything in root
@@ -265,16 +263,24 @@ class Xop_lnki_wkr_ {
lnki.Thumbtime_(fracs / TimeSpanAdp_.Ratio_f_to_s);
}
public static boolean Adjust_for_brack_end_len_of_3(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int cur_pos, Xop_lnki_tkn lnki) {
- if ( cur_pos < src_len // bounds check
- && src[cur_pos] == Byte_ascii.Brack_end // is next char after "]]", "]"; i.e.: "]]]"; PAGE:en.w:Aubervilliers DATE:2014-06-25
+ if ( cur_pos < src_len // bounds check
+ && src[cur_pos] == Byte_ascii.Brack_end // is next char after "]]", "]"; i.e.: "]]]"; PAGE:en.w:Aubervilliers DATE:2014-06-25
) {
int nxt_pos = cur_pos + 1;
- if ( nxt_pos == src_len // allow "]]]EOS"
- || ( nxt_pos < src_len // bounds check
- && src[nxt_pos] != Byte_ascii.Brack_end // is next char after "]]]", "]"; i.e.: not "]]]]"; PAGE:ru.w:Меркатале_ин_Валь_ди_Песа; DATE:2014-02-04
+ if ( nxt_pos == src_len // allow "]]]EOS"
+ || ( nxt_pos < src_len // bounds check
+ && src[nxt_pos] != Byte_ascii.Brack_end // is next char after "]]]", "]"; i.e.: not "]]]]"; PAGE:ru.w:Меркатале_ин_Валь_ди_Песа; DATE:2014-02-04
)
) {
- return lnki.Ttl() != null; // only change "]]]" to "]" + "]]" if lnki is not title; otherwise [[A]]] -> "A]" which will be invalid; PAGE:en.w: Tall_poppy_syndrome DATE:2014-07-23
+ if ( lnki.Caption_exists() // does a caption exist?
+ && lnki.Caption_tkn().Src_end() + 2 == cur_pos // is "]]]" at end of caption?; 2="]]".Len; handle [http://a.org [[File:A.png|123px]]] PAGE:ar.w:محمد; DATE:2014-08-20
+ && lnki.Ttl() != null // only change "]]]" to "]" + "]]" if lnki is not title; otherwise [[A]]] -> "A]" which will be invalid; PAGE:en.w:Tall_poppy_syndrome DATE:2014-07-23
+ ) {
+ Xop_tkn_itm caption_val_tkn = lnki.Caption_val_tkn();
+ caption_val_tkn.Subs_add(tkn_mkr.Bry(cur_pos, cur_pos + 1, Byte_ascii.Brack_end_bry)); // add "]" as bry
+ caption_val_tkn.Src_end_(caption_val_tkn.Src_end() + 1);
+ return true;
+ }
}
}
return false;
diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java
index 9274a9d41..aaf497ab3 100644
--- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java
+++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java
@@ -30,6 +30,11 @@ public class Xop_lnki_wkr__uncommon_tst {
fxt.Test_parse_page_all_str("[[A]]]" , "
A]"); // title only
fxt.Test_parse_page_all_str("[[A|B]]]" , "
B]"); // title + caption; note that ] should be outside b/c MW has more logic that says "if caption starts with '['", but leaving as is; DATE:2014-07-23
}
+ @Test public void Triple_bracket_with_lnke_lnki() { // PURPOSE: handle [http://a.org [[File:A.png|123px]]]; PAGE:ar.w:محمد DATE:2014-08-20
+ fxt.Test_parse_page_all_str("[http://a.org [[File:A.png|123px]]]"
+ , "

"
+ );
+ }
@Test public void Multiple_captions() { // PURPOSE: multiple captions should be concatenated (used to only take first); EX:zh.d:维基词典:Unicode字符索引/0000–0FFF; DATE:2014-05-05
fxt.Test_parse_page_all_str("[[A|B|C|D]]" , "
B|C|D");
}
diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java
index 4a36dfb05..57170aaac 100644
--- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java
+++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java
@@ -212,7 +212,7 @@ public class Xop_xnde_tag_ {
, Tag_references = new_(Tid_references, "references").Xtn_().Nest_()
, Tag_source = new_(Tid_source, "source").Xtn_().Block_open_bgn_().Block_close_end_() // deactivate pre; pre; PAGE:en.w:Comment_(computer_programming); DATE:2014-06-23
, Tag_syntaxHighlight = new_(Tid_syntaxHighlight, "syntaxHighlight").Xtn_().Block_open_bgn_().Block_close_end_() // deactivate pre; pre; PAGE:en.w:Comment_(computer_programming); DATE:2014-06-23
-, Tag_gallery = new_(Tid_gallery, "gallery").Xtn_().Block_open_bgn_().Block_close_end_()
+, Tag_gallery = new_(Tid_gallery, "gallery").Xtn_().Block_open_bgn_().Block_close_end_().Xtn_auto_close_()
, Tag_imageMap = new_(Tid_imageMap, "imageMap").Xtn_()
, Tag_timeline = new_(Tid_timeline, "timeline").Xtn_()
, Tag_hiero = new_(Tid_hiero, "hiero").Xtn_()
diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java
index 8033a7068..50bee91fa 100644
--- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java
+++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java
@@ -590,12 +590,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
close_bry[i] = src[src_offset + i];
boolean auto_close = false;
int close_bgn = Find_xtn_end_lhs(ctx, tag, src, src_len, open_bgn, open_end, close_bry);
- if (close_bgn == Bry_.NotFound) {
- if (tag.Xtn_auto_close())
- auto_close = true;
- else
- return ctx.Lxr_make_log_(Xop_xnde_log.Xtn_end_not_found, src, open_bgn, open_end);
- }
+ if (close_bgn == Bry_.NotFound) auto_close = true; // auto-close if end not found; verified with
, , , , DATE:2014-08-23
int close_end = -1;
if (auto_close) {
xnde_end = close_bgn = close_end = src_len;
diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_lxr.java b/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_lxr.java
new file mode 100644
index 000000000..184a1ee14
--- /dev/null
+++ b/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_lxr.java
@@ -0,0 +1,36 @@
+/*
+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 .
+*/
+package gplx.xowa; import gplx.*;
+import gplx.core.btries.*;
+public class Xop_curly_bgn_lxr implements Xop_lxr {
+ public byte Lxr_tid() {return Xop_lxr_.Tid_curly_bgn;}
+ public void Init_by_wiki(Xow_wiki wiki, Btrie_fast_mgr core_trie) {core_trie.Add(Hook, this);} public static final byte[] Hook = new byte[] {Byte_ascii.Curly_bgn, Byte_ascii.Curly_bgn};
+ public void Init_by_lang(Xol_lang lang, Btrie_fast_mgr core_trie) {}
+ public int Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) {return ctx.Curly().MakeTkn_bgn(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos);}
+ public static final Xop_curly_bgn_lxr _ = new Xop_curly_bgn_lxr(); Xop_curly_bgn_lxr() {}
+ public static Btrie_fast_mgr tmpl_bgn_trie_() { // hook sequences for adding new_line to tmpl return; "{|" "|-" ":" ";" "#" "*"; EX: "{{a}}" returns "*"; convert to "\n*"
+ Btrie_fast_mgr rv = Btrie_fast_mgr.cs_();
+ rv.Add(Xop_tblw_lxr_ws.Hook_tb, Bry_.Empty);
+ rv.Add(Bry_.new_ascii_("|-"), Bry_.Empty);
+ rv.Add(Byte_ascii.Colon, Bry_.Empty);
+ rv.Add(Byte_ascii.Semic, Bry_.Empty);
+ rv.Add(Byte_ascii.Hash, Bry_.Empty);
+ rv.Add(Byte_ascii.Asterisk, Bry_.Empty);
+ return rv;
+ }
+}
diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_tkn.java b/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_tkn.java
index 654436040..355c2c8ac 100644
--- a/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_tkn.java
+++ b/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_tkn.java
@@ -21,23 +21,6 @@ public class Xop_curly_bgn_tkn extends Xop_tkn_itm_base {
@Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tmpl_curly_bgn;}
public Xop_curly_bgn_tkn(int bgn, int end) {this.Tkn_ini_pos(false, bgn, end);}
}
-class Xop_curly_bgn_lxr implements Xop_lxr {
- public byte Lxr_tid() {return Xop_lxr_.Tid_curly_bgn;}
- public void Init_by_wiki(Xow_wiki wiki, Btrie_fast_mgr core_trie) {core_trie.Add(Hook, this);} public static final byte[] Hook = new byte[] {Byte_ascii.Curly_bgn, Byte_ascii.Curly_bgn};
- public void Init_by_lang(Xol_lang lang, Btrie_fast_mgr core_trie) {}
- public int Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) {return ctx.Curly().MakeTkn_bgn(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos);}
- public static final Xop_curly_bgn_lxr _ = new Xop_curly_bgn_lxr(); Xop_curly_bgn_lxr() {}
- public static Btrie_fast_mgr tmpl_bgn_trie_() { // hook sequences for adding new_line to tmpl return; "{|" "|-" ":" ";" "#" "*"; EX: "{{a}}" returns "*"; convert to "\n*"
- Btrie_fast_mgr rv = Btrie_fast_mgr.cs_();
- rv.Add(Xop_tblw_lxr_ws.Hook_tb, Bry_.Empty);
- rv.Add(Bry_.new_ascii_("|-"), Bry_.Empty);
- rv.Add(Byte_ascii.Colon, Bry_.Empty);
- rv.Add(Byte_ascii.Semic, Bry_.Empty);
- rv.Add(Byte_ascii.Hash, Bry_.Empty);
- rv.Add(Byte_ascii.Asterisk, Bry_.Empty);
- return rv;
- }
-}
class Xop_curly_end_lxr implements Xop_lxr {
public byte Lxr_tid() {return Xop_lxr_.Tid_curly_end;}
public void Init_by_wiki(Xow_wiki wiki, Btrie_fast_mgr core_trie) {core_trie.Add(Hook, this);} public static final byte[] Hook = new byte[] {Byte_ascii.Curly_end, Byte_ascii.Curly_end};
diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl.java
index 77d904631..af7d3d36a 100644
--- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl.java
+++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl.java
@@ -21,6 +21,7 @@ public class Xot_defn_tmpl implements Xot_defn {
public boolean Defn_require_colon_arg() {return false;}
public int Cache_size() {return data_raw.length;}
public byte[] Name() {return name;} private byte[] name; private byte[] full_name;
+ public byte[] Frame_ttl() {return frame_ttl;} public void Frame_ttl_(byte[] v) {frame_ttl = v;} private byte[] frame_ttl;
public byte[] Data_raw() {return data_raw;} private byte[] data_raw;
public byte[] Data_mid() {return data_mid;} public Xot_defn_tmpl Data_mid_(byte[] v) {data_mid = v; return this;} private byte[] data_mid;
public Xop_ctx Ctx() {return ctx;} public Xot_defn_tmpl Ctx_(Xop_ctx v) {ctx = v; return this;} private Xop_ctx ctx;
diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java
index 02154f981..5fe198cd2 100644
--- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java
+++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java
@@ -16,9 +16,8 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa; import gplx.*;
-import gplx.xowa.langs.*;
-import gplx.xowa.langs.vnts.*; import gplx.xowa.langs.cnvs.*;
-import gplx.xowa.wikis.caches.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.xtns.pfuncs.ttls.*;
+import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.langs.cnvs.*;
+import gplx.xowa.wikis.caches.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.pages.*;
public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
public Arg_nde_tkn Name_tkn() {return name_tkn;} public Xot_invk_tkn Name_tkn_(Arg_nde_tkn v) {name_tkn = v; return this;} Arg_nde_tkn name_tkn = Arg_nde_tkn.Null;
public byte Defn_tid() {return defn_tid;} private byte defn_tid = Xot_defn_.Tid_null;
@@ -193,7 +192,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
else { // some templates produce null ttls; EX: "Citation needed{{subst"
defn = wiki.Cache_mgr().Defn_cache().Get_by_key(ttl.Page_db());
if (defn == null && ctx.Tmpl_load_enabled())
- defn = Load_defn(wiki, ctx, ttl, name_ary);
+ defn = Load_defn(wiki, ctx, this, ttl, name_ary);
}
}
}
@@ -212,7 +211,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
}
defn = wiki.Cache_mgr().Defn_cache().Get_by_key(name_ary);
if (defn == null && ctx.Tmpl_load_enabled())
- defn = Load_defn(wiki, ctx, ttl, name_ary);
+ defn = Load_defn(wiki, ctx, this, ttl, name_ary);
if (defn == null) defn = Xot_defn_.Null;
}
}
@@ -254,36 +253,35 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
Xot_defn_tmpl defn_tmpl = (Xot_defn_tmpl)defn;
if (defn_tmpl.Root() == null) defn_tmpl.Parse_tmpl(ctx); // NOTE: defn_tmpl.Root can be null after clearing out cache; must be non-null else will fail in trace; DATE:2013-02-01
Xot_invk invk_tmpl = Xot_defn_tmpl_.CopyNew(ctx, defn_tmpl, this, caller, src, name_ary);
+ invk_tmpl.Frame_ttl_(defn_tmpl.Frame_ttl()); // set frame_ttl; needed for redirects; PAGE:en.w:Statutory_city; DATE:2014-08-22
trace.Trace_bgn(ctx, src, name_ary, caller, invk_tmpl, defn);
-// Bry_bfr bfr_tmpl = Bry_bfr.new_();
-// rv = defn_tmpl.Tmpl_evaluate(ctx, invk_tmpl, bfr_tmpl);
-// ctx.App().Tmpl_prepend_nl(bfr, bfr_tmpl.Bry(), bfr_tmpl.Len());
-// bfr.Add_bfr_and_clear(bfr_tmpl);
-
- Bry_bfr bfr_tmpl = Bry_bfr.new_();
- Bld_key(invk_tmpl, name_ary, bfr_tmpl);
- byte[] rslt_key = bfr_tmpl.XtoAryAndClear();
- Object o = wiki.Cache_mgr().Tmpl_result_cache().Fetch(rslt_key);
- if (o != null) {
- byte[] rslt = (byte[])o;
- ctx.Tmpl_prepend_nl(bfr, rslt, rslt.length);
- bfr.Add(rslt);
- }
- else {
- rv = defn_tmpl.Tmpl_evaluate(ctx, invk_tmpl, bfr_tmpl);
- ctx.Tmpl_prepend_nl(bfr, bfr_tmpl.Bfr(), bfr_tmpl.Len());
- if (Cache_enabled) {
- byte[] rslt_val = bfr_tmpl.XtoAryAndClear();
- bfr.Add(rslt_val);
- HashAdp cache = wiki.Cache_mgr().Tmpl_result_cache();
- cache.Del(rslt_key);
- cache.Add(rslt_key, rslt_val);
+ Bry_bfr rslt_bfr = wiki.Utl_bry_bfr_mkr().Get_k004();
+ try {
+ Bld_key(invk_tmpl, name_ary, rslt_bfr);
+ byte[] rslt_key = rslt_bfr.XtoAryAndClear();
+ Object o = wiki.Cache_mgr().Tmpl_result_cache().Fetch(rslt_key);
+ Xopg_tmpl_prepend_mgr prepend_mgr = ctx.Cur_page().Tmpl_prepend_mgr().Bgn(bfr);
+ if (o != null) {
+ byte[] rslt = (byte[])o;
+ prepend_mgr.End(ctx, bfr, rslt, rslt.length, Bool_.Y);
+ bfr.Add(rslt);
}
- else
- bfr.Add_bfr_and_clear(bfr_tmpl);
- }
- trace.Trace_end(trg_bgn, bfr);
+ else {
+ rv = defn_tmpl.Tmpl_evaluate(ctx, invk_tmpl, rslt_bfr);
+ prepend_mgr.End(ctx, bfr, rslt_bfr.Bfr(), rslt_bfr.Len(), Bool_.Y);
+ if (Cache_enabled) {
+ byte[] rslt_val = rslt_bfr.XtoAryAndClear();
+ bfr.Add(rslt_val);
+ HashAdp cache = wiki.Cache_mgr().Tmpl_result_cache();
+ cache.Del(rslt_key);
+ cache.Add(rslt_key, rslt_val);
+ }
+ else
+ bfr.Add_bfr_and_clear(rslt_bfr);
+ }
+ trace.Trace_end(trg_bgn, bfr);
+ } finally {rslt_bfr.Mkr_rls();}
break;
}
return rv;
@@ -318,8 +316,8 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
defn_func.Func_evaluate(ctx, src, caller, invk, bfr_func);
if (caller.Rslt_is_redirect()) // do not prepend if page is redirect; EX:"#REDIRECT" x> "\n#REDIRECT" DATE:2014-07-11
caller.Rslt_is_redirect_(false); // reset flag; needed for TEST; kludgy, but Rslt_is_redirect is intended for single use
- else
- ctx.Tmpl_prepend_nl(bfr, bfr_func.Bfr(), bfr_func.Len());
+ else
+ ctx.Cur_page().Tmpl_prepend_mgr().End(ctx, bfr, bfr_func.Bfr(), bfr_func.Len(), Bool_.N);
bfr.Add_bfr_and_clear(bfr_func);
}
private static Hash_adp_bry ignore_hash;
@@ -350,7 +348,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
if ( cache_itm != null
// && Bry_.Eq(cache_itm.Ttl().Full_db(), ctx.Cur_page().Page_ttl().Full_db()) // make sure that transcluded item is not same as page_ttl; DATE:2014-01-10
) {
- transclude_src = cache_itm.Src();
+ transclude_src = cache_itm.Wtxt();
page_ttl = cache_itm.Ttl();
}
}
@@ -367,18 +365,22 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
boolean rv = false;
Xot_invk tmp_tmpl = Xot_defn_tmpl_.CopyNew(ctx, transclude_tmpl, this, caller, src, transclude_tmpl.Name());
Bry_bfr tmp_bfr = Bry_bfr.new_();
+ Xopg_tmpl_prepend_mgr prepend_mgr = ctx.Cur_page().Tmpl_prepend_mgr().Bgn(doc);
rv = transclude_tmpl.Tmpl_evaluate(ctx, tmp_tmpl, tmp_bfr);
- ctx.Tmpl_prepend_nl(doc, tmp_bfr.Bfr(), tmp_bfr.Len());
+ prepend_mgr.End(ctx, doc, tmp_bfr.Bfr(), tmp_bfr.Len(), Bool_.Y);
doc.Add_bfr_and_clear(tmp_bfr);
return rv;
}
- public static Xot_defn_tmpl Load_defn(Xow_wiki wiki, Xop_ctx ctx, Xoa_ttl ttl, byte[] name_ary) {
- byte[] tmpl_page_bry = wiki.Cache_mgr().Page_cache().Get_or_load_as_src(ttl);
+ public static Xot_defn_tmpl Load_defn(Xow_wiki wiki, Xop_ctx ctx, Xot_invk_tkn invk_tkn, Xoa_ttl ttl, byte[] name_ary) {
+ Xow_page_cache_itm tmpl_page_itm = wiki.Cache_mgr().Page_cache().Get_or_load_as_itm(ttl);
+ byte[] tmpl_page_bry = tmpl_page_itm == null ? null : tmpl_page_itm.Wtxt();
Xot_defn_tmpl rv = null;
if (tmpl_page_bry != null) {
- byte old_parse_tid = ctx.Parse_tid(); // NOTE: reusing templates is a bad idea; will change Parse_tid and cause strange errors; however, keeping for PERF reasons
+ byte old_parse_tid = ctx.Parse_tid(); // NOTE: reusing ctxs is a bad idea; will change Parse_tid and cause strange errors; however, keeping for PERF reasons
Xow_ns ns_tmpl = wiki.Ns_mgr().Ns_template();
rv = wiki.Parser().Parse_text_to_defn_obj(ctx, ctx.Tkn_mkr(), ns_tmpl, name_ary, tmpl_page_bry);
+ byte[] frame_ttl = tmpl_page_itm.Ttl().Full_txt(); // NOTE: (1) must have ns (Full); (2) must be txt (underscore, not space); EX:Template:Location map+; DATE:2014-08-22
+ rv.Frame_ttl_(frame_ttl); // set defn's frame_ttl; needed for redirect_trg; PAGE:en.w:Statutory_city; DATE:2014-08-22
ctx.Parse_tid_(old_parse_tid);
wiki.Cache_mgr().Defn_cache().Add(rv, ns_tmpl.Case_match());
}
@@ -407,7 +409,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
Xow_page_cache_itm cache_itm = wiki.Cache_mgr().Page_cache().Get_or_load_as_itm(page_ttl);
if ( cache_itm != null) {
if (!Bry_.Eq(cache_itm.Ttl().Full_db(), ctx.Cur_page().Ttl().Full_db())) { // make sure that transcluded item is not same as page_ttl; DATE:2014-01-10
- transclude_tmpl = ctx.Wiki().Parser().Parse_text_to_defn_obj(ctx, ctx.Tkn_mkr(), page_ttl.Ns(), page_ttl.Page_db(), cache_itm.Src());
+ transclude_tmpl = ctx.Wiki().Parser().Parse_text_to_defn_obj(ctx, ctx.Tkn_mkr(), page_ttl.Ns(), page_ttl.Page_db(), cache_itm.Wtxt());
page_ttl = cache_itm.Ttl();
}
}
diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_basic_tst.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_basic_tst.java
index 731f8b272..3295d8752 100644
--- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_basic_tst.java
+++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_basic_tst.java
@@ -429,12 +429,3 @@ public class Xot_invk_wkr_basic_tst {
fxt.Test_parse_tmpl_str("{{!}}", "|");
}
}
-/*
-NOTE_1: function should expand "*a" to "\n*a" even if "*a" is bos
-consider following
-Template:Test with text of "#a"
-a) "a{{test}}" would return "a\n#a" b/c of rule for auto-adding \n
-b) bug was that "{{test}}" would return "#a" b/c "#a" was at bos which would expand to list later
- however, needs to be "\n#a" b/c appended to other strings wherein bos would be irrelevant.
-Actual situation was very complicated. PAGE:en.w:Rome
-*/
diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_prepend_nl_tst.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_prepend_nl_tst.java
index 574c54f09..b299aef24 100644
--- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_prepend_nl_tst.java
+++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_prepend_nl_tst.java
@@ -51,10 +51,10 @@ public class Xot_invk_wkr_prepend_nl_tst {
@Test public void Pfunc() {// PURPOSE: if {| : ; # *, auto add new_line; parser_function variant; PAGE:en.w:Soviet Union; Infobox former country
fxt.Test_parse_tmpl_str_test("" , "z {{#if:true|#a|n}}" , "z \n#a");
}
- @Test public void Bos() { // PURPOSE: function should expand "*a" to "\n*a" even if "*a" is bos; SEE:NOTE_1 PAGE:en.w:Rome and Panoramas;
+ @Test public void Bos() { // PURPOSE: function should expand "*a" to "\n*a" even if "*a" is bos; SEE:NOTE_1 PAGE:en.w:Rome and Panoramas; DATE:2014-02-05
fxt.Test_parse_page_tmpl_str("{{#if:x|*a}}", "\n*a");
}
- @Test public void Tmpl_arg() { // PURPOSE: tmpl arg should auto-create?
+ @Test public void Tmpl_arg() { // PURPOSE: tmpl arg should auto-create; PAGE:vi.w:Friedrich_II_của_Phổ; DATE:2014-04-26
fxt.Init_defn_add("cquote" , "*b");
fxt.Init_defn_add("blockquote" , "{{{1}}}
");
fxt.Test_html_full_str("a\n{{blockquote|{{cquote}}}}"
@@ -68,4 +68,54 @@ public class Xot_invk_wkr_prepend_nl_tst {
)
);
}
+ @Test public void Nested_1_n() { // PURPOSE: handled nested templates; PAGE:en.w:Central_Line en.w:Panama_Canal; DATE:2014-08-21
+ fxt.Init_defn_clear();
+ fxt.Init_defn_add("Nest_1" , "a{{Nest_1_1}}"); // 0: no \n
+ fxt.Init_defn_add("Nest_1_1" , "b\n{{Nest_1_1_1}}"); // 1: \n
+ fxt.Init_defn_add("Nest_1_1_1" , "*c"); // 2: "*" should not prepend \n b/c (1) has \n; used to only check (0)
+ fxt.Test_parse_tmpl_str_test("{{Nest_1}}", "{{test}}", String_.Concat_lines_nl_skip_last
+ ( "ab" // not prepended
+ , "*c"
+ ));
+ }
+ @Test public void Nested_1_y() { // PURPOSE: handled nested templates; PAGE:en.w:Lackawanna_Cut-Off; DATE:2014-08-21
+ fxt.Init_defn_clear();
+ fxt.Init_defn_add("Nest_1" , "a\n{{Nest_1_1}}"); // 0: no \n
+ fxt.Init_defn_add("Nest_1_1" , "b{{Nest_1_1_1}}"); // 1: char
+ fxt.Init_defn_add("Nest_1_1_1" , "*c"); // 2: "*" should prepend \n b/c (1) has char; used to check (0) and not prepend
+ fxt.Test_parse_tmpl_str_test("{{Nest_1}}", "{{test}}", String_.Concat_lines_nl_skip_last
+ ( "a"
+ , "b" // prepended
+ , "*c"
+ ));
+ }
+ @Test public void Nested_0_n() { // PURPOSE: handled nested templates variation of above; DATE:2014-08-21
+ fxt.Init_defn_clear();
+ fxt.Init_defn_add("Nest_1" , "a\n{{Nest_1_1}}"); // 0: \n
+ fxt.Init_defn_add("Nest_1_1" , "{{Nest_1_1_1}}"); // 1: ""
+ fxt.Init_defn_add("Nest_1_1_1" , "*b"); // 2: "*" should not prepend \n b/c (1) is empty and (0) has \n
+ fxt.Test_parse_tmpl_str_test("{{Nest_1}}", "{{test}}", String_.Concat_lines_nl_skip_last
+ ( "a" // not prepended
+ , "*b"
+ ));
+ }
+ @Test public void Nested_0_y() { // PURPOSE: handled nested templates variation of above; DATE:2014-08-21
+ fxt.Init_defn_clear();
+ fxt.Init_defn_add("Nest_1" , "a{{Nest_1_1}}"); // 0: no \n
+ fxt.Init_defn_add("Nest_1_1" , "{{Nest_1_1_1}}"); // 1: ""
+ fxt.Init_defn_add("Nest_1_1_1" , "*b"); // 2: "*" should prepend \n b/c (1) is empty and (0) has char
+ fxt.Test_parse_tmpl_str_test("{{Nest_1}}", "{{test}}", String_.Concat_lines_nl_skip_last
+ ( "a" // prepended
+ , "*b"
+ ));
+ }
}
+/*
+NOTE_1: function should expand "*a" to "\n*a" even if "*a" is bos
+consider following
+Template:Test with text of "#a"
+a) "a{{test}}" would return "a\n#a" b/c of rule for auto-adding \n
+b) bug was that "{{test}}" would return "#a" b/c "#a" was at bos which would expand to list later
+ however, needs to be "\n#a" b/c appended to other strings wherein bos would be irrelevant.
+Actual situation was very complicated. PAGE:en.w:Rome;
+*/
diff --git a/tst/400_xowa/root/file/en.wikipedia.org/fsdb.main/fsdb.atr.00.sqlite3 b/tst/400_xowa/root/file/en.wikipedia.org/fsdb.main/fsdb.atr.00.sqlite3
index 3c209f939..c65796724 100644
Binary files a/tst/400_xowa/root/file/en.wikipedia.org/fsdb.main/fsdb.atr.00.sqlite3 and b/tst/400_xowa/root/file/en.wikipedia.org/fsdb.main/fsdb.atr.00.sqlite3 differ
diff --git a/tst/400_xowa/root/file/en.wikipedia.org/fsdb.user/fsdb.atr.00.sqlite3 b/tst/400_xowa/root/file/en.wikipedia.org/fsdb.user/fsdb.atr.00.sqlite3
index e914a81eb..1b5fbeb31 100644
Binary files a/tst/400_xowa/root/file/en.wikipedia.org/fsdb.user/fsdb.atr.00.sqlite3 and b/tst/400_xowa/root/file/en.wikipedia.org/fsdb.user/fsdb.atr.00.sqlite3 differ
diff --git a/tst/400_xowa/root/file/en.wikipedia.org/wiki.orig#00.sqlite3 b/tst/400_xowa/root/file/en.wikipedia.org/wiki.orig#00.sqlite3
index 4f402f966..cc7c821ab 100644
Binary files a/tst/400_xowa/root/file/en.wikipedia.org/wiki.orig#00.sqlite3 and b/tst/400_xowa/root/file/en.wikipedia.org/wiki.orig#00.sqlite3 differ