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