Line 25: |
Line 25: |
| }; | | }; |
| | | |
− | var wbproc = new wbContainer(mw, mwEStruct['wbXntity']);
| + | mw.loader.load( '//wiki.personaldata.io/w/index.php?title=User:Abel/WbProcessor.js&action=raw&ctype=text/javascript' ); |
| + | mw.loader.load( '//wiki.personaldata.io/w/index.php?title=MediaWiki:Gadget-personaldata.js&action=raw&ctype=text/javascript' ); |
| + | mw.loader.load( '//wiki.personaldata.io/w/index.php?title=User:Abel/experimaintal.js&action=raw&ctype=text/javascript' ); |
| | | |
− | // Check whether the current page is in a relation of interest to an id of interest
| + | console.log('test'); |
− | 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] ) ); | |
− | | |
− | console.log("test: ")
| |
− | console.log(current_entity);
| |
− | | |
− | var h = new idxdbContainer( mw );
| |
− | h.EnqueuePDIO('update record', Date.now(), Date.now());
| |
− | | |
− | // for each match, render the corresponding ui elements
| |
− | // current_entity.forEach(pdooui.render);
| |
− | | |
− | // License: GPL
| |
− | // Wikibase Processor
| |
− | | |
− | 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 ]||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |
− | | |
− | 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 );
| |
− | | |
− | } else {
| |
− | | |
− | success_o_meter = false;
| |
− | | |
− | }
| |
− | }
| |
− | // 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) {
| |
− | if ( s == undefined) {
| |
− | s = '00'
| |
− | }
| |
− | 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;
| |
− | | |
− | }
| |
− | | |
− | };
| |
− | | |
− | };
| |
− | };
| |
− | };
| |
− | };
| |