I've got a patch to handle noun types returning an *array* of possible
default values, in addition to the current tip which only handles a
single default value. It also tweaks the suggest callback to handle
arrays too. While
labs.toolness.com is down (error 500s all day),
there's nowhere obvious for me to post it, so I've posted it belowfor
review. I think it will address Gary Hodgson's ticket 358.
Regards,
Andrew
diff -r 3b57c4c9ae22 ubiquity/modules/parser/parser.js
--- a/ubiquity/modules/parser/parser.js Sun Nov 23 16:05:55 2008 +0800
+++ b/ubiquity/modules/parser/parser.js Sun Nov 23 18:46:11 2008 +0000
@@ -225,7 +225,6 @@
} else {
this._parsingsList = newSuggs;
}
-
this.refreshSuggestionList( query, context );
},
@@ -404,24 +403,50 @@
},
fillMissingArgsWithDefaults: function() {
- let newSentence = this.copy();
- let defaultValue;
+ let newSentences=[this.copy()];
+ let defaultsArray=[];
+ let gotArrayOfDefaults=false;
+ let defaultsSoFar={};
for (let argName in this._verb._arguments) {
if (!this._argSuggs[argName]) {
+ let defaultValue;
+ let thisDefault={name:argName};
let missingArg = this._verb._arguments[argName];
if (missingArg.default) {
defaultValue = this._makeSugg(missingArg.default);
} else if (missingArg.type.default) { // Argument value from
nountype default
- // TODO note this doesn't allow a nounType to return more
than one item from
- // its default() method.
defaultValue = missingArg.type.default();
} else { // No argument
defaultValue = {text:"", html:"", data:null, summary:""};
}
- newSentence.setArgumentSuggestion(argName, defaultValue);
+ let numDefaults=defaultValue.length;
+ if (numDefaults && gotArrayOfDefaults || numDefaults===1) {
+ // we've already used an array of values for a previous
modifier,
+ // so just use first default for this modifier
+ defaultValue=defaultValue[0];
+ numDefaults=0;
+ }
+ if (numDefaults) {
+ // first time we've seen multiple defaults, so create an array of
sentences
+ gotArrayOfDefaults=true;
+ for (let i=0;i<numDefaults;i++) {
+ if (i) {
+ newSentences[i]=this.copy();
+ for (let arg in defaultsSoFar) {
+ newSentences[i].setArgumentSuggestion(arg,defaultsSoFar[arg]);
+ }
+ }
+ newSentences[i].setArgumentSuggestion(argName,defaultValue[i]);
+ }
+ } else {
+ for (let sen in newSentences) {
+ newSentences[sen].setArgumentSuggestion
(argName,defaultValue);
+ }
+ defaultsSoFar[argName]=defaultValue;
+ }
}
}
- return newSentence;
+ return newSentences;
},
getMatchScores: function() {
@@ -463,7 +488,6 @@
let newSen = new NLParser.ParsedSentence(this._verb, {},
this._matchScore);
this._parsedSentences = [newSen];
for (let argName in this._verb._arguments) {
- let argSuggs = [];
if (argStrings[argName] && argStrings[argName].length > 0) {
// If argument is present, try the noun suggestions based both
on
// substituting pronoun...
@@ -497,7 +521,10 @@
let self = this;
// Callback function for asynchronously generated suggestions:
let callback = function(newSugg) {
- self.addArgumentSuggestion(argName, newSugg);
+ if (newSugg.length) {
+ for each (let eachsug in newSugg)
self.addArgumentSuggestion(argName, eachsug);
+ } else
+ self.addArgumentSuggestion(argName, newSugg);
// send a notifcation to let the UI know to update the suggestion
list
Observers.notify(self, "ubiq-suggestions-updated", "");
};
@@ -589,7 +616,8 @@
}
for each( let sen in this._parsedSentences) {
- parsedSentences.push(sen.fillMissingArgsWithDefaults());
+ let newSentences=sen.fillMissingArgsWithDefaults();
+ for each (newOne in newSentences) parsedSentences.push(newOne);
}
return parsedSentences;