mirror of https://github.com/gnosygnu/xowa
Scribunto: Add configurable timeout for en.wikipedia.org and 'Authority_control' [#737]
parent
b51d224f09
commit
97b1055b4e
@ -0,0 +1,25 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2020 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.addons.apps.settings;
|
||||
|
||||
import gplx.langs.jsons.Json_doc;
|
||||
import gplx.xowa.Xow_wiki;
|
||||
|
||||
public interface CfgResolver {
|
||||
String Key();
|
||||
void WhenCfgChanged(Json_doc jdoc);
|
||||
void WhenWikiCreated(Xow_wiki wikii);
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2020 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.addons.apps.settings;
|
||||
|
||||
import gplx.GfoMsg;
|
||||
import gplx.Gfo_invk;
|
||||
import gplx.GfsCtx;
|
||||
import gplx.Ordered_hash;
|
||||
import gplx.Ordered_hash_;
|
||||
import gplx.langs.jsons.Json_doc;
|
||||
import gplx.langs.jsons.Json_parser;
|
||||
import gplx.objects.errs.Err_;
|
||||
import gplx.xowa.Xoa_app;
|
||||
import gplx.xowa.Xow_wiki;
|
||||
import gplx.xowa.addons.Xoax_addon_itm;
|
||||
import gplx.xowa.addons.Xoax_addon_itm__init;
|
||||
import gplx.xowa.xtns.scribunto.cfgs.ScribCfgResolverApp;
|
||||
|
||||
public class SettingsAddon implements Xoax_addon_itm, Xoax_addon_itm__init, Gfo_invk {
|
||||
private final Ordered_hash hash = Ordered_hash_.New();
|
||||
private Json_doc jdoc;
|
||||
private boolean init = true;
|
||||
public String Addon__key() {return ADDON_KEY;} public static final String ADDON_KEY = "xowa.app.settings";
|
||||
|
||||
@Override
|
||||
public void Init_addon_by_app(Xoa_app app) {
|
||||
// NOTE: should move to addon_mgr and create a new interface for settings
|
||||
this.Add(new ScribCfgResolverApp(app));
|
||||
}
|
||||
private void Add(CfgResolver mgr) {
|
||||
hash.Add(mgr.Key(), mgr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Init_addon_by_wiki(Xow_wiki wiki) {
|
||||
if (init) { // NOTE: cannot `init` in `Init_addon_by_app` b/c `Bind_many` will try to load from db, and dbEngine is not set yet
|
||||
Update(wiki.App().Cfg().Get_str_app_or(CFG_PUBLISH, null));
|
||||
}
|
||||
else {
|
||||
if (jdoc == null) return;
|
||||
for (int i = 0; i < hash.Len(); i++) {
|
||||
CfgResolver resolver = (CfgResolver)hash.Get_at(i);
|
||||
resolver.WhenWikiCreated(wiki);
|
||||
}
|
||||
}
|
||||
}
|
||||
private void Update(String json) {
|
||||
init = false;
|
||||
if (json == null) return;
|
||||
this.jdoc = Json_parser.ParseToJdoc(json);
|
||||
if (jdoc == null) return;
|
||||
for (int i = 0; i < hash.Len(); i++) {
|
||||
CfgResolver resolver = (CfgResolver)hash.Get_at(i);
|
||||
resolver.WhenCfgChanged(jdoc);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
switch (k) {
|
||||
case CFG_PUBLISH:
|
||||
Update(m.ReadStrOr("v", null));
|
||||
break;
|
||||
default:
|
||||
throw Err_.New_unhandled_default(k);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
private static final String CFG_PUBLISH = "xowa.app.settings.publish";
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2020 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.scribunto.cfgs;
|
||||
|
||||
public class ScribCfg {
|
||||
public ScribCfg(int timeoutInMs, int sleepInMs, String regexEngine) {
|
||||
this.timeoutInMs = timeoutInMs;
|
||||
this.sleepInMs = sleepInMs;
|
||||
this.regexEngine = regexEngine;
|
||||
}
|
||||
public int TimeoutInMs() {return timeoutInMs;} private int timeoutInMs;
|
||||
public int SleepInMs() {return sleepInMs;} private int sleepInMs;
|
||||
public String RegexEngine() {return regexEngine;} private String regexEngine;
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2020 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.scribunto.cfgs;
|
||||
|
||||
import gplx.Ordered_hash;
|
||||
import gplx.String_;
|
||||
import gplx.langs.jsons.Json_ary;
|
||||
import gplx.langs.jsons.Json_itm_str;
|
||||
import gplx.langs.jsons.Json_nde;
|
||||
|
||||
public interface ScribCfgResolver {
|
||||
String Key();
|
||||
ScribCfg Fallback(); void FallbackSet(ScribCfg v);
|
||||
ScribCfgResolver CloneNew(String key);
|
||||
void Load(Json_nde owner, ScribCfg ownerFallback);
|
||||
ScribCfg Resolve(byte[] page, byte[] mod, byte[] func);
|
||||
}
|
||||
class ScribCfgResolverUtil {
|
||||
public static void LoadNode(Json_nde ownerNde, ScribCfg ownerFallback, String subsKey, Ordered_hash hash, ScribCfgResolver self, ScribCfgResolver proto) {
|
||||
self.FallbackSet(ownerFallback);
|
||||
Json_ary subsNde = ownerNde.Get_as_ary_or_null(subsKey);
|
||||
if (subsNde == null) return;
|
||||
for (int subIdx = 0; subIdx < subsNde.Len(); subIdx++) {
|
||||
Json_nde subNde = subsNde.Get_at_as_nde(subIdx);
|
||||
ScribCfg subArgs = ScribCfgResolverUtil.ParseCfgOr(subNde, ownerFallback);
|
||||
Json_ary subKeys = subNde.Get_as_ary("keys");
|
||||
for (int keyIdx = 0; keyIdx < subKeys.Len(); keyIdx++) {
|
||||
byte[] subKey = subKeys.Get_at(keyIdx).Data_bry();
|
||||
ScribCfgResolver subScope = (ScribCfgResolver)hash.Get_by(subKey);
|
||||
if (subScope == null) {
|
||||
subScope = proto.CloneNew(String_.new_u8(subKey));
|
||||
hash.Add(subKey, subScope);
|
||||
}
|
||||
subScope.FallbackSet(subArgs);
|
||||
subScope.Load(subNde, subArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void LoadLeaf(Json_nde ownerNde, ScribCfg ownerFallback, String subsKey, Ordered_hash hash, ScribCfgResolver self) {
|
||||
self.FallbackSet(ownerFallback);
|
||||
Json_ary subsNde = ownerNde.Get_as_ary_or_null(subsKey);
|
||||
if (subsNde == null) return;
|
||||
for (int idx = 0; idx < subsNde.Len(); idx++) {
|
||||
Json_nde subNde = subsNde.Get_at_as_nde(idx);
|
||||
Json_ary subKeys = subNde.Get_as_ary("keys");
|
||||
for (int keyIdx = 0; keyIdx < subKeys.Len(); keyIdx++) {
|
||||
byte[] subKey = ((Json_itm_str)subKeys.Get_at(keyIdx)).Data_bry();
|
||||
ScribCfg subArgs = ScribCfgResolverUtil.ParseCfgOr(subNde, ownerFallback);
|
||||
hash.Add(subKey, subArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
public static ScribCfg ParseCfgOr(Json_nde owner, ScribCfg or) {
|
||||
Json_nde nde = (Json_nde)owner.Get_as_itm_or_null("scribunto");
|
||||
if (nde == null) return or;
|
||||
|
||||
int timeout = nde.Get_as_int_or("timeout", 0);
|
||||
int sleep = nde.Get_as_int_or("sleep", 0);
|
||||
String regexEngine = nde.Get_as_str_or("regexEngine", "luaj");
|
||||
|
||||
return new ScribCfg(timeout, sleep, regexEngine);
|
||||
}
|
||||
}
|
@ -0,0 +1,186 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2020 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.scribunto.cfgs;
|
||||
|
||||
import gplx.Err_;
|
||||
import gplx.Ordered_hash;
|
||||
import gplx.Ordered_hash_;
|
||||
import gplx.String_;
|
||||
import gplx.langs.jsons.Json_doc;
|
||||
import gplx.langs.jsons.Json_nde;
|
||||
import gplx.xowa.Xoa_app;
|
||||
import gplx.xowa.Xow_wiki;
|
||||
import gplx.xowa.Xowe_wiki;
|
||||
import gplx.xowa.addons.apps.settings.CfgResolver;
|
||||
|
||||
public class ScribCfgResolverApp implements ScribCfgResolver, CfgResolver {
|
||||
private final Xoa_app app;
|
||||
private final Ordered_hash wikis = Ordered_hash_.New_bry();
|
||||
private ScribCfg appInvokeArgs;
|
||||
public ScribCfgResolverApp(Xoa_app app) {
|
||||
this.app = app;
|
||||
}
|
||||
@Override public String Key() {return KEY;} private static final String KEY = "scribCfgResolverApp";
|
||||
@Override public ScribCfg Fallback() {return fallback;} @Override public void FallbackSet(ScribCfg v) {fallback = v;} private ScribCfg fallback;
|
||||
@Override public void WhenWikiCreated(Xow_wiki wikii) {
|
||||
SetResolverCfg(wikii);
|
||||
}
|
||||
@Override public void WhenCfgChanged(Json_doc jdoc) {
|
||||
Json_nde appNde = jdoc.Root_nde();
|
||||
this.appInvokeArgs = ScribCfgResolverUtil.ParseCfgOr(appNde, null);
|
||||
Load(appNde, appInvokeArgs);
|
||||
}
|
||||
@Override public ScribCfg Resolve(byte[] page, byte[] mod, byte[] func) {
|
||||
throw Err_.new_unimplemented_w_msg("appResolver should not be called; only wikiResolver");
|
||||
}
|
||||
@Override public void Load(Json_nde owner, ScribCfg ownerFallback) {
|
||||
ScribCfgResolverUtil.LoadNode(owner, ownerFallback, "wikis", wikis, this, ScribCfgResolverWiki.PROTOTYPE);
|
||||
|
||||
// iterate all wikis; needed b/c wiki could get created before Cfg gets fired
|
||||
for (int i = 0; i < app.Wiki_mgri().Count(); i++) {
|
||||
Xow_wiki wiki = app.Wiki_mgri().Get_at(i);
|
||||
SetResolverCfg(wiki);
|
||||
}
|
||||
}
|
||||
private void SetResolverCfg(Xow_wiki wikii) {
|
||||
Xowe_wiki wiki = (Xowe_wiki)wikii;
|
||||
byte[] key = wiki.Domain_bry();
|
||||
ScribCfgResolverWiki wikiScope = (ScribCfgResolverWiki)wikis.Get_by(key);
|
||||
if (wikiScope == null) { // no defined cfg; create defailt
|
||||
wikiScope = new ScribCfgResolverWiki(String_.new_u8(key));
|
||||
wikis.Add(key, wikiScope); // cache it for future
|
||||
}
|
||||
wiki.Parser_mgr().Scrib().CfgResolverSet(wikiScope);
|
||||
}
|
||||
@Override public ScribCfgResolver CloneNew(String key) {return new ScribCfgResolverApp(null);}
|
||||
public static final ScribCfgResolver PROTOTYPE = new ScribCfgResolverApp(null);
|
||||
}
|
||||
class ScribCfgResolverWiki implements ScribCfgResolver {
|
||||
private final Ordered_hash mods = Ordered_hash_.New_bry();
|
||||
private final Ordered_hash pages = Ordered_hash_.New_bry();
|
||||
public ScribCfgResolverWiki(String wiki) {
|
||||
this.key = wiki;
|
||||
}
|
||||
@Override public String Key() {return key;} private final String key;
|
||||
@Override public ScribCfg Fallback() {return fallback;} @Override public void FallbackSet(ScribCfg v) {fallback = v;} private ScribCfg fallback;
|
||||
@Override public ScribCfg Resolve(byte[] page, byte[] mod, byte[] func) {
|
||||
ScribCfgResolverModule modResolver = (ScribCfgResolverModule)mods.Get_by(mod);
|
||||
if (modResolver == null) {
|
||||
ScribCfgResolverMods pageResolver = (ScribCfgResolverMods)pages.Get_by(mod);
|
||||
return pageResolver == null
|
||||
? fallback
|
||||
: pageResolver.Resolve(page, mod, func);
|
||||
}
|
||||
else {
|
||||
return modResolver.Resolve(page, mod, func);
|
||||
}
|
||||
}
|
||||
@Override public void Load(Json_nde owner, ScribCfg ownerFallback) {
|
||||
ScribCfgResolverUtil.LoadNode(owner, ownerFallback, "scribunto.modules", mods, this, ScribCfgResolverModule.PROTOTYPE);
|
||||
ScribCfgResolverUtil.LoadNode(owner, ownerFallback, "pages", pages, this, ScribCfgResolverMods.PROTOTYPE);
|
||||
}
|
||||
@Override public ScribCfgResolver CloneNew(String key) {return new ScribCfgResolverWiki(key);}
|
||||
public static final ScribCfgResolver PROTOTYPE = new ScribCfgResolverWiki(null);
|
||||
}
|
||||
class ScribCfgResolverModule implements ScribCfgResolver {
|
||||
private final Ordered_hash funcs = Ordered_hash_.New_bry();
|
||||
private final Ordered_hash pages = Ordered_hash_.New_bry();
|
||||
public ScribCfgResolverModule(String mod) {
|
||||
this.key = mod;
|
||||
}
|
||||
@Override public String Key() {return key;} private final String key;
|
||||
@Override public ScribCfg Fallback() {return fallback;} @Override public void FallbackSet(ScribCfg v) {fallback = v;} private ScribCfg fallback;
|
||||
@Override public ScribCfg Resolve(byte[] page, byte[] mod, byte[] func) {
|
||||
ScribCfgResolverPages funcResolver = (ScribCfgResolverPages)funcs.Get_by(func);
|
||||
if (funcResolver == null) {
|
||||
ScribCfgResolverFuncs pageResolver = (ScribCfgResolverFuncs)pages.Get_by(page);
|
||||
return pageResolver == null
|
||||
? fallback
|
||||
: pageResolver.Resolve(page, mod, func);
|
||||
}
|
||||
else {
|
||||
return funcResolver.Resolve(page, mod, func);
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void Load(Json_nde owner, ScribCfg ownerFallback) {
|
||||
ScribCfgResolverUtil.LoadNode(owner, ownerFallback, "funcs", funcs, this, ScribCfgResolverPages.PROTOTYPE);
|
||||
ScribCfgResolverUtil.LoadNode(owner, ownerFallback, "pages", pages, this, ScribCfgResolverFuncs.PROTOTYPE);
|
||||
}
|
||||
|
||||
@Override public ScribCfgResolver CloneNew(String key) {return new ScribCfgResolverModule(key);}
|
||||
public static final ScribCfgResolver PROTOTYPE = new ScribCfgResolverModule(null);
|
||||
}
|
||||
class ScribCfgResolverPages implements ScribCfgResolver {
|
||||
private final Ordered_hash pages = Ordered_hash_.New_bry();
|
||||
public ScribCfgResolverPages(String func) {
|
||||
this.key = func;
|
||||
}
|
||||
@Override public String Key() {return key;} private final String key;
|
||||
@Override public ScribCfg Fallback() {return fallback;} @Override public void FallbackSet(ScribCfg v) {fallback = v;} private ScribCfg fallback;
|
||||
@Override public ScribCfg Resolve(byte[] page, byte[] mod, byte[] func) {
|
||||
ScribCfg rv = (ScribCfg)pages.Get_by(page);
|
||||
return rv == null
|
||||
? fallback
|
||||
: rv;
|
||||
}
|
||||
|
||||
@Override public void Load(Json_nde owner, ScribCfg ownerFallback) {
|
||||
ScribCfgResolverUtil.LoadLeaf(owner, ownerFallback, "pages", pages, this);
|
||||
}
|
||||
|
||||
@Override public ScribCfgResolver CloneNew(String key) {return new ScribCfgResolverPages(key);}
|
||||
public static final ScribCfgResolver PROTOTYPE = new ScribCfgResolverPages(null);
|
||||
}
|
||||
class ScribCfgResolverMods implements ScribCfgResolver {
|
||||
private final Ordered_hash mods = Ordered_hash_.New_bry();
|
||||
public ScribCfgResolverMods(String page) {
|
||||
this.key = page;
|
||||
}
|
||||
@Override public String Key() {return key;} private final String key;
|
||||
@Override public ScribCfg Fallback() {return fallback;} @Override public void FallbackSet(ScribCfg v) {fallback = v;} private ScribCfg fallback;
|
||||
@Override public ScribCfg Resolve(byte[] page, byte[] mod, byte[] func) {
|
||||
ScribCfgResolverFuncs rv = (ScribCfgResolverFuncs)mods.Get_by(mod);
|
||||
return rv == null
|
||||
? fallback
|
||||
: rv.Resolve(page, mod, func);
|
||||
}
|
||||
@Override public void Load(Json_nde owner, ScribCfg ownerFallback) {
|
||||
ScribCfgResolverUtil.LoadNode(owner, ownerFallback, "scribunto.modules", mods, this, ScribCfgResolverFuncs.PROTOTYPE);
|
||||
}
|
||||
@Override public ScribCfgResolver CloneNew(String key) {return new ScribCfgResolverMods(key);}
|
||||
public static final ScribCfgResolver PROTOTYPE = new ScribCfgResolverMods(null);
|
||||
}
|
||||
class ScribCfgResolverFuncs implements ScribCfgResolver {
|
||||
private final Ordered_hash funcs = Ordered_hash_.New_bry();
|
||||
public ScribCfgResolverFuncs(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
@Override public String Key() {return key;} private final String key;
|
||||
@Override public ScribCfg Fallback() {return fallback;} @Override public void FallbackSet(ScribCfg v) {fallback = v;} private ScribCfg fallback;
|
||||
@Override public ScribCfg Resolve(byte[] page, byte[] mod, byte[] func) {
|
||||
ScribCfg rv = (ScribCfg)funcs.Get_by(func);
|
||||
return rv == null
|
||||
? fallback
|
||||
: rv;
|
||||
}
|
||||
@Override public void Load(Json_nde owner, ScribCfg ownerFallback) {
|
||||
ScribCfgResolverUtil.LoadLeaf(owner, ownerFallback, "funcs", funcs, this);
|
||||
}
|
||||
|
||||
@Override public ScribCfgResolver CloneNew(String key) {return new ScribCfgResolverFuncs(key);}
|
||||
public static final ScribCfgResolver PROTOTYPE = new ScribCfgResolverFuncs(null);
|
||||
}
|
@ -0,0 +1,186 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2020 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.scribunto.cfgs;
|
||||
|
||||
import gplx.Bry_;
|
||||
import gplx.core.tests.Gftest;
|
||||
import gplx.langs.jsons.Json_doc;
|
||||
import gplx.langs.jsons.Json_parser;
|
||||
import org.junit.Test;
|
||||
|
||||
public class ScribCfgResolverTest {
|
||||
private final ScribCfgResolverTstr tstr = new ScribCfgResolverTstr();
|
||||
|
||||
@Test public void Pages() {
|
||||
ScribCfgResolver resolver = tstr.Init(ScribCfgResolverPages.PROTOTYPE, "fallback"
|
||||
, "{ 'pages':"
|
||||
, " ["
|
||||
, " { 'keys':['p1', 'p2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'p1re'}"
|
||||
, " }"
|
||||
, " , { 'keys':['p3']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'p3re'}"
|
||||
, " }"
|
||||
, " ]"
|
||||
, "}"
|
||||
);
|
||||
tstr.TestResolve(resolver, "p1", null, null, "p1re");
|
||||
tstr.TestResolve(resolver, "p2", null, null, "p1re");
|
||||
tstr.TestResolve(resolver, "p3", null, null, "p3re");
|
||||
tstr.TestResolve(resolver, "z", null, null, "fallback");
|
||||
}
|
||||
|
||||
@Test public void Funcs() {
|
||||
ScribCfgResolver resolver = tstr.Init(ScribCfgResolverFuncs.PROTOTYPE, "fallback"
|
||||
, "{ 'funcs':"
|
||||
, " ["
|
||||
, " { 'keys':['f1', 'f2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'f1re'}"
|
||||
, " }"
|
||||
, " , { 'keys':['f3']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'f3re'}"
|
||||
, " }"
|
||||
, " ]"
|
||||
, "}"
|
||||
);
|
||||
tstr.TestResolve(resolver, null, null, "f1", "f1re");
|
||||
tstr.TestResolve(resolver, null, null, "f2", "f1re");
|
||||
tstr.TestResolve(resolver, null, null, "f3", "f3re");
|
||||
tstr.TestResolve(resolver, null, null, "z", "fallback");
|
||||
}
|
||||
|
||||
@Test public void Module() {
|
||||
ScribCfgResolver resolver = tstr.Init(ScribCfgResolverModule.PROTOTYPE, "fallback"
|
||||
, "{ 'funcs':"
|
||||
, " ["
|
||||
, " { 'keys':['f1', 'f2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'f1re'}"
|
||||
, " }"
|
||||
, " ]"
|
||||
, ", 'pages':"
|
||||
, " ["
|
||||
, " { 'keys':['p1', 'p2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'p1re'}"
|
||||
, " }"
|
||||
, " ]"
|
||||
, "}"
|
||||
);
|
||||
tstr.TestResolve(resolver, null, null, "f1", "f1re");
|
||||
tstr.TestResolve(resolver, null, null, "f2", "f1re");
|
||||
tstr.TestResolve(resolver, "p1", null, null, "p1re");
|
||||
tstr.TestResolve(resolver, "p2", null, null, "p1re");
|
||||
tstr.TestResolve(resolver, "pz", null, "fz", "fallback");
|
||||
}
|
||||
|
||||
@Test public void Wiki() {
|
||||
ScribCfgResolver resolver = tstr.Init(ScribCfgResolverWiki.PROTOTYPE, "fallback"
|
||||
, "{ 'scribunto.modules':"
|
||||
, " ["
|
||||
, " { 'keys':['m1', 'm2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'m1re'}"
|
||||
, " , 'funcs':"
|
||||
, " ["
|
||||
, " { 'keys':['f1', 'f2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'m1f1re'}"
|
||||
, " }"
|
||||
, " ]"
|
||||
, " , 'pages':"
|
||||
, " ["
|
||||
, " { 'keys':['p1', 'p2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'m1p1re'}"
|
||||
, " }"
|
||||
, " ]"
|
||||
, " }"
|
||||
, " , { 'keys':['m3']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'m3re'}"
|
||||
, " , 'funcs':"
|
||||
, " ["
|
||||
, " { 'keys':['f1', 'f2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'m3f1re'}"
|
||||
, " }"
|
||||
, " ]"
|
||||
, " , 'pages':"
|
||||
, " ["
|
||||
, " { 'keys':['p1', 'p2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'m3p1re'}"
|
||||
, " }"
|
||||
, " ]"
|
||||
, " }"
|
||||
, " ]"
|
||||
, "}"
|
||||
);
|
||||
tstr.TestResolve(resolver, "p1", "mz", "f1", "fallback");
|
||||
tstr.TestResolve(resolver, null, "m1", "f1", "m1f1re");
|
||||
tstr.TestResolve(resolver, null, "m1", "f2", "m1f1re");
|
||||
tstr.TestResolve(resolver, "p1", "m1", null, "m1p1re");
|
||||
tstr.TestResolve(resolver, "p2", "m1", null, "m1p1re");
|
||||
tstr.TestResolve(resolver, "pz", "m1", null, "m1re");
|
||||
tstr.TestResolve(resolver, null, "m3", "f1", "m3f1re");
|
||||
tstr.TestResolve(resolver, null, "m3", "f2", "m3f1re");
|
||||
tstr.TestResolve(resolver, "p1", "m3", null, "m3p1re");
|
||||
tstr.TestResolve(resolver, "p2", "m3", null, "m3p1re");
|
||||
tstr.TestResolve(resolver, "pz", "m3", null, "m3re");
|
||||
}
|
||||
|
||||
@Test public void WikiPageScope() {
|
||||
ScribCfgResolver resolver = tstr.Init(ScribCfgResolverMods.PROTOTYPE, "fallback"
|
||||
, "{ 'scribunto.modules':"
|
||||
, " ["
|
||||
, " { 'keys':['m1', 'm2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'m1re'}"
|
||||
, " , 'funcs':"
|
||||
, " ["
|
||||
, " { 'keys':['f1', 'f2']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'m1f1re'}"
|
||||
, " }"
|
||||
, " ]"
|
||||
, " }"
|
||||
, " ,"
|
||||
, " { 'keys':['m3']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'m3re'}"
|
||||
, " , 'funcs':"
|
||||
, " ["
|
||||
, " { 'keys':['f1']"
|
||||
, " , 'scribunto.invoke':{'regexEngine':'m3f1re'}"
|
||||
, " }"
|
||||
, " ]"
|
||||
, " }"
|
||||
, " ]"
|
||||
, "}"
|
||||
);
|
||||
tstr.TestResolve(resolver, null, "mz", null, "fallback");
|
||||
tstr.TestResolve(resolver, null, "m1", "f1", "m1f1re");
|
||||
tstr.TestResolve(resolver, null, "m2", "f1", "m1f1re");
|
||||
tstr.TestResolve(resolver, null, "m1", "fz", "m1re");
|
||||
tstr.TestResolve(resolver, null, "m3", "f1", "m3f1re");
|
||||
tstr.TestResolve(resolver, null, "m3", "fz", "m3re");
|
||||
}
|
||||
}
|
||||
class ScribCfgResolverTstr {
|
||||
public ScribCfgResolver Init(ScribCfgResolver proto, String fallbackRegexEngine, String... jsonAry) {
|
||||
ScribCfg fallbackArgs = new ScribCfg(1, 2, fallbackRegexEngine);
|
||||
ScribCfgResolver rv = proto.CloneNew("test");
|
||||
|
||||
String json = Json_doc.Make_str_by_apos(jsonAry);
|
||||
Json_doc jdoc = Json_parser.ParseToJdoc(json);
|
||||
rv.Load(jdoc.Root_nde(), fallbackArgs);
|
||||
return rv;
|
||||
}
|
||||
public void TestResolve(ScribCfgResolver resolver, String page, String mod, String func, String expdRegexEngine) {
|
||||
ScribCfg actl = resolver.Resolve(Bry_.new_u8_safe(page), Bry_.new_u8_safe(mod), Bry_.new_u8_safe(func));
|
||||
Gftest.Eq__str(expdRegexEngine, actl.RegexEngine(), func);
|
||||
}
|
||||
}
|
Binary file not shown.
Loading…
Reference in new issue