Code for the Query() class
/* Code from "Developing Featherweight Web Services with JavaScript" http://feather.elektrum.org/ (c)An Elektrum Press, retain this notice License: http://feather.elektrum.org/appendix/licenses.html */ // QUERY object library ------------------------------------------- // constructor ------------------------ function Query () { var qString = document.referrer.replace(/^[^\?]+\??/,'') || document.search.replace(/^\?/,''); qString = qString.replace(/#[^#]*$/, ''); if ( qString ) { this.queryString = qString; this.params = this.parseQuery(); } } // ----------------------------------- Query.prototype.parseQuery = function () { var Params = new Object(); if ( ! this.queryString ) return Params; var Pairs = this.queryString.split(/[&;]/); for ( var i = 0; i < Pairs.length; i++ ) { var KeyVal = Pairs[i].split('='); if ( ! KeyVal.length == 2 ) continue; if ( ! ( KeyVal[0] || KeyVal[1] ) ) continue; var key = unescape( KeyVal[0] ); var val = unescape( KeyVal[1] ); val = val.replace(/\+/g, ' '); Params[key] = val; } return Params; } // ----------------------------------- Query.prototype.chooseBest = function () { // build an associative array of terms to scores var scoredParams = this.scoredParams(); var max = 0; var choice = ''; for ( var qVal in scoredParams ) { if ( scoredParams[qVal] > max ) { choice = qVal; max = scoredParams[qVal]; } } return choice; } // ----------------------------------- Query.prototype.scoredParams = function () { var params = this.params; var Scored = new Object(); // Scored["value"] = numeric_score_of_value for ( var key in params ) { var val = params[key]; var weight = 0; // count things that look like words, min of 3 "letters" var wordlikes = val.match(/(\w[-'\w]+\w\s)|(\w[-'\w]+\w)$/gi); weight += wordlikes ? wordlikes.length : 0; // we know some keys are real indicators so we'll score on them too if ( key.match(/^(q|p)$/) ) weight += 2; if ( key.match(/query|search/i) ) weight++; // heavily discount that which we know to be wrong var badChars = val.match(/[^-a-zA-Z'" ]/g); weight -= badChars ? ( badChars.length * 2 ) : 0; // value probably shouldn't talk about searches or queries weight -= val.match(/query|search/i) ? 1 : 0; Scored[val] = weight; } return Scored; }
All original content is ©2004-2005 an elektrum press, all
rights reserved. For code use, please see Licenses and terms of use.