Line 3: |
Line 3: |
| console.log('wbprocessor loading'); | | console.log('wbprocessor loading'); |
| | | |
− | function wbContainer( universe, location ) { | + | function WikibaseProcessorContainer( universe, location ) { |
| | | |
| Debug_switch = false; | | Debug_switch = false; |
Line 27: |
Line 27: |
| } | | } |
| } | | } |
| + | |
| + | // Exposed general wrapper for proceed for object other than what the class is originally instanced on, currently unused |
| + | // Could be used to create a further function to cross check current object with another object 'universe' with another for example |
| + | |
| + | this.xcontains = function ( unv, angle ) { |
| + | if ( ( unv !== undefined ) && ( angle !== undefined ) ){ |
| + | return proceed( unv, angle ); |
| + | }; |
| + | } |
| + | |
| + | /* Exposed helper function to get Entity object of alien entity, if ever needed */ |
| | | |
− | this.EnqueueWB = async function( idk ) {
| + | this.EnqueueWB = async function( idk ) { |
| var k = await wbqueue(idk); | | var k = await wbqueue(idk); |
| return k; | | return k; |
| } | | } |
| + | |
| + | /* Private part of wb Entity getter */ |
| | | |
| async function wbqueue(id) { | | async function wbqueue(id) { |
Line 48: |
Line 61: |
| | | |
| // the list of private helper functions, could not be accessed from outside | | // the list of private helper functions, could not be accessed from outside |
| + | // helper function for descend into an object if key exists, otherwise stay at current level of object |
| function indexinterpolate(obj,i) { return (obj[i] !== undefined) ? obj[i] : obj}; | | function indexinterpolate(obj,i) { return (obj[i] !== undefined) ? obj[i] : obj}; |
− | // helper function for checking a part of an array exists | + | |
| + | // helper function for checking a part of an array exists, if it doesn't, go undefined |
| function indexcheck(obj,i) { if ( obj !== undefined) { return ( obj[i] !== undefined ) ? obj[i] : undefined } }; | | 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 | | // 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. | | // 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. |
Line 58: |
Line 74: |
| } | | } |
| } | | } |
| + | // Check returns matrix.a.b.c.d from 'array' ~ 'matrix' and 'read' ~ 'a.b.c.d' only if it exists all the way, otherwise go undefined |
| function check(array, read){ | | function check(array, read){ |
| if ( array !== undefined ) { | | if ( array !== undefined ) { |
Line 63: |
Line 80: |
| } | | } |
| } | | } |
| + | |
| + | // Main object / array processing instrument |
| + | // Array can be a composition of objects and arrays |
| + | // Read is the instructions, could be an array, or a single path, but for now it should be an object based on our inner convention, example: |
| + | /* |
| + | 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 ] |
| + | } |
| + | */ |
| | | |
| function proceed(array, read) { | | function proceed(array, read) { |
| var ret_obj = {}, | | var ret_obj = {}, |
| temp_obj = array, | | temp_obj = array, |
− | // Have a holder for instructional control return array | + | |
| + | // If we encounter something seriously wrong we will just raise a red flag by setting this false, will check before returning this. |
| success_o_meter = true, | | success_o_meter = true, |
| + | |
| + | // If all goes well, for each path checked, we will have a member in this |
| future_instructional_return = []; | | future_instructional_return = []; |
| | | |
| //|||||||||||||||||||||||||||||||||||||||||||||||||||||[ I N S T R U C T I O N S C O N T R O L ]|||||||||||||||||||||||||||||||||||||||||||||||||||||| | | //|||||||||||||||||||||||||||||||||||||||||||||||||||||[ 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 : | + | // Init program, check if instructions are an object (not an array but has multiple keys) : |
| + | // This is the main path of the function. Could be improved to have it for simple array of instructions |
| if ( ( !Array.isArray(read) ) && ( Object.keys(read).length > 0 ) ) { | | if ( ( !Array.isArray(read) ) && ( Object.keys(read).length > 0 ) ) { |
− |
| |
| | | |
| Object.keys(read).forEach( function(path) { | | Object.keys(read).forEach( function(path) { |
Line 83: |
Line 114: |
| | | |
| if ( Array.isArray (read[path]) ) { | | if ( Array.isArray (read[path]) ) { |
| + | |
| + | // for each path, future_instructional_return will be filled with the future_return_partition after proceeding through that path |
| var future_return_partition = temp_obj; | | var future_return_partition = temp_obj; |
| + | |
| Object.keys(read[path]).forEach( function( path2 ) { | | Object.keys(read[path]).forEach( function( path2 ) { |
| | | |
| debuglog("instructions are an array of arrays, going through " + read[ path ][ path2 ] ); | | debuglog("instructions are an array of arrays, going through " + read[ path ][ path2 ] ); |
− | | + | // for each step, see if it led anywhere other than where we were. |
| if ( data_function( future_return_partition, read[ path ][ path2 ] ) != future_return_partition ){ | | if ( data_function( future_return_partition, read[ path ][ path2 ] ) != future_return_partition ){ |
| + | // if it did, proceed; |
| future_return_partition = data_function( future_return_partition, read[ path ][ path2 ] ); | | future_return_partition = data_function( future_return_partition, read[ path ][ path2 ] ); |
| } else { | | } else { |
| + | // if it didn, raise flag |
| success_o_meter = false; | | success_o_meter = false; |
| } | | } |
Line 97: |
Line 133: |
| | | |
| }); | | }); |
| + | //Now that we went through the path, lets see if everything was ok. |
| if ( success_o_meter === true ) { | | 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 | + | // If yes, put the result of the travel 'future_return_partition' into 'future_instructional_return' |
| + | |
| debuglog("arrived at") | | debuglog("arrived at") |
| debuglog(future_return_partition); | | debuglog(future_return_partition); |
| future_instructional_return[path] = future_return_partition; | | future_instructional_return[path] = future_return_partition; |
| } else { | | } else { |
| + | |
| + | // Otherwise let's put an undefined in there |
| debuglog("seeking derailed"); | | debuglog("seeking derailed"); |
| success_o_meter = true; | | success_o_meter = true; |
Line 110: |
Line 150: |
| } | | } |
| | | |
− | //|||||||||||||||||| If instruction object element is not an array anymore, lets just do one step |||||||||||||||||||||||||||||||||||||||||||||||||||||||| | + | //|||||||||||||||||| If instruction object element is not an array, lets just try to do that one step |||||||||||||||||||||||||||||||||||||||||||||||||||||||| |
− | | + | // Unused |
| else { | | else { |
| | | |
| // INCLUDE step block with read[path] | | // INCLUDE step block with read[path] |
| if ( data_function( temp_obj, read[ path ] ) !== temp_obj ){ | | if ( data_function( temp_obj, read[ path ] ) !== temp_obj ){ |
− | future_instructional_return.push( data_function( temp_obj, read[ path ] ) ); | + | future_instructional_return[path] = data_function( temp_obj, read[ path ] ) ; |
| } else { | | } else { |
| // future_instructional_return.push( undefined ); | | // future_instructional_return.push( undefined ); |
Line 124: |
Line 164: |
| }); | | }); |
| | | |
| + | // Now that we have gone through all paths, make future return object into what we got |
| temp_obj = future_instructional_return; | | temp_obj = future_instructional_return; |
| } | | } |
| | | |
| //||||||||||||[ If we are not in instruction object, let's see if we have an instruction array ]|||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | | //||||||||||||[ If we are not in instruction object, let's see if we have an instruction array ]|||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |
− | | + | //Unused, this part could be improved |
| else if ( Array.isArray(read) ) { | | else if ( Array.isArray(read) ) { |
| // If so let's follow the array of instructions | | // If so let's follow the array of instructions |
Line 145: |
Line 186: |
| | | |
| //||||||||||||[ If we have a single instruction, let's try following that ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | | //||||||||||||[ If we have a single instruction, let's try following that ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |
| + | //Unused, this part could be improved |
| | | |
| else { | | else { |
Line 158: |
Line 200: |
| } | | } |
| } | | } |
| + | |
| // If we haven't got a not found signal along the way, let's try returning the object | | // If we haven't got a not found signal along the way, let's try returning the object |
| | | |
Line 168: |
Line 211: |
| | | |
| //|||||||||||||||||||||||||||||||||||||||||||||||||||||[ S T E P B L O C K ]|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | | //|||||||||||||||||||||||||||||||||||||||||||||||||||||[ S T E P B L O C K ]|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |
| + | |
| + | // Function that takes 1 step. Proceed (along a path) uses this for each step. |
| | | |
| function data_function ( temp_obj, moving ) { | | function data_function ( temp_obj, moving ) { |
| + | |
| + | // we will return an array |
| var future_temp_obj = []; | | var future_temp_obj = []; |
| + | |
| + | // Check if we are on an array level, |
| if ( Array.isArray( temp_obj ) ) { | | if ( Array.isArray( temp_obj ) ) { |
| debuglog("data is on an array level"); | | debuglog("data is on an array level"); |
| Object.keys( temp_obj ).forEach( function ( ect ) { | | Object.keys( temp_obj ).forEach( function ( ect ) { |
| | | |
− | // if we are on an array level in the data, lets iterate through the array | + | // if so, try proceeding in all directions. |
− |
| |
| debuglog("Within partition: " + ect ); | | debuglog("Within partition: " + ect ); |
| if ( checkdive( temp_obj[ ect ], moving ) !== undefined ) { | | if ( checkdive( temp_obj[ ect ], moving ) !== undefined ) { |
| future_temp_obj.push( checkdive( temp_obj[ ect ], moving ) ); | | future_temp_obj.push( checkdive( temp_obj[ ect ], moving ) ); |
| } | | } |
| + | // Put an element into the return array for each direction we could move into |
| | | |
| }); | | }); |
| + | |
| temp_obj = future_temp_obj; | | temp_obj = future_temp_obj; |
| | | |
Line 194: |
Line 244: |
| future_temp_obj = checkdive( temp_obj, moving ); | | future_temp_obj = checkdive( temp_obj, moving ); |
| } | | } |
| + | |
| if ( future_temp_obj !== undefined ){ | | if ( future_temp_obj !== undefined ){ |
| temp_obj = future_temp_obj; | | temp_obj = future_temp_obj; |
Line 199: |
Line 250: |
| debuglog('nothing to see here') | | debuglog('nothing to see here') |
| } | | } |
| + | } |
| | | |
− | } | + | // NOTE this function works now but shows syntactic variance between the else branches |
| + | // Rigorous testing recommended |
| | | |
| return temp_obj; | | return temp_obj; |
Line 207: |
Line 260: |
| //|||||||||||||||||||||||||||||||||||||||||||||||||||||[ E N D O F S T E P B L O C K ]||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | | //|||||||||||||||||||||||||||||||||||||||||||||||||||||[ E N D O F S T E P B L O C K ]||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |
| | | |
− | this.xcontains = function ( unv, angle ) {
| + | // This function substitutes a bunch of try catches and also tries to dive into 'array' in different ways |
− | if ( ( unv !== undefined ) && ( angle !== undefined ) ){
| |
− | return proceed( unv, angle );
| |
− | };
| |
− | }
| |
| | | |
| function checkdive( array, read ){ | | function checkdive( array, read ){ |
| + | |
| + | // simple case, array is an object containing property 'read' |
| + | |
| if ( check(array, read) !== undefined) { | | if ( check(array, read) !== undefined) { |
| return dive(array, read); | | return dive(array, read); |
| } | | } |
| + | |
| + | // array case, 'array' is an actual array, lets return an array of successful trials to dive into each direction |
| + | |
| if ( Array.isArray(array) ) { | | if ( Array.isArray(array) ) { |
| var potential_return = []; | | var potential_return = []; |
Line 226: |
Line 281: |
| return potential_return; | | return potential_return; |
| } | | } |
| + | |
| + | // mystical case, 'what you have been seeking you had it all along... or at least you have it now' |
| + | // This is for when you already at a value level, and are looking for that value. |
| + | // Or when on an object level, and looking for that object |
| + | // or when on an array level, and looking for that array :O |
| + | |
| if ( array === read ) { | | if ( array === read ) { |
| return read; | | return read; |
| } | | } |
− | /* | + | |
| + | /* If we did this, it would probably open up a wormhole or a segfault, or that strange error message browsers give when they are maxed out |
| + | |
| if (Object.keys( array ).length > 0 ){ | | if (Object.keys( array ).length > 0 ){ |
| Object.keys( array ).forEach( function ( piece ) { | | Object.keys( array ).forEach( function ( piece ) { |
Line 237: |
Line 300: |
| */ | | */ |
| } | | } |
| + | |
| + | // Try parsing json. If not a json, go void. |
| | | |
| function interjson( obj ) { | | function interjson( obj ) { |
Line 246: |
Line 311: |
| }; | | }; |
| } | | } |
| + | |
| + | // Heavyweight solution to suppress error messages. |
| | | |
| function debuglog( l0g ){ | | function debuglog( l0g ){ |