The Aliens Aliases Have Landed
This week I implemented a new way to customize and extend Ubiquity commands: CmdUtils.CreateAlias
.
The use case for and importance of CreateAlias
CreateAlias
lets you easily create a special-case alias of another, more generic verb. Ubiquity comes bundled with useful verbs like translate
and search
which can be used for a number of different uses based on their arguments. In some cases, and in some languages, though, typing out translate to English
or search with Google
is unnatural, though, as there is a more succinct and direct way to make that request. For example, in English one could say “anglicize” or “google”, respectively, for the verbs and arguments above. Indeed, in order to support both search with Google
and google
, Ubiquity traditionally has implemented two different verbs, search
and google
, which duplicate functionality and code.
CreateAlias lets us create such natural aliases [[Don’t_repeat_yourself |
without repeating ourselves]]. We can easily create an anglicize verb which, in one word, does the work of translate to English , or google which is semantically equivalent to search with Google . |
These sorts of aliases become particularly important in our perpetual quest to internationalize Ubiquity. One discussion that came up early on on our Ubiquity-i18n list is the fact that not all languages have the verb “Google”: in many languages it is necessary to explicitly say “search with Google”. Moreover, other languages may have other domain-specific verbs which English doesn’t have either. Maybe some language has a special verb for “email with Hotmail” or “map Denmark”. Who knows? With CreateAlias
we can easily enable such localizations based on the more generic commands bundled with Ubiquity.
Creating an alias
CreateAlias
was designed to be incredibly simple to use. Here’s an example that will be bundled (but not installed by default) in Ubiquity:
CmdUtils.CreateAlias({
names: ["anglicize"],
verb: "translate",
givenArgs: { goal: "English" }
});
As you see, this syntax is incredibly straightforward. There are two required properties, names
, an array of names for the alias, and verb
, a reference to the target verb that this alias should use.1
The alias can also have a givenArgs
property which is a hash of pre-specified arguments with their semantic roles. Because translate
takes three arguments (an object
text, a goal
language, and a source
language) but we have pre-specified a goal
in the givenArgs
, the new anglicize
command will only take two arguments: the object
text and a source
language. Of course, if you specify no givenArgs
, you’ll get a simple synonym without having access to the original verb’s code.
As you see, the preview of this command is simply the preview of the translate
verb. Its preview and execution is just as if you had entered translate こんにちは to English
.
Just like other commands created with CreateCommand
, the object specifying the alias can also have properties like help
, description
, author
information, and so on. I used the icon
property to add a [[Union Jack]] to it so that it was easily identifiable.
Bonus: using CmdUtils.previewCommand
and CmdUtils.executeCommand
On the road to implementing CreateAlias
, I also implemented the CmdUtils.previewCommand
and CmdUtils.executeCommand
functions. The majority of this code comes from previous work by Louis-Rémi Babé, though I adapted it to the modern Ubiquity system. Using previewCommand
and executeCommand
you can take advantage of the preview or execute functionality of another command. In the new alias-commands feed I included a command called germanize
which essentially is a straightforward analogy to anglicize
, seen above, but using these functions within a CreateCommand
. While CreateAlias
is much more straightforward for simple aliases, for more complex subcommands where you would like to adapt another verb’s execution or preview, or only take one of those but re-implement the other part, previewCommand
and executeCommand
are the way to go.
-
The
verb
reference can be the canonical or reference name of a command, which is the first name in thenames
of a command (also the name listed in the command list when Ubiquity is running in English) or the actual internal ID of the command, which looks likeresource://ubiquity/standard-feeds/general.html#translate
. ↩