Difference between revisions of "User:Abel/experimental.js"

From Wikibase Personal data
Jump to navigation Jump to search
m
m
 
(31 intermediate revisions by the same user not shown)
Line 2: Line 2:
 
// Experimental Main
 
// Experimental Main
 
console.log("'⌣'");
 
console.log("'⌣'");
 +
 
var mwEStruct = {
 
var mwEStruct = {
 
wbXntity: 'config.values.wbEntity'
 
wbXntity: 'config.values.wbEntity'
Line 8: Line 9:
 
language = "en",
 
language = "en",
  
wbEStruct = {
+
WBEStructure = {
 
subclassOfRelations: 'claims.P4', // location of P4 relations in wbEntity
 
subclassOfRelations: 'claims.P4', // location of P4 relations in wbEntity
 
defaultValRelation: 'claims.P108',
 
defaultValRelation: 'claims.P108',
Line 19: Line 20:
 
},
 
},
  
relational_id_list = {  
+
Relational_id_list = {  
controller_id: [ wbEStruct['instanceOfRelations'], wbEStruct['IDPropLoc'], wbEStruct['IDName'], 96 ],
+
controller_id: [ WBEStructure['instanceOfRelations'], WBEStructure['IDPropLoc'], WBEStructure['IDName'], 96 ],
personal_data_id: [ wbEStruct['subclassOfRelations'], wbEStruct['IDPropLoc'], wbEStruct['IDName'], 421 ],
+
personal_data_id: [ WBEStructure['subclassOfRelations'], WBEStructure['IDPropLoc'], WBEStructure['IDName'], 421 ],
interface_button_id: [ wbEStruct ['instanceOfRelations'], wbEStruct['IDPropLoc'], wbEStruct['IDName'], 487 ]
+
interface_button_id: [ WBEStructure ['instanceOfRelations'], WBEStructure['IDPropLoc'], WBEStructure['IDName'], 487 ]
};
+
},
  
var wbproc = new wbContainer(mw, mwEStruct['wbXntity']);
+
PDWikibaseProcessor,
 +
PDindexedDB,
 +
PDOOUI,
 +
Current_entity;
  
// Check whether the current page is in a relation of interest to an id of interest
 
var current_entity = wbproc.checkentity( relational_id_list );
 
// This should return an object of relations and ids
 
  
console.log("test: ")
+
// JQ.'when' loads the current scripts asynchronously, continues when loading is 'done'
console.log(current_entity);
+
$.when(
 +
    $.getScript( "//wiki.personaldata.io/w/index.php?title=User:Abel/WbProcessor.js&action=raw&ctype=text/javascript" ),
 +
    $.getScript( "//wiki.personaldata.io/w/index.php?title=User:Abel/PersonalData.js&action=raw&ctype=text/javascript" ),
 +
    $.getScript( "//wiki.personaldata.io/w/index.php?title=User:Abel/OOInterface.js&action=raw&ctype=text/javascript" ),
 +
    $.Deferred( function( deferred ){
 +
        $( deferred.resolve );
 +
    })
 +
).done( function(){
  
// for each match, render the corresponding ui elements
+
console.log('Main thread');
// current_entity.forEach(pdooui.render);
 
  
// License: GPL
+
// WBproc reads current mediawiki Entity upon instantiation
// Wikibase Processor
+
PDWikibaseProcessor = new WikibaseProcessorContainer(mw, mwEStruct['wbXntity']);
  
function wbContainer( universe, location ) {
+
// PDxDB takes mediawiki, reads user name from it, creates a hash, and 'checks in' the user upon instantiation
 
+
// (i.e. read record belonging to user, if it does not exist, create it)
this.main = interjson( checkdive( universe, location ));
+
PDindexedDB = new IndexedDBContainer( mw );
var the = this.main;
+
+
// Contains classes for creating UI elements, no instantiation consequences
/* The following is the main exposed function of the current Wb Processing class
+
PDOOUI = new InterfaceMediaContainer( PDWikibaseProcessor, PDindexedDB );
usage cases
 
 
 
to check the last value in a location given by a preceding array of internal paths to find, with the possibility of array layers between elements of array of paths:
 
wbproc.checkentity( [ wbEStruct['instanceOfRelations'], wbEStruct['IDPropLoc'], wbEStruct['IDName'], 96 ] );
 
 
 
*/
 
 
 
this.checkentity = function ( paths ) {
 
if ( ( the !== undefined ) && ( paths !== undefined ) ){
 
return proceed( the, paths );
 
}
 
}
 
 
 
// the list of private helper functions, could not be accessed from outside
 
function indexinterpolate(obj,i) { return  (obj[i] !== undefined) ? obj[i] : obj};
 
// helper function for checking a part of an array exists
 
function indexcheck(obj,i) {  if ( obj !== undefined) { return ( obj[i] !== undefined ) ? obj[i] : undefined } };
 
// dive selects matrix.a.b.c.d from the array called matrix and 'a.b.c.d' as string
 
// if a.b.c.d does not exists, it returns the substructure until the substructure exists, if d does not exist, it returns matrix.a.b.c e.g.
 
function dive(array, read){
 
if ( array !== undefined ) {
 
return (read + '').split('.').reduce(indexinterpolate, array);
 
}
 
}
 
function check(array, read){
 
if ( array !== undefined ) {
 
return (read + '').split('.').reduce(indexcheck, array);
 
}
 
}
 
 
 
function proceed(array, read) {
 
var ret_obj = {},
 
temp_obj = array,
 
// Have a holder for instructional control return array
 
success_o_meter = true,
 
future_instructional_return = [];
 
 
//|||||||||||||||||||||||||||||||||||||||||||||||||||||[ I N S T R U C T I O N S  C O N T R O L  ]||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 
 
// Init program, check if instructions are an object :
 
if ( ( !Array.isArray(read) ) && ( Object.keys(read).length > 0 ) ) {
 
 
 
 
Object.keys(read).forEach( function(path) {
 
console.log("instructions are an object, in path " + path);
 
 
 
//||||||||||||||||||||||||||[ Check if elements of instruction object are arrays themselves ]||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 
if ( Array.isArray (read[path]) ) {
 
var future_return_partition = temp_obj;
 
Object.keys(read[path]).forEach( function( path2 ) {
 
 
 
console.log("instructions are an array of arrays, going through " + read[ path ][ path2 ] );
 
 
if ( data_function( future_return_partition, read[ path ][ path2 ] ) !== future_return_partition ){
 
future_return_partition = data_function( future_return_partition, read[ path ][ path2 ] );
 
} else {
 
success_o_meter = false;
 
}
 
 
 
//|||||||||||||||||||||||||||||||||||||||||||||||||||[  I N S T R U C T I O N S  C O N T R O L |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 
 
});
 
if ( success_o_meter === true ) {
 
// Put the result of the travel along the paths in array element of array into the future_instructional_return bunch
 
console.log("arrived at")
 
console.log(future_return_partition);
 
future_instructional_return.push(future_return_partition);
 
} else {
 
console.log("seeking derailed");
 
success_o_meter = true;
 
// future_instructional_return.push( undefined );
 
}
 
 
 
}
 
 
 
//|||||||||||||||||| If instruction object element is not an array anymore, lets just do one step ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 
 
else {
 
 
// INCLUDE step block with read[path]
 
if ( data_function( temp_obj, read[ path ] ) !== temp_obj  ){
 
future_instructional_return.push( data_function( temp_obj, read[ path ] ) );
 
} else {
 
future_instructional_return.push( undefined );
 
}
 
 
 
}
 
});
 
  
temp_obj = future_instructional_return;
+
// Check if the current entity belongs to any path of interest.
}
+
// For each element in object argument, a corresponding element in the return object will contain one of the following:
 +
// - undefined - the path didn't exist even partly)
 +
// - [ value or object ] - if the path existed fully, it returns what is at the end of the path. If last element in path is a value, it will return the value if found
  
//||||||||||||[ If we are not in instruction object, let's see if we have an instruction array ]||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
Current_entity = PDWikibaseProcessor.checkentity( Relational_id_list );
 
 
else if ( Array.isArray(read) ) {
 
// If so let's follow the array of instructions
 
Object.keys( read ).forEach( function ( ect ) {
 
if ( data_function( temp_obj, read[ ect ] ) !== temp_obj  ){
 
 
temp_obj = data_function( temp_obj, read[ ect ] );
 
 
 
} else {
 
 
 
success_o_meter = false;
 
 
 
}
 
});
 
}
 
 
 
//||||||||||||[ If we have a single instruction, let's try following that |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 
 
else {
 
 
if ( data_function( temp_obj, read ) !== temp_obj  ){
 
 
 
temp_obj = data_function( temp_obj, read );
+
// Business logicish part.
 
+
// If any path of interest returned anything...
} else {
+
if ( Current_entity != undefined ) {
 
+
Object.keys(Current_entity).forEach( function ( entity_checked ){
success_o_meter = false;
+
//... for each path that returned something
 
+
if ( Current_entity[entity_checked] != undefined ){
 +
if ( Object.keys( Current_entity[entity_checked] ).length > 0 ) {
 +
PDOOUI.renderInterface( entity_checked );
 +
//... call the OOUI renderer to render what belongs to this input
 
}
 
}
 
}
 
}
// If we haven't got a not found signal along the way, let's try returning the object
+
});
 
+
}
if ( success_o_meter === true ) {
 
return temp_obj;
 
} else {
 
return undefined;
 
}
 
}
 
  
//|||||||||||||||||||||||||||||||||||||||||||||||||||||[  S T E P  B L O C K  ]||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
});
 
 
function data_function ( temp_obj, moving ) {
 
var future_temp_obj = [];
 
if ( Array.isArray( temp_obj ) ) {
 
console.log("data is on an array level");
 
Object.keys( temp_obj ).forEach( function ( ect ) {
 
 
// if we are on an array level in the data, lets iterate through the array
 
 
console.log("Within partition: " + ect );
 
future_temp_obj.push( checkdive( temp_obj[ ect ], moving ) );
 
 
 
});
 
temp_obj = future_temp_obj;
 
 
} else {
 
 
 
// if we are not on an array level, proceed with the path
 
 
console.log("data is on an objective level");
 
future_temp_obj = checkdive( temp_obj, moving );
 
if ( future_temp_obj !== undefined ){
 
temp_obj = future_temp_obj;
 
} else {
 
console.log('nothing to see here')
 
}
 
 
 
}
 
 
 
return temp_obj;
 
}
 
 
//|||||||||||||||||||||||||||||||||||||||||||||||||||||[  E N D  O F  S T E P  B L O C K    ]|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 
 
function checkdive( array, read){
 
if ( check(array, read) !== undefined) {
 
return dive(array, read);
 
} else if ( Array.isArray(array) ) {
 
var potential_return = [];
 
Object.keys(array).forEach( function(item){
 
if ( check(array[item], read) !== undefined ) {
 
potential_return.push( dive( array[item], read) );
 
}
 
});
 
return potential_return;
 
}
 
if ( array === read ) {
 
return read;
 
}
 
if (Object.keys( array ).length > 0 ){
 
Object.keys( array ).forEach( function ( piece ) {
 
if ( array[ piece ] === read ) { return read };
 
});
 
}
 
}
 
 
 
function interjson( obj ) {
 
try {
 
return JSON.parse( obj )
 
} catch (e) {
 
// if not JSON, do silly things
 
console.log('not a json ¯\_(ツ)_/¯');
 
};
 
}
 
 
}
 

Latest revision as of 11:14, 24 May 2019

// License: GPL
// Experimental Main
console.log("'⌣'");

var mwEStruct = {
		wbXntity: 'config.values.wbEntity'
	},

	language = "en",

	WBEStructure = {
		subclassOfRelations: 'claims.P4', // location of P4 relations in wbEntity
		defaultValRelation: 'claims.P108',
		concernsRelation: 'claims.P110',
		instanceOfRelations: 'claims.P3',
		IDPropLoc: 'mainsnak.datavalue.value', // location of ID properties in related entity
		IDName: 'numeric-id', // ID property name which checked 
		qIDPropName: 'id',
		standardValue: 'labels' + '.' + language + '.' + 'value'
	},

	Relational_id_list = { 
			controller_id: [ WBEStructure['instanceOfRelations'], WBEStructure['IDPropLoc'], WBEStructure['IDName'], 96 ],
			personal_data_id: [ WBEStructure['subclassOfRelations'], WBEStructure['IDPropLoc'], WBEStructure['IDName'], 421 ],
			interface_button_id: [ WBEStructure ['instanceOfRelations'], WBEStructure['IDPropLoc'], WBEStructure['IDName'], 487 ]
	},

	PDWikibaseProcessor,
	PDindexedDB,
	PDOOUI,
	Current_entity;


// JQ.'when' loads the current scripts asynchronously, continues when loading is 'done'
$.when(
    $.getScript( "//wiki.personaldata.io/w/index.php?title=User:Abel/WbProcessor.js&action=raw&ctype=text/javascript" ),
    $.getScript( "//wiki.personaldata.io/w/index.php?title=User:Abel/PersonalData.js&action=raw&ctype=text/javascript" ),
    $.getScript( "//wiki.personaldata.io/w/index.php?title=User:Abel/OOInterface.js&action=raw&ctype=text/javascript" ),
    $.Deferred( function( deferred ){
        $( deferred.resolve );
    })
).done( function(){

	console.log('Main thread');

	// WBproc reads current mediawiki Entity upon instantiation
	PDWikibaseProcessor = new WikibaseProcessorContainer(mw, mwEStruct['wbXntity']);

	// PDxDB takes mediawiki, reads user name from it, creates a hash, and 'checks in' the user upon instantiation
	// (i.e. read record belonging to user, if it does not exist, create it)
	PDindexedDB = new IndexedDBContainer( mw );
	
	// Contains classes for creating UI elements, no instantiation consequences
	PDOOUI = new InterfaceMediaContainer( PDWikibaseProcessor, PDindexedDB );

	// Check if the current entity belongs to any path of interest. 
	// For each element in object argument, a corresponding element in the return object will contain one of the following:
	// - undefined - the path didn't exist even partly)
	// - [ value or object ] - if the path existed fully, it returns what is at the end of the path. If last element in path is a value, it will return the value if found

	Current_entity = PDWikibaseProcessor.checkentity( Relational_id_list );
	
	// Business logicish part.
	// If any path of interest returned anything...
	if ( Current_entity != undefined ) {
		Object.keys(Current_entity).forEach( function ( entity_checked ){
			//... for each path that returned something
			if ( Current_entity[entity_checked] != undefined ){
				if ( Object.keys( Current_entity[entity_checked] ).length > 0 ) {
					PDOOUI.renderInterface( entity_checked );
					//... call the OOUI renderer to render what belongs to this input
				}
			}
		});
	}

});