@@ -1,6 +1,6 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
Copyright (C) 2012-202 1 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.
@@ -13,338 +13,357 @@ 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.libs.wikibases ; import gplx.* ; import gplx.xowa.* ; import gplx.xowa.xtns.* ; import gplx.xowa.xtns.scribunto.* ; import gplx.xowa.xtns.scribunto.libs.* ;
import org.junit.* ; import gplx.xowa.xtns.wbases.* ; import gplx.xowa.xtns.wbases.core.* ; import gplx.xowa.xtns.wbases.claims.* ; import gplx.xowa.xtns.wbases.claims.itms.* ;
import gplx.xowa.xtns.wbases.claims.enums.* ;
public class Basic__tst {
private final Scrib_invoke_func_fxt fxt = new Scrib_invoke_func_fxt ( ) ; private Scrib_lib lib ;
private final Wdata_wiki_mgr_fxt wdata_fxt = new Wdata_wiki_mgr_fxt ( ) ;
@Bef ore public void init ( ) {
fxt . Clear_for_lib ( " en.wikipedia.org " , " zh-hans " ) ;
lib = fxt . Core ( ) . Lib_wikibase ( ) . Init ( ) ;
wdata_fxt . Init ( fxt . Parser_fxt ( ) , false ) ;
wdata_fxt . Init_lang_fallbacks ( " zh-hant " , " zh-hk " ) ;
}
@Tes t public void IsValidEntityId ( ) {
IsValidEntityIdCheck ( Bool_ . Y , " P1 " ) ;
IsValidEntityIdCheck ( Bool_ . Y , " P123 " ) ;
IsValidEntityIdCheck ( Bool_ . Y , " Q1 " ) ;
IsValidEntityIdCheck ( Bool_ . Y , " Q123 " ) ;
IsValidEntityIdCheck ( Bool_ . Y , " A:B:Q123 " ) ;
IsValidEntityIdCheck ( Bool_ . N , " p1 " ) ;
IsValidEntityIdCheck ( Bool_ . N , " q1 " ) ;
IsValidEntityIdCheck ( Bool_ . N , " P " ) ;
IsValidEntityIdCheck ( Bool_ . N , " P1A " ) ;
IsValidEntityIdCheck ( Bool_ . N , " P01 " ) ;
}
private void IsValidEntityIdCheck ( boolean expd , String val ) {
fxt . Test_scrib_proc_bool ( lib , Scrib_lib_wikibase . Invk_isValidEntityId , Object_ . Ary ( val ) , expd ) ;
}
@Test public void EntityExists ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " en " , " b " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_bool ( lib , Scrib_lib_wikibase . Invk_entityExists , Object_ . Ary ( " q2 " ) , true ) ;
fxt . Test_scrib_proc_bool ( lib , Scrib_lib_wikibase . Invk_entityExists , Object_ . Ary ( " Q1 " ) , false ) ;
}
@Test public void GetEntityId ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc ( " Q2 " )
. Add_sitelink ( " enwiki " , " Earth " )
) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getEntityId , Object_ . Ary ( " Earth " ) , " Q2 " ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getEntityId , Object_ . Ary ( " missing_page " ) , null ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getEntityId , Object_ . Ary ( " " ) , null ) ; // PAGE:en.w:Water_treader DATE:2018-07-01
}
@Test public void GetReferencedEntityId ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " Q1 " ) . Xto_wdoc ( ) ) ;
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " Q2 " ) . Add_claims ( wdata_fxt . Make_claim_entity_qid ( 1 , 1 ) ) . Xto_wdoc ( ) ) ;
wdata_ fxt. Init__docs__add ( wdata_fxt . Wd oc_bldr ( " Q3 " ) . Add_claims ( wdata_fxt . Make_claim_entity_qid ( 1 , 2 ) ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getReferencedEntityId , Object_ . Ary ( " Q3 " , " P1 " , NewToIds ( " Q1 " ) ) , " Q1 " ) ;
}
private static Keyval [ ] NewToIds ( String . . . toIds ) {
int len = toIds . length ;
Keyval [ ] rv = new Keyval [ len ] ;
for ( int i = 0 ; i < len ; i + + )
rv [ i ] = Keyval_ . int_ ( i , toIds [ i ] ) ;
return rv ;
}
@Test public void GetLabel__cur ( ) { // do not get fallback
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " zh-hans " , " s " ) . Add_label ( " zh-hant " , " t " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getLabel , Object_ . Ary ( " q2 " ) , String_ . Concat_lines_nl_skip_last ( " 1=s " , " 2=zh-hans " ) ) ;
}
@Test public void GetLabel__fallback_1 ( ) { // get 1st fallback
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " zh-hant " , " t " ) . Add_label ( " zh-hk " , " h " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getLabel , Object_ . Ary ( " q2 " ) , String_ . Concat_lines_nl_skip_last ( " 1=t " , " 2=zh-hant " ) ) ;
}
@Test public void GetLabel__fallback_2 ( ) { // get 2nd fallback
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " zh-hk " , " hk " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getLabel , Object_ . Ary ( " q2 " ) , String_ . Concat_lines_nl_skip_last ( " 1=hk " , " 2=zh-hk " ) ) ;
}
@Test publ ic void GetLabel__fallback_en ( ) { // get en
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " en " , " lbl_en " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getLabel , Object_ . Ary ( " q2 " ) , String_ . Concat_lines_nl_skip_last ( " 1=lbl_en " , " 2=en " ) ) ;
}
@Test public void GetDescr ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_description ( " zh-hans " , " s " ) . Add_description ( " zh-hant " , " t " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getDescription , Object_ . Ary ( " q2 " ) , " s " ) ;
}
@Test public void GetSlink ( ) {
wdata_ fxt. Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_sitelink ( " enwiki " , " a " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getSiteLinkPageName , Object_ . Ary ( " q2 " ) , " a " ) ;
}
@Test public void GetEntity ( ) {
wdata_ fxt. Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " en " , " b " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getEntity , Object_ . Ary ( " q2 " , false ) , String_ . Concat_lines_nl_skip_last
( " 1= "
, " id=q2 "
, " type=item "
, " schemaVersion=2 "
, " labels= "
, " en= "
, " language=en "
, " value=b "
) ) ;
}
@Test public void GetEntity_property ( ) { // PURPOSE: getEntity should be able to convert "p2" to "Property:P2"; EX:es.w:Arnold_Gesell; DATE:2014-02-18
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " Property:p2 " ) . Add_label ( " en " , " b " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getEntity , Object_ . Ary ( " p2 " , false ) , String_ . Concat_lines_nl_skip_last
( " 1= "
, " id=Property:p2 " // only difference from above
, " type=property " // also, type should be "property"; PAGE:ru.w:Викитека:Проект:Викиданные DATE:2016-11-23
, " schemaVersion=2 "
, " datatype=<<NULL>> "
, " labels= "
, " en ="
, " language=en "
, " value=b "
) ) ;
}
@Test public void GetEntity_ws ( ) { // PURPOSE: trim, b/c some pages will literally pass in "Property:P5\n"; PAGE:de.w:Mailand– Sanremo_2016 ISSUE#:363; DATE:2019-02-12
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " en " , " b " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getEntity , Object_ . Ary ( " q2 \ n \ t " , false ) , String_ . Concat_lines_nl_skip_last
( " 1= "
, " id=q2 "
, " type=item "
, " schemaVersion=2 "
, " labels= "
, " en ="
, " language=en "
, " value=b "
) ) ;
}
// @Test public void GetEntity__missing() { // PURPOSE: missing entity should return empty kv array; PAGE:de.w:Critérium_International_2016 DATE:2017-12-30
// fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_wikibase.Invk_getEntity, Object_.Ary("q2", false), String_.Concat_lines_nl_skip_last
// ( "1=" // not " "
// ));
// }
@Test public void RenderSnaks ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snaks_as_ary ( wdata_fxt , wdata_fxt . Make_claim_monolingual ( 3 , " en " , " P3_en " ) , wdata_fxt . Make_claim_monolingual ( 3 , " de " , " P3_de " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnaks , args , " P3_en, P3_de " ) ;
}
@Test public void RenderSnaks_pid ( ) { // PURPOSE: handle RenderSnaks like {"P10":[{"property":"P20"}]}; ISSUE#:666; DATE:2020-03-01
Keyval [ ] args = Wbase_snak_utl_ . Get_snaks_as_nde ( wdata_fxt , " P123 " , wdata_fxt . Make_claim_monolingual ( 3 , " en " , " P3_en " ) , wdata_fxt . Make_claim_monolingual ( 3 , " de " , " P3_de " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnaks , args , " P3_en, P3_de " ) ;
}
@Test public void RenderSnak__entity ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " Q3 " ) . Add_label ( " en " , " test_label " ) . Xto_wdoc ( ) ) ;
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_entity_qid ( 2 , 3 ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " test_label " ) ;
}
@Test public void RenderSnak__str ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_string ( 3 , " test_str " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " test_str " ) ;
}
@Test public void RenderSnak__quantity ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_quantity ( 3 , " 123 " , " 1 " , " 125 " , " 121 " ) ) ; // NOTE: entity-less units output "1"; EX:wd:Q493409 DATE:2016-11-08
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " 123±2 " ) ;
}
@Test public void RenderSnak__quantity__null_bounds ( ) { // PURPOSE: handle null lbound / ubound; PAGE:wd.q:183 DATE:2016-12-03
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_quantity ( 3 , " 123 " , " 1 " , null , null ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " 123 " ) ;
}
@Test public void RenderSnak__time ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_time ( 3 , " 2012-01-02 03:04:05 " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " 30405 2 Jan 2012 " ) ; // NOTE: format is missing ":" b/c test does not init messages for html_wtr; DATE:2015-08-03
}
@Test public void RenderSnak__geo ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_geo ( 3 , " 3.4 " , " 1.2 " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " 1°12'0"N, 3°24'0"E (<a href='/wiki/Q2'>http://www.wikidata.org/entity/Q2</a>) " ) ;
}
@Test public void RenderSnak__monolingual ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_monolingual ( 3 , " en " , " abc_en " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " abc_en " ) ;
}
@Test public void RenderSnak__no_value ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , new Wbase_claim_string ( 3 , Wbase_claim_value_type_ . Tid__novalue , null ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " " ) ;
}
@Test public void RenderSnak__data_value_is_null ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , new Wbase_claim_string ( 3 , Wbase_claim_value_type_ . Tid__somevalue , null ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " " ) ;
}
@Test public void RenderSnak__data_value_is_null1 ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , new Wbase_claim_string ( 3 , Wbase_claim_value_type_ . Tid__somevalue , null ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " " ) ;
}
@Test public void FormatValues ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snaks_as_ary ( wdata_fxt , wdata_fxt . Make_claim_monolingual ( 3 , " en " , " P3_en " ) , wdata_fxt . Make_claim_monolingual ( 3 , " de " , " P3_de " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_formatValues , args , " P3_en, P3_de " ) ;
}
@Test public void FormatValue__str ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_string ( 3 , " test_str " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_formatValue , args , " test_str " ) ;
}
@Test public void GetEntityUrl ( ) {
fxt . Test_scrib _proc_str ( lib , Scrib_lib_wikibase . Invk_getEntityUrl , Object_ . Ary ( " Q2 " ) , " https://www.wikidata.org/wiki/Special:EntityPage/Q2 " ) ;
}
@Test public void GetSetting ( ) {
fxt . Test_scrib_proc_obj ( lib , Scrib_lib_wikibase . Invk_getSetting , Object_ . Ary ( " allowArbitraryDataAccess " ) , true ) ; // PAGE:en.w:Beccles DATE:2018-06-27
}
@Test public void GetSetting__siteGlobalID ( ) {
fxt . Test_scrib_proc_obj ( lib , Scrib_lib_wikibase . Invk_getSetting , Object_ . Ary ( " siteGlobalID " ) , " enwiki " ) ;
}
@Test public void IncrementStatsKey ( ) {
fxt . Test_scrib_proc_obj ( lib , Scrib_lib_wikibase . Invk_incrementStatsKey , Object_ . Ary ( " wikibase.client.scribunto.wikibase.getEntityIdForCurrentPage.call " ) , null ) ;
}
@Test public void GetEntityModuleName ( ) {
fxt . Test_scrib _proc_obj ( lib , Scrib_lib_wikibase . Invk_getEntityModuleName , Object_ . Ary ( " Q123 " ) , " mw.wikibase.entity " ) ;
}
@Test public void GetSiteLinkPageName ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_sitel ink ( " enwiki " , " T est_page " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib _proc_str ( lib , Scrib_lib_wikibase . Invk_getSiteLinkPageName , Object_ . Ary ( " q2 " ) , " T est_page " ) ;
}
@Test public void GetSiteLinkPageName_wiki ( ) { // ISSUE#:665; PAGE:commons.wikimedia.org/wiki/Category:Paddy_Ashdown; DATE:2020-02-19
wdata_ fxt. Init_xwikis_add ( " frwiki " ) ;
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " )
. Add_sitelink ( " enwiki " , " q2_enwiki " )
. Add_sitelink ( " frwiki " , " q2_frwiki " )
. Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getSiteLinkPageName , Object_ . Ary ( " q2 " , " frwiki " ) , " q2_frwiki " ) ; // fails if q2_enwiki
}
}
class Wbase_snak_utl_ {
public static Keyval [ ] Get_snaks_as_ary ( Wdata_wiki_mgr_fxt wdata_fxt , W base_ claim_base . . . ary ) {
Keyval [ ] rv = Get_snaks_ary ( wdata_fxt , ary ) ;
return To_scrib_args ( rv ) ; // EX: ["1":["1":{"property":"P1"},"2":{"property":"P2"}]]
}
public static Keyval [ ] Get_snaks_as_nde ( Wdata_wiki_mgr_fxt wdata_fxt , String pid , Wbase_claim_base . . . ary ) {
Keyval [ ] rv = Get_snaks_ary ( wdata_fxt , ary ) ;
Keyval kv = Keyval_ . new_ ( pid , rv ) ; // EX: "P1":[{"property":"P2"}]
return To_scrib_args ( Keyval _. Ary ( kv ) ) ; // EX:["1":[{"P1":[{"property":"P11"}]]} // FOOTNOTE:references.snaks
}
private stat ic Keyval [ ] To_scrib_args ( Object arg ) {
Keyval [ ] rv = new Keyval [ 1 ] ;
rv [ 0 ] = Keyval_ . int_ ( 0 + Scrib_core . Base_1 , arg ) ;
return rv ;
}
private static Keyval [ ] Get_snaks_ary ( Wdata_wiki_mgr_fxt wdata_fxt , Wbase_claim_base . . . ary ) {
// use wdoc_bldr to create claims
Wdata_doc wdoc = wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_claims ( ary ) . Xto_wdoc ( ) ;
// extract snaks from claims;
return Get_snaks ( wdata_fxt , wdoc ) ;
}
public static Keyval [ ] Get_snak ( Wdata_wiki_mgr_fxt wdata_fxt , Wbase_claim_base itm ) {
Wdata_doc wdoc = wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_claims ( itm ) . Xto_wdoc ( ) ;
Keyval [ ] snak_props = Get_subs_by_path ( Get_snaks ( wdata_fxt , wdoc ) , 0 ) ;
return Keyval_ . Ary ( Keyval_ . int_ ( 1 , snak_props ) ) ;
}
private static Keyval [ ] Get_snaks ( Wdata_wiki_mgr_fxt wdata_fxt , Wdata_doc wdoc ) {
Keyval [ ] wdoc_root = Scrib_lib_wikibase_srl . Srl ( wdata_fxt . Wdata_mgr ( ) . Prop_mgr ( ) , wdoc , false , false , Bry_ . new_u8 ( " Test_page " ) ) ;
Keyval [ ] snaks = Get_subs_by_path ( wdoc_root , 0 , 0 ) ;
int snaks_len = snaks . length ;
Keyval [ ] rv = new Keyval [ snaks_len ] ;
for ( int i = 0 ; i < snaks_len ; + + i ) {
rv [ i ] = Keyval_ . int_ ( i + List_adp_ . Base1 , Get_subs_by_path ( snaks , i , 1 ) ) ;
}
return rv ;
}
private static Keyval [ ] Get_subs_by_path ( Keyval [ ] root , int . . . levels ) {
int len = levels . length ;
Keyval [ ] rv = root ;
for ( int i = 0 ; i < len ; + + i ) {
int idx = levels [ i ] ;
rv = ( Keyval [ ] ) rv [ idx ] . Val ( ) ;
}
return rv ;
}
}
/*
==FOOTNOTE:references.snaks==
Explaining this snippet:
<pre>
return To_scrib_args(Keyval_.Ary(kv)); // EX:["1":[{"P1":[{"property":"P11"}]]}
</pre>
* This occurs as a result of https://ja.wikipedia.org/wiki/Sed_(コンピュータ)
* It has an Infobox which will eventually call this https://ja.wikipedia.org/wiki/Module:WikidataIB
<pre>
local sourced = function(claim)
if claim.references then
for kr, vr in pairs(claim.references) do
local ref = mw.wikibase.renderSnaks(vr.snaks)
if not ref:find("Wikipedia") then
return true
end
end
end
end
<pre>
Checking then with https:/www.wikidata.org/wiki/Property:P3966
<pre>
, "references":
[
{ "hash":"fa278ebfc458360e5aed63d5058cca83c46134f1"
, "snaks":
{ "P143":
[
{ "snaktype":"value"
, "property":"P143"
, "hash":"e4f6d9441d0600513c4533c672b5ab472dc73694"
, "datavalue":
{ "value":
{ "entity-type":"item"
, "numeric-id":328
, "id":"Q328"
}
, "type":"wikibase-entityid"
}
}
]
}
, "snaks-order":
[ "P143 "
]
}
]
}
</pre>
That means claims.references.snaks is this
<pre>
{ "P143":
[
{ "snaktype":"value "
, "property":"P143"
, "hash":"e4f6d9441d0600513c4533c672b5ab472dc73694 "
, "datavalue":
{ "value":
{ "entity-type":"item"
, "numeric-id":328
, "id":"Q328"
}
, "type":"wikibase-entityid"
}
}
]
}
</pre>
Now, going back to "To_scrib_args(Keyval_.Ary(kv))"
* "kv" represents "P1":[{"property":"P11"}
* "kv" gets wrapped in Keyval_.Ary b/c SnakDeserialization will deserialize into key/val pairs; '{"P1":[{"property":"P11"}]}' '["P1":[["property":"P11"]]]'
* "To_scrib_args()" will put the entire thing as '["1":...]'
package gplx.xowa.xtns.scribunto.libs.wikibases ;
import gplx.Bool_ ;
import gplx.Bry_ ;
import gplx.Keyval ;
import gplx.Keyval_ ;
imp ort gplx.List_adp_ ;
import gplx.Object_ ;
import gplx.String_ ;
import gplx.xowa.xtns.scribunto.Scrib_core ;
import gplx.xowa.xtns.scribunto.Scrib_invoke_func_fxt ;
import gplx.xowa.xtns.scribunto.Scrib_lib ;
impor t gplx.xowa.xtns.scribunto.libs.Scrib_lib_wikibase ;
import gplx.xowa.xtns.scribunto.libs.Scrib_lib_wikibase_srl ;
import gplx.xowa.xtns.wbases.Wdata_doc ;
import gplx.xowa.xtns.wbases.Wdata_wiki_mgr_fxt ;
import gplx.xowa.xtns.wbases.claims.enums.Wbase_claim_value_type_ ;
import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_base ;
import gplx.xowa.xtns.wbases.claims.itms.Wbase_claim_string ;
import org.junit.Before ;
import org.junit.Test ;
public class Basic__tst {
private final Scrib_invoke_func_fxt fxt = new Scrib_invoke_func_fxt ( ) ; private Scrib_lib lib ;
private final Wdata_wiki_mgr_fxt wdata_fxt = new Wdata_wiki_mgr_fxt ( ) ;
@Before public void init ( ) {
fxt . Clear_for_lib ( " en.wikipedia.org " , " zh-hans " ) ;
lib = fxt . Core ( ) . Lib_wikibase ( ) . Init ( ) ;
wdata_fxt . Init ( fxt . Parser_fxt ( ) , false ) ;
wdata_fxt . Init_lang_fallbacks ( " zh-hant " , " zh-hk " ) ;
}
@Test public void IsValidEntityId ( ) {
IsValidEntityIdCheck ( Bool_ . Y , " P1 " ) ;
IsValidEntityIdCheck ( Bool_ . Y , " P123 " ) ;
IsValidEntityIdCheck ( Bool_ . Y , " Q1 " ) ;
IsValidEntityIdCheck ( Bool_ . Y , " Q123 " ) ;
IsValidEntityIdCheck ( Bool_ . Y , " A:B:Q123 " ) ;
IsValidEntityIdCheck ( Bool_ . N , " p1 " ) ;
IsValidEntityIdCheck ( Bool_ . N , " q1 " ) ;
IsValidEntityIdCheck ( Bool_ . N , " P " ) ;
IsValidEntityIdCheck ( Bool_ . N , " P1A " ) ;
IsValidEntityIdCheck ( Bool_ . N , " P01 " ) ;
}
private void IsValidEntityIdCheck ( boolean expd , String val ) {
fxt . Test_scrib_pr oc_bool ( lib , Scrib_lib_wikibase . Invk_isValidEntityId , Object_ . Ary ( val ) , expd ) ;
}
@Test public void EntityExists ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " en " , " b " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_bool ( lib , Scrib_lib_wikibase . Invk_entityExists , Object_ . Ary ( " q2 " ) , true ) ;
fxt . Test_scrib_proc_bool ( lib , Scrib_lib_wikibase . Invk_entityExists , Object_ . Ary ( " Q1 " ) , false ) ;
}
@Test public void GetEntityId ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc ( " Q2 " )
. Add_sitelink ( " enwiki " , " Earth " )
) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getEntityId , Object_ . Ary ( " Earth " ) , " Q2 " ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getEntityId , Object_ . Ary ( " missing_page " ) , null ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getEntityId , Object_ . Ary ( " " ) , null ) ; // PAGE:en.w:Water_treader DATE:2018-07-01
}
@Test public void GetReferencedEntityId ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " Q1 " ) . Xto_wdoc ( ) ) ;
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " Q2 " ) . Add_claims ( wdata_fxt . Make_claim_entity_qid ( 1 , 1 ) ) . Xto_wdoc ( ) ) ;
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " Q3 " ) . Add_c laims ( wdata_fxt . Make_claim_entity_qid ( 1 , 2 ) ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getReferencedEntityId , Object_ . Ary ( " Q3 " , " P1 " , NewToIds ( " Q 1" ) ) , " Q1 " ) ;
}
private stat ic Keyval [ ] NewToIds ( String . . . toIds ) {
int len = toIds . length ;
Keyval [ ] rv = new Keyval [ len ] ;
for ( int i = 0 ; i < len ; i + + )
rv [ i ] = Keyval_ . int_ ( i , toIds [ i ] ) ;
return rv ;
}
@Test public void GetLabel__cur ( ) { // do not get fallback
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " zh-hans " , " s " ) . Add_label ( " zh-hant " , " t " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getLabel , Object_ . Ary ( " q2 " ) , String_ . Concat_lines_nl_skip_last ( " 1=s " , " 2=zh-hans " ) ) ;
}
@Test public void GetLabel__fallback_1 ( ) { // get 1st fallback
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " zh-hant " , " t " ) . Add_label ( " zh-hk " , " h " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getLabel , Object_ . Ary ( " q2 " ) , String_ . Concat_lines_nl_skip_last ( " 1=t " , " 2=zh-hant " ) ) ;
}
@Test public void GetLabel__fallback_2 ( ) { // get 2nd fallback
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " zh-hk " , " hk " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getLabel , Object_ . Ary ( " q2 " ) , String_ . Concat_lines_nl_skip_last ( " 1=hk " , " 2=zh-hk " ) ) ;
}
@Test public void GetLabel__fallback_en ( ) { // get en
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " en " , " lbl_ en" ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getLabel , Object_ . Ary ( " q2 " ) , String_ . Concat_lines_nl_skip_last ( " 1=lbl_en " , " 2=en " ) ) ;
}
@Test public void GetDescr ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_description ( " zh-hans " , " s " ) . Add_description ( " zh-hant " , " t " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getDescription , Object_ . Ary ( " q2 " ) , " s " ) ;
}
@Test public void GetSlink ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_sitelink ( " enwiki " , " a " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getSiteLinkPageName , Object_ . Ary ( " q2 " ) , " a " ) ;
}
@Test public void GetEntity ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " en " , " b " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getEntity , Object_ . Ary ( " q2 " , false ) , String_ . Concat_lines_nl_skip_last
( " 1 ="
, " id=q2 "
, " type=item "
, " schemaVersion=2 "
, " labels= "
, " en= "
, " language=en "
, " value=b "
) ) ;
}
@Test public void GetEntity_property ( ) { // PURPOSE: getEntity should be able to convert "p2" to "Property:P2"; EX:es.w:Arnold_Gesell; DATE:2014-02-18
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " Property:p2 " ) . Add_label ( " en " , " b " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getEntity , Object_ . Ary ( " p2 " , false ) , String_ . Concat_lines_nl_skip_last
( " 1 ="
, " id=Property:p2 " // only difference from above
, " type=property " // also, type should be "property"; PAGE:ru.w:Викитека:Проект:Викиданные DATE:2016-11-23
, " schemaVersion=2 "
, " datatype=<<NULL>> "
, " labels= "
, " en= "
, " language=en "
, " value=b "
) ) ;
}
@Test public void GetEntity_ws ( ) { // PURPOSE: trim, b/c some pages will literally pass in "Property:P5\n"; PAGE:de.w:Mailand– Sanremo_2016 ISSUE#:363; DATE:2019-02-12
wdata_ fxt. Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_label ( " en " , " b " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str_ary ( lib , Scrib_lib_wikibase . Invk_getEntity , Object_ . Ary ( " q2 \ n \ t " , false ) , String_ . Concat_lines_nl_skip_last
( " 1= "
, " id=q2 "
, " type=item "
, " schemaVersion=2 "
, " labels= "
, " en= "
, " language=en "
, " value=b "
) ) ;
}
// @Test public void GetEntity__missing() { // PURPOSE: missing entity should return empty kv array; PAGE:de.w:Critérium_International_2016 DATE:2017-12-30
// fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_wikibase.Invk_getEntity, Object_.Ary("q2", false), String_.Concat_lines_nl_skip_last
// ( "1=" // not ""
// ));
// }
@Test public void RenderSnaks ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snaks_as_ary ( wdata_fxt , wdata_fxt . Make_claim_monolingual ( 3 , " en " , " P3_en " ) , wdata_fxt . Make_claim_monolingual ( 3 , " de " , " P3_de " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnaks , args , " P3_en, P3_de " ) ;
}
@Test public void RenderSnaks_pid ( ) { // PURPOSE: handle RenderSnaks like {"P10":[{"property":"P20"}]}; ISSUE#:666; DATE:2020-03-01
Keyval [ ] args = Wbase_snak_utl_ . Get_snaks_as_nde ( wdata_fxt , " P123 " , wdata_fxt . Make_claim_monolingual ( 3 , " en " , " P3_en " ) , wdata_fxt . Make_claim_monolingual ( 3 , " de " , " P3_de " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnaks , args , " P3_en, P3_de " ) ;
}
@Test public void RenderSnak__entity ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " Q3 " ) . Add_label ( " en " , " test_label " ) . Xto_wdoc ( ) ) ;
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_entity_qid ( 2 , 3 ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " test_label " ) ;
}
@Test public void RenderSnak__str ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_string ( 3 , " test_str " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " test_str " ) ;
}
@Test public void RenderSnak__quantity ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_quantity ( 3 , " 123 " , " 1 " , " 125 " , " 121 " ) ) ; // NOTE: entity-less units output "1"; EX:wd:Q493409 DATE:2016-11-08
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " 123±2 " ) ;
}
@Test public void RenderSnak__quantity__null_bounds ( ) { // PURPOSE: handle null lbound / ubound; PAGE:wd.q:183 DATE:2016-12-03
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_quantity ( 3 , " 123 " , " 1 " , null , null ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " 123 " ) ;
}
@Test public void RenderSnak__time ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_time ( 3 , " 2012-01-02 03:04:05 " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " 30405 2 Jan 2012 " ) ; // NOTE: format is missing ":" b/c test does not init messages for html_wtr; DATE:2015-08-03
}
@Test public void RenderSnak__geo ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_geo ( 3 , " 3.4 " , " 1.2 " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " 1°12'0"N, 3°24'0"E (<a href='/wiki/Q2'>http://www.wikidata.org/entity/Q2</a>) " ) ;
}
@Test public void RenderSnak__monolingual ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_monolingual ( 3 , " en " , " abc_en " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " abc_en " ) ;
}
@Test public void RenderSnak__no_value ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , new Wbase_claim_string ( 3 , Wbase_claim_value_type_ . Tid__novalue , null ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " " ) ;
}
@Test public void RenderSnak__data_value_is_null ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , new Wbase_claim_string ( 3 , Wbase_claim_value_type_ . Tid__somevalue , null ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " " ) ;
}
@Test public void RenderSnak__data_value_is_null1 ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , new Wbase_claim_string ( 3 , Wbase_claim_value_type_ . Tid__somevalue , null ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_renderSnak , args , " " ) ;
}
@Test public void FormatValues ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snaks_as_ary ( wdata_fxt , wdata_fxt . Make_claim_monolingual ( 3 , " en " , " P3_en " ) , wdata_fxt . Make_claim_monolingual ( 3 , " de " , " P3_de " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_formatValues , args , " P3_en, P3_de " ) ;
}
@Test public void FormatValue__str ( ) {
Keyval [ ] args = Wbase_snak_utl_ . Get_snak ( wdata_fxt , wdata_fxt . Make_claim_str ing ( 3 , " t est_str " ) ) ;
fxt . Test__proc__kvps__flat ( lib , Scrib_lib_wikibase . Invk_formatValue , args , " t est_str " ) ;
}
@Test public void GetEntityUrl ( ) {
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getEntityUrl , Object_ . Ary ( " Q2 " ) , " https://www.wikidata.org/wiki/Special:EntityPage/Q2 " ) ;
}
@Test public void GetSetting ( ) {
fxt . Test_scrib_proc_obj ( lib , Scrib_lib_wikibase . Invk_getSetting , Object_ . Ary ( " allowArbitraryDataAccess " ) , true ) ; // PAGE:en.w:Beccles DATE:2018-06-27
}
@Test public void GetSetting__siteGlobalID ( ) {
fxt . Test_scrib_proc_obj ( lib , Scrib_lib_wikibase . Invk_getSetting , Object_ . Ary ( " siteGlobalID " ) , " enwiki " ) ;
}
@Test public void IncrementStatsKey ( ) {
fxt . Test_scrib_proc_obj ( lib , Scrib_lib_wikibase . Invk_incrementStatsKey , Object_ . Ary ( " wiki base. client.scribunto.wikibase.getEntityIdForCurrentPage.call " ) , null ) ;
}
@Test public void GetEntityModuleName ( ) {
fxt . Test_scrib_proc_obj ( lib , Scrib_lib_wikibase . Invk_getEntityModuleName , Object_ . Ary ( " Q123 " ) , " mw.wikibase.entity " ) ;
}
@Test public void GetSiteLinkPageName ( ) {
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_sitelink ( " enwiki " , " Test_page " ) . Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getSiteLinkPageName , Object _. Ary ( " q2 " ) , " Test_page " ) ;
}
@Test publ ic void GetSiteLinkPageName_wiki ( ) { // ISSUE#:665; PAGE:commons.wikimedia.org/wiki/Category:Paddy_Ashdown; DATE:2020-02-19
wdata_fxt . Init_xwikis_add ( " frwiki " ) ;
wdata_fxt . Init__docs__add ( wdata_fxt . Wdoc_bldr ( " q2 " )
. Add_sitelink ( " enwiki " , " q2_enwiki " )
. Add_sitelink ( " frwiki " , " q2_frwiki " )
. Xto_wdoc ( ) ) ;
fxt . Test_scrib_proc_str ( lib , Scrib_lib_wikibase . Invk_getSiteLinkPageName , Object_ . Ary ( " q2 " , " frwiki " ) , " q2_frwiki " ) ; // fails if q2_enwiki
}
}
class Wbase_snak_utl_ {
public static Keyval [ ] Get_snaks_as_ary ( Wdata_wiki_mgr_fxt wdata_fxt , Wbase_claim_base . . . ary ) {
Keyval [ ] rv = Get_snaks_ary ( wdata_fxt , ary ) ;
return To_scrib_args ( rv ) ; // EX: ["1":["1":{"property":"P1"},"2":{"property":"P2"}]]
}
public static Keyval [ ] Get_snaks_as_nde ( Wdata_wiki_mgr_fxt wdata_fxt , String pid , Wbase_claim_base . . . ary ) {
Keyval [ ] rv = Get_snaks_ary ( wdata_fxt , ary ) ;
Keyval kv = Keyval_ . new_ ( pid , rv ) ; // EX: "P1":[{"property":"P2"}]
return To_scrib_args ( Keyval_ . Ary ( kv ) ) ; // EX:["1":[{"P1":[{"property":"P11"}]]} // FOOTNOTE:references.snaks
}
private static Keyval [ ] To_scrib_args ( Object arg ) {
Keyval [ ] rv = new Keyval [ 1 ] ;
rv [ 0 ] = Keyval_ . int_ ( 0 + Scrib_core . Base_1 , arg ) ;
return rv ;
}
private static Keyval [ ] Get_snaks_ary ( Wdata_wiki_mgr_fxt wdata_fxt , Wbase_claim_base . . . ary ) {
// use wdoc_bldr to create claims
Wdata_doc wdoc = wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_claims ( ary ) . Xto_wdoc ( ) ;
// extract snaks from claims ;
return Get_snaks ( wdata_fxt , wdoc ) ;
}
public static Keyval [ ] Get_snak ( Wdata_wiki_mgr_fxt wdata_fxt , Wbase_claim_base itm ) {
Wdata_doc wdoc = wdata_fxt . Wdoc_bldr ( " q2 " ) . Add_claims ( itm ) . Xto_wdoc ( ) ;
Keyval [ ] snak_props = Get_subs_by_path ( Get_snaks ( wdata_fxt , wdoc ) , 0 ) ;
return Keyval_ . Ary ( Keyval_ . int_ ( 1 , snak_props ) ) ;
}
private static Keyval [ ] Get_snaks ( Wdata_wiki_mgr_fxt wdata_fxt , Wdata_doc wdoc ) {
Keyval [ ] wdoc_root = Scrib_lib_wikibase_srl . Srl ( wdata_fxt . Wdata_mgr ( ) . Prop_mgr ( ) , wdoc , false , false , Bry_ . new_u8 ( " Test_page " ) ) ;
Keyval [ ] snaks = Get_subs_by_path ( wdoc_root , 0 , 0 ) ;
int snaks_len = snaks . length ;
Keyval [ ] rv = new Keyval [ snaks_len ] ;
for ( int i = 0 ; i < snaks_len ; + + i ) {
rv [ i ] = Keyval_ . int_ ( i + List_adp_ . Base1 , Get_subs_by_path ( snaks , i , 1 ) ) ;
}
return rv ;
}
private static Keyval [ ] Get_subs_by_path ( Keyval [ ] root , int . . . levels ) {
int len = levels . length ;
Keyval [ ] rv = root ;
for ( int i = 0 ; i < len ; + + i ) {
int idx = levels [ i ] ;
rv = ( Keyval [ ] ) rv [ idx ] . Val ( ) ;
}
return rv ;
}
}
/*
==FOOTNOTE:references.snaks==
Explaining this snippet:
<pre>
return To_scrib_args(Keyval_.Ary(kv)); // EX:["1":[{"P1":[{"property":"P11"}]]}
</ pre>
* This occurs as a result of https://ja.wikipedia.org/wiki/Sed_(コンピュータ)
* It has an Infobox which will eventually call this https://ja.wikipedia.org/wiki/Module:WikidataIB
<pre>
local sourced = function(claim)
if claim.references then
for kr, vr in pairs(claim.references) do
local ref = mw.wikibase.renderSnaks(vr.snaks)
if not ref:find("Wikipedia") then
return true
end
end
end
end
<pre>
Checking then with https:/www.wikidata.org/wiki/Property:P3966
<pre>
, "references":
[
{ "hash":"fa278ebfc458360e5aed63d5058cca83c46134f1 "
, "snaks":
{ "P143":
[
{ "snaktype":"value"
, "property":"P143"
, "hash":"e4f6d9441d0600513c4533c672b5ab472dc73694"
, "datavalue":
{ "value":
{ "entity-type":"item"
, "numeric-id":328
, "id":"Q328 "
}
, "type":"wikibase-entityid "
}
}
]
}
, "snaks-order":
[ "P143"
]
}
]
}
</pre>
That means claims.references.snaks is this
<pre>
{ "P143":
[
{ "snaktype":"value"
, "property":"P143"
, "hash":"e4f6d9441d0600513c4533c672b5ab472dc73694"
, "datavalue":
{ "value":
{ "entity-type":"item"
, "numeric-id":328
, "id":"Q328"
}
, "type":"wikibase-entityid"
}
}
]
}
</pre>
Now, going back to "To_scrib_args(Keyval_.Ary(kv))"
* "kv" represents "P1":[{"property":"P11"}
* "kv" gets wrapped in Keyval_.Ary b/c SnakDeserialization will deserialize into key/val pairs; '{"P1":[{"property":"P11"}]}' '["P1":[["property":"P11"]]]'
* "To_scrib_args()" will put the entire thing as '["1":...]'
*/