/* XOWA: the XOWA Offline Wiki Application Copyright (C) 2012-2017 gnosygnu@gmail.com XOWA is licensed under the terms of the General Public License (GPL) Version 3, or alternatively under the terms of the Apache License Version 2.0. You may use XOWA according to either of these licenses as is most appropriate for your project on a case-by-case basis. The terms of each license can be found in the source code repository: GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt */ package gplx.xowa.xtns.proofreadPage; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import org.junit.*; import gplx.xowa.apps.cfgs.*; public class Pp_pages_nde_index_tst { private final Xop_fxt fxt = new Xop_fxt(); @Before public void Init() { Io_mgr.Instance.InitEngine_mem(); fxt.Wiki().Xtn_mgr().Xtn_proofread().Enabled_y_(); fxt.Wiki().Db_mgr().Load_mgr().Clear(); // must clear; otherwise fails b/c files get deleted, but wiki.data_mgr caches the Xowd_regy_mgr (the .reg file) in memory; fxt.Wiki().Ns_mgr().Add_new(Xowc_xtn_pages.Ns_page_id_default, "Page").Add_new(Xowc_xtn_pages.Ns_index_id_default, "Index").Init(); } @After public void term() { fxt.Wiki().Cache_mgr().Free_mem__all(); } @Test public void Repeated() { // PURPOSE: repeated pages should still show (and not be excluded by recursive logic); DATE:2014-01-01 fxt.Init_page_create("Page:A/1", "<pages index=\"A\" from=1 to=1 />abc"); // NOTE: recursive call to self fxt.Init_page_create("Page:D/1", "d"); String main_txt = String_.Concat_lines_nl ( "<pages index=\"A\" from=1 to=1 />" , "text_0" , "<pages index=\"D\" from=1 to=1/>" , "text_1" , "<pages index=\"D\" from=1 to=1/>" ); fxt.Test_parse_page_wiki_str(main_txt, String_.Concat_lines_nl ( "<p>abc " , "</p>" , "text_0" , "<p>d " , "</p>" , "text_1" , "<p>d " , "</p>" )); } @Test public void Index() { fxt.Init_page_create("Index:A", String_.Concat_lines_nl ( "[[ignore]]" , "[[Page:A b/1]]" , "[[Page:A b/2]]" , "[[Page:A b/3]]" , "[[Page:A b/4]]" , "[[Page:A b/5]]" )); fxt.Init_page_create("Page:A_b/1", "A_b/1\n"); fxt.Init_page_create("Page:A_b/2", "A_b/2\n"); fxt.Init_page_create("Page:A_b/3", "A_b/3\n"); fxt.Init_page_create("Page:A_b/4", "A_b/4\n"); fxt.Init_page_create("Page:A_b/5", "A_b/5\n"); fxt.Test_parse_page_wiki_str("<pages index=\"A\" from='A b/2' to='A_b/4' />", String_.Concat_lines_nl ( "<p>A_b/2" , " A_b/3" , " A_b/4" , " " , "</p>" )); fxt.Test_parse_page_wiki_str("<pages index=\"A\" from='A b/2' />", String_.Concat_lines_nl // to missing ( "<p>A_b/2" , " A_b/3" , " A_b/4" , " A_b/5" , " " , "</p>" )); fxt.Test_parse_page_wiki_str("<pages index=\"A\" to='A b/4' />", String_.Concat_lines_nl // from missing ( "<p>A_b/1" , " A_b/2" , " A_b/3" , " A_b/4" , " " , "</p>" )); } @Test public void Index_amp_encoded() { // handle ampersand encoded strings; EX: en.s:Team_Work_Wins!; DATE:2014-01-19 fxt.Init_page_create("Index:\"A\"", "[[Page:\"A\"]]"); fxt.Init_page_create("Page:\"A\"", "a"); fxt.Test_parse_page_wiki_str("<pages index=\""A"\" from='"A"' />", "<p>a \n</p>"); } @Test public void Index_amp_encoded_num() {// handle num-encoded vals; EX: pl.s:Zarządzenie_Nr_11_Ministra_Finansów_z_dnia_21_lipca_2008_r._w_sprawie_ustanowienia_„Dnia_Skarbowości”; DATE:2014-05-07 fxt.Init_page_create("Index:\"A\"", "[[Page:\"A\"]]"); fxt.Init_page_create("Page:\"A\"", "a"); fxt.Test_parse_page_wiki_str("<pages index=\""A"\" from='"A"' />", "<p>a \n</p>"); } // @Test public void Index_all() { // PURPOSE: if from / to not specified, add all titles // fxt.Init_page_create("Index:A", String_.Concat_lines_nl // ( "[[Page:A b/1]]" // , "[[Page:A b/2]]" // )); // fxt.Init_page_create("Page:A_b/1", "A_b/1\n"); // fxt.Init_page_create("Page:A_b/2", "A_b/2\n"); // String main_txt = String_.Concat_lines_nl // ( "<pages index=\"A\" />" // ); // fxt.Test_parse_page_wiki_str(main_txt, String_.Concat_lines_nl // ( "<p>A_b/1" // , "A_b/2" // , "</p>" // )); // } @Test public void Section_failed_when_xnde() { // PURPOSE: section failed to be retrieved if preceding xnde; DATE:2014-01-15 fxt.Init_page_create("Page:A/1", "<b>a</b><section begin=\"sect_0\"/>b<section end=\"sect_0\"/>"); fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=1 to=1 fromsection='sect_0' tosection='sect_0' />", String_.Concat_lines_nl ( "<p>b " , "</p>" )); } @Test public void Index_to_missing() { // PURPOSE: if no to, get rest of pages fxt.Init_page_create("Index:A", String_.Concat_lines_nl ( "[[Page:A b/1]]" , "[[Page:A b/2]]" )); fxt.Init_page_create("Page:A_b/1", "A_b/1\n"); fxt.Init_page_create("Page:A_b/2", "A_b/2\n"); fxt.Test_parse_page_wiki_str("<pages index=\"A\" from='A b/1' />", String_.Concat_lines_nl ( "<p>A_b/1" , " A_b/2" , " " , "</p>" )); } @Test public void Set_from_to_if_missing() { // PURPOSE: if no from / to, set from / to variables; note that earlier version of XO was correctly transcluding content, but just not updating from / to variable; fr.s:Constitution_de_la_France_de_1958_(version_initiale); DATE:2014-05-21 fxt.Init_page_create("MediaWiki:Proofreadpage_header_template", "{{{from}}}-{{{to}}}\n"); fxt.Init_page_create("Index:A", String_.Concat_lines_nl ( "[[Page:A/1]]" , "[[Page:A/2]]" )); fxt.Init_page_create("Page:A/1", "A/1\n"); fxt.Init_page_create("Page:A/2", "A/2\n"); fxt.Test_parse_page_wiki_str("<pages index=\"A\" from='A/1' header='y' />", String_.Concat_lines_nl ( "<p>0-1" , "A/1" , " A/2" , " " , "</p>" )); } @Test public void Various() { fxt.Init_page_create("Page:A/1", "a"); fxt.Init_page_create("Page:A/2", "b"); fxt.Init_page_create("Page:A/3", "c"); fxt.Init_page_create("Page:A/4", "d"); fxt.Init_page_create("Page:A/5", "e"); fxt.Test_parse_page_wiki_str("<pages index=\"A\" include='1-2,4' />", "<p>a b d \n</p>\n"); // include fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=1 to=5 exclude='3' />", "<p>a b d e \n</p>\n"); // exclude fxt.Test_parse_page_wiki_str("<pages index=\"A\" include=5 from=2 to=4 />", "<p>b c d e \n</p>\n"); // include should be sorted fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=1 to=5 step=2 />", "<p>a c e \n</p>\n"); // step fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=1 to=5 step=4 />", "<p>a e \n</p>\n"); // step fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=1 to=5 step=10 />", "<p>a \n</p>\n"); // step fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=3 to=3 />", "<p>c \n</p>\n"); // from = to fxt.Test_parse_page_wiki_str("<pages index=\"A\" to=3/>", "<p> a b c \n</p>\n"); // from omitted fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=3/>", "<p>c d e \n</p>\n"); // to omitted fxt.Test_parse_page_wiki_str("<pages index=\"A\" from='' to=3 />", "<p> a b c \n</p>\n"); // from is blank fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=3 to=''/>", "<p>c d e \n</p>\n"); // to is blank fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=3 to='4.' />", "<p>c d \n</p>\n"); // allow decimal-like number; PAGE:en.w:Haworth's/Chapter_XIX; DATE:2014-01-19 fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=1 to=5 exclude=''3' />", "<p>a b c d e \n</p>\n");// exclude is invalid; EX:fr.s:Sanguis_martyrum/Première_partie/I DATE:2014-01-18 fxt.Test_parse_page_wiki_str("<pages index=\"A\" exclude from=1 to=5 />", "<p>a b c d e \n</p>\n"); // exclude empty; ru.s:ПБЭ/Гуттен,_Ульрих_фон DATE:2014-02-22 } @Test public void Ref() { // PURPOSE: ref on page should show; DATE:2014-01-18 fxt.Init_page_create("Page:A/1", "a<ref>b</ref>c"); fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=1 to=1 /><references/>", String_.Concat_lines_nl ( "<p>a<sup id=\"cite_ref-0\" class=\"reference\"><a href=\"#cite_note-0\">[1]</a></sup>c " , "</p>" , "<ol class=\"references\">" , "<li id=\"cite_note-0\"><span class=\"mw-cite-backlink\"><a href=\"#cite_ref-0\">^</a></span> <span class=\"reference-text\">b</span></li>" , "</ol>" )); } @Test public void Tblw() { // PURPOSE: if page begins with *, {|, etc, , automatically prepend \n (just like templates); DATE:2014-01-23 fxt.Init_page_create("Page:A/1", "a"); fxt.Init_page_create("Page:A/2", "* b"); fxt.Init_page_create("Page:A/3", "c"); fxt.Test_parse_page_wiki_str("<pages index=\"A\" from=1 to=3 />", String_.Concat_lines_nl ( "<p>a " , "</p>" , "" , "<ul>" , " <li> b c " , " </li>" , "</ul>" , "" )); } @Test public void Index_various() {// varying logic depending on whether [[Index:]] has [[Page]] or <pagelist> DATE:2014-01-27 fxt.Init_page_create("Page:A/0", "A/0"); fxt.Init_page_create("Page:A/1", "A/1"); fxt.Init_page_create("Page:A/2", "A/2"); fxt.Init_page_create("Index:A", ""); // [[Index:]] has no [[Page:]] links; interpret to=1 as [[Page:A/1]] fxt.Wiki().Cache_mgr().Free_mem__all(); fxt.Init_page_update("Index:A" , String_.Concat_lines_nl ( "no links" )); fxt.Test_parse_page_wiki_str("<pages index='A' to=1 />", String_.Concat_lines_nl ( "<p>A/0 A/1 " , "</p>" )); // [[Index:]] has [[Page:]] links; interpret to=1 as 1st [[Page:]] in [[Index:]]'s [[Page:]] links fxt.Wiki().Cache_mgr().Free_mem__all(); fxt.Init_page_update("Index:A" , String_.Concat_lines_nl ( "[[Page:A/0]]" )); fxt.Test_parse_page_wiki_str("<pages index='A' to=1 />", String_.Concat_lines_nl ( "<p>A/0 " , "</p>" )); // [[Index:]] has [[Page:]] links but also <pagelist>; interpret to=1 as [[Page:A/1]] fxt.Wiki().Cache_mgr().Free_mem__all(); fxt.Init_page_update("Index:A" , String_.Concat_lines_nl ( "[[Page:A/0]]" , "<pagelist/>" )); fxt.Test_parse_page_wiki_str("<pages index='A' to=1 />", String_.Concat_lines_nl ( "<p>A/0 A/1 " , "</p>" )); } }