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

From Wikibase Personal data
Jump to navigation Jump to search
m
m
 
(14 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( wbproc.xcontains( current_entity, relational_id_list['controller_id'][3] ) );
+
// 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("test: ")
+
console.log('Main thread');
console.log(current_entity);
 
  
var h = new idxdbContainer( mw );
+
// WBproc reads current mediawiki Entity upon instantiation
h.EnqueuePDIO('update record', Date.now(), Date.now());
+
PDWikibaseProcessor = new WikibaseProcessorContainer(mw, mwEStruct['wbXntity']);
  
// for each match, render the corresponding ui elements
+
// PDxDB takes mediawiki, reads user name from it, creates a hash, and 'checks in' the user upon instantiation
// current_entity.forEach(pdooui.render);
+
// (i.e. read record belonging to user, if it does not exist, create it)
 
+
PDindexedDB = new IndexedDBContainer( mw );
// License: GPL
+
// Wikibase Processor
+
// Contains classes for creating UI elements, no instantiation consequences
 
+
PDOOUI = new InterfaceMediaContainer( PDWikibaseProcessor, PDindexedDB );
function wbContainer( universe, location ) {
 
 
 
this.main = interjson( checkdive( universe, location ));
 
var the = this.main;
 
 
/* The following is the main exposed function of the current Wb Processing class
 
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;
 
}
 
  
//||||||||||||[ If we are not in instruction object, let's see if we have an instruction array ]||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
// 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
  
else if ( Array.isArray(read) ) {
+
Current_entity = PDWikibaseProcessor.checkentity( Relational_id_list );
// 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 );
 
if ( checkdive( temp_obj[ ect ], moving ) !== undefined ) {
 
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");
 
 
if ( checkdive( temp_obj, moving ) !== temp_obj ) {
 
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    ]|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 
 
wbContainer.prototype.xcontains = function ( unv, angle ) {
 
  return proceed( unv, angle );
 
}
 
 
 
function checkdive( array, read ){
 
if ( check(array, read) !== undefined) {
 
return dive(array, read);
 
}
 
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 ¯\_(ツ)_/¯');
 
};
 
}
 
 
 
}
 
}
  
 
+
});
function idxdbContainer( ww ) {
 
 
hashCode = function(s) {
 
var h = 0, l = s.length, i = 0;
 
if ( l > 0 )
 
while (i < l)
 
h = (h << 5) - h + s.charCodeAt(i++) | 0;
 
return h;
 
};
 
 
if ( ww.user != undefined ) {
 
var self = ww.user.getName();
 
 
var idgen = hashCode(self);
 
 
 
console.log(idgen);
 
// Take username for standard databasename format
 
var PersonalDataDataBaseName = "PD.IO" + idgen + "Database";
 
// Use username in user to get up to date version of self
 
var CurrentPerson = {id: idgen, name: {user: self}, age: 0};
 
 
console.log(PersonalDataDataBaseName);
 
console.log(CurrentPerson);
 
}
 
 
 
// ADD MORE DOC
 
 
 
// EnqueuePDIO a PDIOLocalDatabase:User database access function with modes
 
// External accessible wrapper for Enquire
 
 
this.EnqueuePDIO = function( sw, c1, c2, c3 ) {
 
return Enquire( PersonalDataDataBaseName, CurrentPerson, sw, c1, c2, c3 );
 
}
 
 
 
// Enquire, a general purpose indexeddb update function with modes
 
 
 
// Mode 'aggressive push':
 
// parameter record is pushed to database, overwriting whatever is there
 
 
 
// Mode 'checkin':
 
// record is retrieved from database, parameter record is pushed if not found
 
 
 
// Mode 'get record'
 
// tries to get record from db, returns undefined if not found
 
 
 
// Mode 'update record' field1 field2 field3
 
// retrieve record, make record.field1.field2 = field3, push back
 
 
 
// Mode 'update record' field1 field2
 
// retrieve record, make record.field1 = field2, push back
 
 
 
function Enquire( pddbname, record, sqitch, control_1, control_2, control_3 ) {
 
var pddb = window.indexedDB.open(pddbname, 3);
 
pddb.onupgradeneeded = function() {
 
var db = pddb.result;
 
var store = db.createObjectStore(pddbname, {keyPath: "id"});
 
 
 
// shouldn't the index be the wiki.personaldata.io username?
 
 
 
var index = store.createIndex("NameIndex", ["id"]);
 
};
 
pddb.onsuccess = function() {
 
var db = pddb.result;
 
var tx = db.transaction(pddbname, "readwrite");
 
var store = tx.objectStore(pddbname);
 
var index = store.index("NameIndex");
 
 
 
// Get the original record from the db...
 
var getRecord = index.get([record.id]);
 
var inp_obj;
 
 
 
getRecord.onsuccess = function() {
 
console.log( "Record found in database: \n <<");
 
console.log( getRecord.result );
 
console.log( ">>");
 
 
 
// Essential recordAdd
 
if ( sqitch === "aggressive push" ) {
 
inp_obj = record;
 
store.put( inp_obj );
 
return inp_obj;
 
} else if ( sqitch === "checkin" ) {
 
 
if ( getRecord.result != undefined ) {
 
console.log("getting from store");
 
inp_obj = getRecord.result;
 
} else {
 
console.log("overriding whatever in there");
 
inp_obj = record;
 
store.put(inp_obj);
 
}
 
 
 
} else {
 
if ( getRecord.result != undefined ) {
 
inp_obj = getRecord.result;
 
if ( sqitch === "get record" ) {
 
// if found, let's use that from now on
 
console.log("Getting record");
 
// let's return it so that our addrecord can be used as a getter as well
 
return inp_obj;
 
}
 
//
 
// endof onsuccess
 
} else {
 
console.log("record not found");
 
if ( sqitch === "update record" ) {
 
inp_obj = record;
 
} else {
 
return undefined;
 
}
 
}
 
// endof resultdefined
 
}
 
// endofELSE
 
if ( sqitch === "update record" ) { // Record Update
 
if ( control_1 != undefined ) {
 
if ( control_2 != undefined ) {
 
if ( control_3 != undefined ) {
 
 
if ( Array.isArray( inp_obj[ control_1 ][ control_2 ] ) ) {
 
inp_obj[ control_1 ][ control_2 ].push( control_3 );
 
} else {
 
inp_obj[ control_1 ][ control_2 ] = control_3; // => "Bob"
 
}
 
store.put(inp_obj);
 
} else {
 
 
if ( Array.isArray( inp_obj[ control_1 ] ) ) {
 
inp_obj[ control_1 ].push( control_2 );
 
} else {
 
inp_obj[ control_1 ] = control_2;
 
}
 
store.put(inp_obj);
 
 
 
}
 
// +3
 
} else {
 
store.put(inp_obj);
 
return inp_obj[ control_1 ];
 
}
 
// +2
 
} else {
 
 
 
return inp_obj;
 
 
 
}
 
 
 
};
 
 
 
};
 
};
 
};
 
};
 

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
				}
			}
		});
	}

});