419 lines
6.8 KiB
JavaScript
419 lines
6.8 KiB
JavaScript
|
|
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;
|
|
}
|
|
|
|
}
|