Files
Unify/framework/client/queryManager.js

419 lines
6.8 KiB
JavaScript
Raw Normal View History

2025-12-25 11:16:59 +01:00
export default class queryManager{
selectors = new Array();
createSelector( character, name ) {
var selector = new Object();
selector.character = character;
selector.name = name;
this.selectors.push( selector );
}
constructor() {
this.createSelector( "#", "id" )
this.createSelector( ":", "selector" )
this.createSelector( "@", "propertyName" )
}
query( query, unifyObject ) {
var terms = query.split(" ");
var objectSelection = new Array( unifyObject );
for ( var i = 0; i < terms.length; i++ ) {
var term = terms[i];
objectSelection = this.processTerm( term, objectSelection );
}
//console.log( objectSelection );
return objectSelection;
}
clone( object ) {
return JSON.parse( JSON.stringify( object ) )
}
processTerm( term, objectSelection ) {
//console.log("\n\n" )
//console.log( "process term", term );
var newSelection = new Array();
for (var j = 0; j < objectSelection.length; j++) {
var currentObjectSelection = objectSelection[j];
var selected = this.processSelector( term, currentObjectSelection );
newSelection = [...newSelection, ...selected]
}
return newSelection;
}
processSelector( term, objectSelection ) {
var allSelectors = new Array();
for ( var j = 0; j < this.selectors.length; j++ ) {
var selector = this.selectors[j];
var indices = this.getIndicesOf( selector.character, term );
for (var i = 0; i < indices.length; i++) {
var index = indices[i];
var uniuqeSelector = this.clone( selector );
uniuqeSelector.startIndex = index;
allSelectors.push( uniuqeSelector );
}
}
var sortedSelectors = allSelectors.sort( function ( a, b ) { return a.startIndex - b.startIndex } );
var firstSelector = sortedSelectors[0];
//console.log(allSelectors);
if( firstSelector ) {
var startIndex = firstSelector.startIndex;
} else {
var createFirstSelector = true;
}
if( createFirstSelector || startIndex != 0 ) {
var selector = new Object();
selector.character = "";
selector.name = "className";
selector.startIndex = 0;
sortedSelectors = this.addItemToStartOfArray( sortedSelectors, selector );
}
for (var i = 0; i < sortedSelectors.length; i++) {
var selector = sortedSelectors[i];
var nextSelector = sortedSelectors[i+1];
var currentStartIndex = selector.startIndex;
if( nextSelector ) {
var nextStartIndex = nextSelector.startIndex;
} else {
var nextStartIndex = term.length;
}
selector.term = term.substr( currentStartIndex + selector.character.length, nextStartIndex - currentStartIndex - selector.character.length );
}
var objectSelection = new Array( objectSelection );
//console.log(" process selector", term, sortedSelectors)
for ( var i = 0; i < sortedSelectors.length; i++ ) {
//console.log(" executeSelector", objectSelection);
var selector = sortedSelectors[i];
objectSelection = this.executeSelector( selector, objectSelection );
//console.log( " objectSelection", objectSelection );
}
//console.log( " objectSelection", objectSelection );
return objectSelection;
}
executeSelector( selector, ObjectSelection ) {
var name = selector.name;
switch( name ) {
case "className":
var allSelectors = new Array();
for (var i = 0; i < ObjectSelection.length; i++) {
var currentUnifyObject = ObjectSelection[i];
//console.log(currentUnifyObject);
//console.log(" currentUnifyObject.findAll( selector.term )", selector.term);
// by class name
var results = currentUnifyObject.findAll( selector.term );
allSelectors = [...allSelectors, ...results]
}
ObjectSelection = allSelectors
//console.log(" afterObjectSelection", ObjectSelection);
break;
case "propertyName":
if( selector.startIndex == 0 ) {
var allSelectors = new Array();
for (var i = 0; i < ObjectSelection.length; i++) {
var currentUnifyObject = ObjectSelection[i];
var results = currentUnifyObject.getByPropertyName( selector.term );
allSelectors = [...allSelectors, ...results]
}
ObjectSelection = allSelectors
} else {
for (var i = 0; i < ObjectSelection.length; i++) {
var currentUnifyObject = ObjectSelection[i];
//console.log("currentUnifyObject.findChildByID( selector.term )", selector.term);
if( currentUnifyObject.propertyName == selector.term ) {
return new Array( currentUnifyObject );
} else {
return new Array( );
}
// by class name
//ObjectSelection = currentUnifyObject.getChildById( selector.term );
}
}
break;
case "id":
if( selector.startIndex == 0 ) {
var allSelectors = new Array();
for (var i = 0; i < ObjectSelection.length; i++) {
var currentUnifyObject = ObjectSelection[i];
var results = currentUnifyObject.getByID( selector.term );
allSelectors = [...allSelectors, ...results]
}
ObjectSelection = allSelectors
} else {
for (var i = 0; i < ObjectSelection.length; i++) {
var currentUnifyObject = ObjectSelection[i];
//console.log("currentUnifyObject.findChildByID( selector.term )", selector.term);
if( currentUnifyObject.id == selector.term ) {
return new Array( currentUnifyObject );
} else {
return new Array( );
}
// by class name
//ObjectSelection = currentUnifyObject.getChildById( selector.term );
}
}
break;
case "selector":
var term = selector.term;
switch( term ) {
case "first-child":
//console.log("return ObjectSelection[0];", term);
if( ObjectSelection[0] ) {
return new Array( ObjectSelection[0] );
} else {
return new Array( );
}
break;
case "last-child":
//console.log("return ObjectSelection[ObjectSelection.length-1]", term);
var lastObject = ObjectSelection[ObjectSelection.length-1];
if( lastObject ) {
return new Array( lastObject );
} else {
return new Array( );
}
break;
}
break;
}
return ObjectSelection;
}
addItemToStartOfArray( array, newFirstElement ) {
return [ newFirstElement ].concat( array )
}
getIndicesOf( searchStr, str, caseSensitive ) {
var searchStrLen = searchStr.length;
if ( searchStrLen == 0 ) {
return new Array();
}
var startIndex = 0;
var index;
var indices = new Array();
if ( !caseSensitive ) {
str = str.toLowerCase();
searchStr = searchStr.toLowerCase();
}
while ( ( index = str.indexOf( searchStr, startIndex ) ) > -1 ) {
indices.push( index );
startIndex = index + searchStrLen;
}
return indices;
}
}