<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mitcho.com &#187; alias</title>
	<atom:link href="http://mitcho.com/blog/tag/alias/feed/" rel="self" type="application/rss+xml" />
	<link>http://mitcho.com</link>
	<description></description>
	<lastBuildDate>Fri, 10 Feb 2012 23:24:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-alpha-19719</generator>
		<item>
		<title>The Aliens Aliases Have Landed</title>
		<link>http://mitcho.com/blog/projects/the-aliens-aliases-have-landed/</link>
		<comments>http://mitcho.com/blog/projects/the-aliens-aliases-have-landed/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 00:46:56 +0000</pubDate>
		<dc:creator>mitcho</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[alias]]></category>
		<category><![CDATA[arguments]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[internationalization]]></category>
		<category><![CDATA[l10n]]></category>
		<category><![CDATA[localization]]></category>
		<category><![CDATA[Mozilla Planet]]></category>
		<category><![CDATA[ubiquity]]></category>
		<category><![CDATA[verb]]></category>

		<guid isPermaLink="false">http://mitcho.com/blog/?p=2841</guid>
		<description><![CDATA[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 [...]
Related posts:<ol>
<li><a href='http://mitcho.com/blog/projects/rolling-out-the-roles/' rel='bookmark' title='Rolling out the Roles'>Rolling out the Roles</a></li>
<li><a href='http://mitcho.com/blog/projects/ubiquity-localization-whats-new-whats-next/' rel='bookmark' title='Ubiquity Localization: What&#8217;s New, What&#8217;s Next'>Ubiquity Localization: What&#8217;s New, What&#8217;s Next</a></li>
<li><a href='http://mitcho.com/blog/projects/localizing-commands-for-ubiquity-0-5/' rel='bookmark' title='Localizing Commands for Ubiquity 0.5'>Localizing Commands for Ubiquity 0.5</a></li>
</ol>

Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><img src="http://mitcho.com/blog/wp-content/uploads/2009/09/close-encounters.jpg" alt="close-encounters.jpg" border="0" width="640" height="300" /></p>

<p>This week <a href="http://ubiquity.mozilla.com/trac/ticket/201">I implemented</a> a new way to customize and extend Ubiquity commands: <code>CmdUtils.CreateAlias</code>.</p>

<h3>The use case for and importance of <code>CreateAlias</code></h3>

<p><code>CreateAlias</code> lets you easily create a special-case alias of another, more generic verb. Ubiquity comes bundled with useful verbs like <code>translate</code> and <code>search</code> which can be used for a number of different uses based on their arguments. In some cases, and in some languages, though, typing out <code>translate to English</code> or <code>search with Google</code> is <a href="http://mitcho.com/blog/projects/how-natural-should-a-natural-interface-be/">unnatural</a>, though, as there is a more succinct and direct way to make that request. For example, in English one could say &#8220;anglicize&#8221; or &#8220;google&#8221;, respectively, for the verbs and arguments above. Indeed, in order to support both <code>search with Google</code> and <code>google</code>, Ubiquity traditionally has implemented two different verbs, <code>search</code> and <code>google</code>, which duplicate functionality and code.</p>

<p><code>CreateAlias</code> lets us create such natural aliases <a href="http://en.wikipedia.org/wiki/Don&#8217;t_repeat_yourself">without repeating ourselves</a>. We can easily create an <code>anglicize</code> verb which, in one word, does the work of <code>translate to English</code>, or <code>google</code> which is semantically equivalent to <code>search with Google</code>.</p>

<p>These sorts of aliases become particularly important in our perpetual quest to internationalize Ubiquity. One discussion that came up early on on our <a href="http://groups.google.com/group/ubiquity-i18n">Ubiquity-i18n</a> list is the fact that not all languages have the verb &#8220;Google&#8221;: in many languages it is necessary to explicitly say &#8220;search with Google&#8221;. Moreover, other languages may have other domain-specific verbs which English doesn&#8217;t have either. Maybe some language has a special verb for &#8220;email with Hotmail&#8221; or &#8220;map Denmark&#8221;. Who knows? With <code>CreateAlias</code> we can easily enable such localizations based on the more generic commands bundled with Ubiquity.</p>

<h3>Creating an alias</h3>

<p><code>CreateAlias</code> was designed to be incredibly simple to use. Here&#8217;s an example that will be bundled (but not installed by default) in Ubiquity:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">CmdUtils.<span style="color: #660066;">CreateAlias</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
  names<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;anglicize&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
  verb<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;translate&quot;</span><span style="color: #339933;">,</span>
  givenArgs<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> goal<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;English&quot;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<p>As you see, this syntax is incredibly straightforward. There are two required properties, <code>names</code>, an array of names for the alias, and <code>verb</code>, a reference to the target verb that this alias should use.<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup></p>

<p>The alias can also have a <code>givenArgs</code> property which is a hash of pre-specified arguments with their <a href="https://wiki.mozilla.org/Labs/Ubiquity/Parser_2/Semantic_Roles">semantic roles</a>. Because <code>translate</code> takes three arguments (an <code>object</code> text, a <code>goal</code> language, and a <code>source</code> language) but we have pre-specified a <code>goal</code> in the <code>givenArgs</code>, the new <code>anglicize</code> command will only take two arguments: the <code>object</code> text and a <code>source</code> language. Of course, if you specify no <code>givenArgs</code>, you&#8217;ll get a simple synonym without having access to the original verb&#8217;s code.</p>

<p><img src="http://mitcho.com/blog/wp-content/uploads/2009/09/anglicize1.png" alt="anglicize.png" border="0" width="650" height="152" /></p>

<p>As you see, the preview of this command is simply the preview of the <code>translate</code> verb. Its preview and execution is just as if you had entered <code>translate こんにちは to English</code>.</p>

<p>Just like other commands created with <code>CreateCommand</code>, the object specifying the alias can also have properties like <code>help</code>, <code>description</code>, <code>author</code> information, and so on. I used the <code>icon</code> property to add a <a href="http://en.wikipedia.org/wiki/Union Jack">Union Jack</a> to it so that it was easily identifiable.</p>

<h3>Bonus: using <code>CmdUtils.previewCommand</code> and <code>CmdUtils.executeCommand</code></h3>

<p>On the road to implementing <code>CreateAlias</code>, I also implemented the <code>CmdUtils.previewCommand</code> and <code>CmdUtils.executeCommand</code> functions. The majority of this code comes from previous work by <a href="http://groups.google.com/group/ubiquity-firefox/browse_thread/thread/993411167fc6f165">Louis-Rémi Babé</a>, though I adapted it to the modern Ubiquity system. Using <code>previewCommand</code> and <code>executeCommand</code> you can take advantage of the preview or execute functionality of another command. In the new <a href="https://ubiquity.mozilla.com/hg/ubiquity-firefox/raw-file/tip/ubiquity/standard-feeds/alias-commands.js">alias-commands</a> feed I included a command called <code>germanize</code> which essentially is a straightforward analogy to <code>anglicize</code>, seen above, but using these functions within a <code>CreateCommand</code>. While <code>CreateAlias</code> is much more straightforward for simple aliases, for more complex subcommands where you would like to adapt another verb&#8217;s execution or preview, or only take one of those but re-implement the other part, <code>previewCommand</code> and <code>executeCommand</code> are the way to go.</p>

<div class="footnotes">
<hr />
<ol>

<li id="fn:1">
<p>The <code>verb</code> reference can be the canonical or <em>reference name</em> of a command, which is the first name in the <code>names</code> 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 like <code>resource://ubiquity/standard-feeds/general.html#translate</code>.&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
<p>Related posts:</p><ol>
<li><a href='http://mitcho.com/blog/projects/rolling-out-the-roles/' rel='bookmark' title='Rolling out the Roles'>Rolling out the Roles</a></li>
<li><a href='http://mitcho.com/blog/projects/ubiquity-localization-whats-new-whats-next/' rel='bookmark' title='Ubiquity Localization: What&#8217;s New, What&#8217;s Next'>Ubiquity Localization: What&#8217;s New, What&#8217;s Next</a></li>
<li><a href='http://mitcho.com/blog/projects/localizing-commands-for-ubiquity-0-5/' rel='bookmark' title='Localizing Commands for Ubiquity 0.5'>Localizing Commands for Ubiquity 0.5</a></li>
</ol>
<p>Related posts brought to you by <a href='http://yarpp.org'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://mitcho.com/blog/projects/the-aliens-aliases-have-landed/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

