<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Snippets code from my daily experience &#187; macro</title>
	<atom:link href="http://dafizilla.wordpress.com/category/macro/feed/" rel="self" type="application/rss+xml" />
	<link>http://dafizilla.wordpress.com</link>
	<description>Just another unnecessary code resource blog</description>
	<lastBuildDate>Sun, 20 Dec 2009 10:00:19 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='dafizilla.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/635b338f35d7304cae2e1b31926d3592?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Snippets code from my daily experience &#187; macro</title>
		<link>http://dafizilla.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://dafizilla.wordpress.com/osd.xml" title="Snippets code from my daily experience" />
		<item>
		<title>Should Komodo macros have to support auto update? (Sunday Thought)</title>
		<link>http://dafizilla.wordpress.com/2009/04/12/should-komodo-macros-have-support-to-auto-update-sunday-thought/</link>
		<comments>http://dafizilla.wordpress.com/2009/04/12/should-komodo-macros-have-support-to-auto-update-sunday-thought/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 00:00:53 +0000</pubDate>
		<dc:creator>dafi</dc:creator>
				<category><![CDATA[komodo]]></category>
		<category><![CDATA[macro]]></category>
		<category><![CDATA[sunday_thought]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[greasemonkey]]></category>
		<category><![CDATA[xpi]]></category>
		<category><![CDATA[xul]]></category>

		<guid isPermaLink="false">http://dafizilla.wordpress.com/?p=598</guid>
		<description><![CDATA[The Komodo macro ecosystem grows quickly and many state-of-art macros born every day.
I&#8217;ve already said in the past that Komodo macro environment is powerful like Microsoft VBA although it has many lacks (like UI creation).
I would have a similar environment on every Mozilla based application something like a KoMonkey or GreaseModo   (Komodo macros [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dafizilla.wordpress.com&blog=887576&post=598&subd=dafizilla&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>The Komodo macro ecosystem grows quickly and many <a href="http://www.openkomodo.com/blogs/jeffg/komodo-macros-pure-magic-code-injection">state-of-art macros</a> born every day.</p>
<p>I&#8217;ve already said in the past that Komodo macro environment is powerful like Microsoft <a href="http://msdn.microsoft.com/en-us/isv/bb190538.aspx">VBA</a> although it has many lacks (like UI creation).</p>
<p>I would have a similar environment on every Mozilla based application something like a KoMonkey or GreaseModo <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  (Komodo macros plus <a href="https://addons.mozilla.org/it/firefox/addon/748">GreaseMonkey</a>).</p>
<p>Macros become more complex and the authors release many revisions thanks to community feedback but today it is difficult to stay tuned when new versions are published.</p>
<p>Adding an update checker to <a href="http://docs.activestate.com/komodo/5.1/toolbox.html">KPZ</a> files is possible but not easy, many technical aspects must be considered.</p>
<p>Today the best approach consists to pack macros like extensions (XPI files) but developers need deeper knowledge and this should be frustrating.</p>
<p>I&#8217;m sure the Komodo macros are at the beginning of a radical evolution</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dafizilla.wordpress.com/598/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dafizilla.wordpress.com/598/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dafizilla.wordpress.com/598/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dafizilla.wordpress.com/598/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dafizilla.wordpress.com/598/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dafizilla.wordpress.com/598/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dafizilla.wordpress.com/598/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dafizilla.wordpress.com/598/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dafizilla.wordpress.com/598/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dafizilla.wordpress.com/598/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dafizilla.wordpress.com&blog=887576&post=598&subd=dafizilla&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://dafizilla.wordpress.com/2009/04/12/should-komodo-macros-have-support-to-auto-update-sunday-thought/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5759d7f64a710425e4ab730ba7a8311e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dafi</media:title>
		</media:content>
	</item>
		<item>
		<title>Colored file tabs for Komodo</title>
		<link>http://dafizilla.wordpress.com/2009/04/01/colored-file-tabs-for-komodo/</link>
		<comments>http://dafizilla.wordpress.com/2009/04/01/colored-file-tabs-for-komodo/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 12:37:43 +0000</pubDate>
		<dc:creator>dafi</dc:creator>
				<category><![CDATA[extension]]></category>
		<category><![CDATA[komodo]]></category>
		<category><![CDATA[macro]]></category>
		<category><![CDATA[openkomodo]]></category>
		<category><![CDATA[xul]]></category>

		<guid isPermaLink="false">http://dafizilla.wordpress.com/?p=568</guid>
		<description><![CDATA[A couple of months ago I wrote a Komodo macro allowing the editor view tabs to be colored based on user defined color schemes, when the macro became stable I published it on Komodo community forum.
Amazingly the macro received more feedback so I decided to &#8216;convert&#8217; it to an XUL extension.
Komodo macros are fantastic but [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dafizilla.wordpress.com&blog=887576&post=568&subd=dafizilla&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A couple of months ago I wrote a Komodo macro allowing the editor view tabs to be colored based on user defined color schemes, when the macro became stable I published it on <a href="http://community.activestate.com/forum/color-tab-language">Komodo community forum</a>.</p>
<p>Amazingly the macro received more feedback so I decided to &#8216;convert&#8217; it to an XUL extension.</p>
<p>Komodo macros are fantastic but they don&#8217;t allow to create complex UIs so moving them to XPI become a necessary step.</p>
<p>Now <a href="http://dafizilla.sourceforge.net/colortab/">ColorTab</a> is ready and can be downloaded from <a href="http://dafizilla.sourceforge.net/colortab/">here</a>.</p>
<p>The original name was KolorTab, the &#8216;K&#8217; letter used to remember Komodo but I&#8217;ve decided to use a more tradictional name <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<div class="wp-caption aligncenter" style="width: 510px"><img title="ColorTab look&amp;feel" src="http://apps.sourceforge.net/mediawiki/dafizilla/nfs/project/d/da/dafizilla/7/78/Colortab.png" alt="ColorTab look&amp;feel" width="500" height="280" /><p class="wp-caption-text">ColorTab look&amp;feel</p></div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dafizilla.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dafizilla.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dafizilla.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dafizilla.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dafizilla.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dafizilla.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dafizilla.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dafizilla.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dafizilla.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dafizilla.wordpress.com/568/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dafizilla.wordpress.com&blog=887576&post=568&subd=dafizilla&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://dafizilla.wordpress.com/2009/04/01/colored-file-tabs-for-komodo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5759d7f64a710425e4ab730ba7a8311e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dafi</media:title>
		</media:content>

		<media:content url="http://apps.sourceforge.net/mediawiki/dafizilla/nfs/project/d/da/dafizilla/7/78/Colortab.png" medium="image">
			<media:title type="html">ColorTab look&#38;feel</media:title>
		</media:content>
	</item>
		<item>
		<title>Posting syntax highlighted code on wordpress.com using Komodo macro</title>
		<link>http://dafizilla.wordpress.com/2009/01/20/posting-syntax-highlighted-code-on-wordpresscom-using-komodo-macro/</link>
		<comments>http://dafizilla.wordpress.com/2009/01/20/posting-syntax-highlighted-code-on-wordpresscom-using-komodo-macro/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 13:30:23 +0000</pubDate>
		<dc:creator>dafi</dc:creator>
				<category><![CDATA[clipboard]]></category>
		<category><![CDATA[koIFileEx]]></category>
		<category><![CDATA[koIFileService]]></category>
		<category><![CDATA[koScintillaSchemeService]]></category>
		<category><![CDATA[komodo]]></category>
		<category><![CDATA[macro]]></category>
		<category><![CDATA[nsIClipboard]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[xul]]></category>

		<guid isPermaLink="false">http://dafizilla.wordpress.com/?p=481</guid>
		<description><![CDATA[Soon or later any blogger talking about software development will post some snippet of code.
To make code more cool and attractive he/she will use syntax highlight.
There are many alternatives for many blog platforms like Pygments, GeSHI, CodeHighlighter, WP-Syntax and so on.
This blog is hosted on the free version of WordPress.com, it doesn&#8217;t allow to use [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dafizilla.wordpress.com&blog=887576&post=481&subd=dafizilla&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Soon or later any blogger talking about software development will post some snippet of code.</p>
<p>To make code more cool and attractive he/she will use syntax highlight.</p>
<p>There are many alternatives for many blog platforms like <a href="http://pygments.org/">Pygments</a>, <a href="http://qbnz.com/highlighter/">GeSHI</a>, <a href="http://wordpress.org/extend/plugins/code-highlighter/">CodeHighlighter</a>, <a href="http://wordpress.org/extend/plugins/wp-syntax/">WP-Syntax</a> and so on.</p>
<p>This blog is hosted on the <strong>free </strong>version of <a href="http://wordpress.com/">WordPress.com</a>, it doesn&#8217;t allow to use any plugin or user-defined CSS so adding <strong><em>sexy</em> </strong>code is very difficult.</p>
<p>Komodo has the ability to <a href="http://docs.activestate.com/komodo/5.0/files.html#files_printhtml">print to HTML files</a> code with the syntax highlighted, this feature is fully accessible from APIs so I&#8217;ve written a macro that</p>
<ul>
<li>make CSS style inline replacing HTML class with corresponding style attributes</li>
<li>copy to clipboard (using the new Komodo 5 clipboard helper library) in HTML format so user can paste directly on Visual WordPress mode</li>
</ul>
<p>Below you find the macro source code obviously highlighted by itself <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<h3>How to get the selected text (or the whole Komodo view) converted to HTML</h3>
<p>The variable str at end contains the converted HTML</p>
<pre><span style="font-size:12px;"><span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">view</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">ko</span><span style="color:#781f87;">.</span><span class="identifiers">views</span><span style="color:#781f87;">.</span><span class="identifiers">manager</span><span style="color:#781f87;">.</span><span class="identifiers">currentView</span><span style="color:#781f87;">;</span>

<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">tmpFileSvc</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">Components</span><span style="color:#781f87;">.</span><span class="identifiers">classes</span><span style="color:#781f87;">[</span><span style="color:#23238e;">"@activestate.com/koFileService;1"</span><span style="color:#781f87;">]</span>
<span class="default">                 </span><span style="color:#781f87;">.</span><span class="identifiers">getService</span><span style="color:#781f87;">(</span><span class="identifiers">Components</span><span style="color:#781f87;">.</span><span class="identifiers">interfaces</span><span style="color:#781f87;">.</span><span class="identifiers">koIFileService</span><span style="color:#781f87;">)</span>
<span class="identifiers">fname</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">tmpFileSvc</span><span style="color:#781f87;">.</span><span class="identifiers">makeTempName</span><span style="color:#781f87;">(</span><span style="color:#23238e;">".html"</span><span style="color:#781f87;">);</span>

<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">lang</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">view</span><span style="color:#781f87;">.</span><span class="identifiers">document</span><span style="color:#781f87;">.</span><span class="identifiers">languageObj</span><span style="color:#781f87;">;</span>
<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">forceColor</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#871f78;">true</span><span style="color:#781f87;">;</span>
<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">selectionOnly</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">view</span><span style="color:#781f87;">.</span><span class="identifiers">selection</span><span class="default"> </span><span style="color:#781f87;">!=</span><span class="default"> </span><span style="color:#23238e;">""</span><span style="color:#781f87;">;</span>
<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">schemeService</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">Components</span><span style="color:#781f87;">.</span><span class="identifiers">classes</span><span style="color:#781f87;">[</span><span style="color:#23238e;">'@activestate.com/koScintillaSchemeService;1'</span><span style="color:#781f87;">].</span><span class="identifiers">getService</span><span style="color:#781f87;">();</span>
<span class="identifiers">schemeService</span><span style="color:#781f87;">.</span><span class="identifiers">convertToHTMLFile</span><span style="color:#781f87;">(</span><span class="identifiers">view</span><span style="color:#781f87;">.</span><span class="identifiers">scimoz</span><span style="color:#781f87;">,</span>
<span class="default">                                </span><span class="identifiers">view</span><span style="color:#781f87;">.</span><span class="identifiers">document</span><span style="color:#781f87;">.</span><span class="identifiers">displayPath</span><span style="color:#781f87;">,</span>
<span class="default">                                </span><span class="identifiers">view</span><span style="color:#781f87;">.</span><span class="identifiers">document</span><span style="color:#781f87;">.</span><span class="identifiers">language</span><span style="color:#781f87;">,</span>
<span class="default">                                </span><span class="identifiers">lang</span><span style="color:#781f87;">.</span><span class="identifiers">styleBits</span><span style="color:#781f87;">,</span>
<span class="default">                                </span><span class="identifiers">view</span><span style="color:#781f87;">.</span><span class="identifiers">document</span><span style="color:#781f87;">.</span><span class="identifiers">encoding</span><span style="color:#781f87;">.</span><span class="identifiers">python_encoding_name</span><span style="color:#781f87;">,</span>
<span class="default">                                </span><span class="identifiers">fname</span><span style="color:#781f87;">,</span>
<span class="default">                                </span><span class="identifiers">selectionOnly</span><span style="color:#781f87;">,</span>
<span class="default">                                </span><span class="identifiers">forceColor</span><span style="color:#781f87;">);</span>

<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">file</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">Components</span><span style="color:#781f87;">.</span><span class="identifiers">classes</span><span style="color:#781f87;">[</span><span style="color:#23238e;">"@activestate.com/koFileEx;1"</span><span style="color:#781f87;">]</span>
<span class="default">        </span><span style="color:#781f87;">.</span><span class="identifiers">createInstance</span><span style="color:#781f87;">(</span><span class="identifiers">Components</span><span style="color:#781f87;">.</span><span class="identifiers">interfaces</span><span style="color:#781f87;">.</span><span class="identifiers">koIFileEx</span><span style="color:#781f87;">)</span>
<span class="identifiers">file</span><span style="color:#781f87;">.</span><span class="identifiers">URI</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">ko</span><span style="color:#781f87;">.</span><span class="identifiers">uriparse</span><span style="color:#781f87;">.</span><span class="identifiers">localPathToURI</span><span style="color:#781f87;">(</span><span class="identifiers">fname</span><span style="color:#781f87;">);</span>
<span class="identifiers">file</span><span style="color:#781f87;">.</span><span class="identifiers">open</span><span style="color:#781f87;">(</span><span style="color:#23238e;">'rb'</span><span style="color:#781f87;">);</span>
<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">str</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">file</span><span style="color:#781f87;">.</span><span class="identifiers">readfile</span><span style="color:#781f87;">();</span>
<span class="identifiers">file</span><span style="color:#781f87;">.</span><span class="identifiers">close</span><span style="color:#781f87;">();</span></span></pre>
<h3>Applying the replace to str</h3>
<p>Nothing really interesting, simply the replace method is called many times to make CSS style inline inside span tags</p>
<h3>Copy to clipboard in HTML format</h3>
<p>Komodo 5 allows to interact with clipboard wrapping XPCOM services, these APIs allow to copy in the so called HTML <a href="https://developer.mozilla.org/en/Using_the_Clipboard">flavor</a> so content preserves styles and colors.</p>
<pre><span style="font-size:12px;"><span class="identifiers">xtk</span><span style="color:#781f87;">.</span><span class="identifiers">include</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"clipboard"</span><span style="color:#781f87;">);</span>

<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">transferable</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">xtk</span><span style="color:#781f87;">.</span><span class="identifiers">clipboard</span><span style="color:#781f87;">.</span><span class="identifiers">addTextDataFlavor</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"text/html"</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">str</span><span style="color:#781f87;">);</span>
<span class="identifiers">transferable</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">xtk</span><span style="color:#781f87;">.</span><span class="identifiers">clipboard</span><span style="color:#781f87;">.</span><span class="identifiers">addTextDataFlavor</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"text/unicode"</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">str</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">transferable</span><span style="color:#781f87;">);</span>
<span class="identifiers">xtk</span><span style="color:#781f87;">.</span><span class="identifiers">clipboard</span><span style="color:#781f87;">.</span><span class="identifiers">copyFromTransferable</span><span style="color:#781f87;">(</span><span class="identifiers">transferable</span><span style="color:#781f87;">);</span>
</span></pre>
<h3>That&#8217;s all folks</h3>
<p>After running this macro on a Komodo view you can paste directly on WordPress Visual editor and obtain your beautiful code.</p>
<p>Using HTML flavor you can paste into any application able to accept Special Formats like Microsoft Word or OpenOffice Writer.</p>
<p>The full macro source code can be found on <a href="http://dafizilla.svn.sourceforge.net/viewvc/dafizilla/trunk/komodo/macros/Word&#112;ress.js?view=markup">Macro SVN repository</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dafizilla.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dafizilla.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dafizilla.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dafizilla.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dafizilla.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dafizilla.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dafizilla.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dafizilla.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dafizilla.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dafizilla.wordpress.com/481/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dafizilla.wordpress.com&blog=887576&post=481&subd=dafizilla&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://dafizilla.wordpress.com/2009/01/20/posting-syntax-highlighted-code-on-wordpresscom-using-komodo-macro/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5759d7f64a710425e4ab730ba7a8311e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dafi</media:title>
		</media:content>
	</item>
		<item>
		<title>Downloading protected resources using nsIChannel and friends</title>
		<link>http://dafizilla.wordpress.com/2008/12/22/downloading-protected-resources-using-nsichannel-and-friends/</link>
		<comments>http://dafizilla.wordpress.com/2008/12/22/downloading-protected-resources-using-nsichannel-and-friends/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 12:35:20 +0000</pubDate>
		<dc:creator>dafi</dc:creator>
				<category><![CDATA[babelzilla]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[komodo]]></category>
		<category><![CDATA[macro]]></category>
		<category><![CDATA[nsIChannel]]></category>
		<category><![CDATA[nsIStreamListener]]></category>

		<guid isPermaLink="false">http://dafizilla.wordpress.com/?p=385</guid>
		<description><![CDATA[A couple of days ago I needed to automate file downloading from a service, a very trivial task in every programming language (or using wget).
The little complication was represented by the web based authentication mechanism (userid/password) needed to access to files.
Determining which files to download and their usage (unzipping and picking files) required some specific [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dafizilla.wordpress.com&blog=887576&post=385&subd=dafizilla&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A couple of days ago I needed to automate file downloading from a service, a very trivial task in every programming language (or using <a href="http://en.wikipedia.org/wiki/Wget">wget</a>).</p>
<p>The little complication was represented by the web based authentication mechanism (userid/password) needed to access to files.<br />
Determining which files to download and their usage (unzipping and picking files) required some specific business logic, nothing really complicated but very annoying.</p>
<p>After a while I realized this job can be done using Javascript and XPCOM and here I would share the solution based on <a href="https://developer.mozilla.org/en/NsIChannel">nsIChannel</a>.</p>
<h3>What is does</h3>
<ul>
<li>the service uses userid and password to login</li>
<li>login to the service using HTTP POST method, it simulates an HTML &lt;form/&gt; submission</li>
<li>store the cookies sent from server. They contains credentials login data, <em>cookies usage is a prerequisite in our scenario</em></li>
<li>reuse login data to download protected resources</li>
</ul>
<h3>Example usage</h3>
<p>Suppose you want to automate download of extensions stored on <a href="https://addons.mozilla.org">AMO</a>&#8217;s sandbox, you must login first so this use-case is perfect for us.<br />
Someone can consider this approach ugly, web services or <a href="https://wiki.mozilla.org/Update:Remora_API_Docs">Remora API</a> are better but here I only want to demonstrate how to use nsIChannel.</p>
<p>Let&#8217;s start&#8230;</p>
<p>You can write the Javascript code shown below to download my extension <a href="http://dafizilla.sourceforge.net/richfeedbutton/index.php">RichFeedButton</a> (dropped on sandbox an year ago)</p>
<pre><span style="font-size:12px;"><span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">amoUsername</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#23238e;">"dafi@localhost"</span><span style="color:#781f87;">;</span>
<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">amoPassword</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#23238e;">"my_secret_code"</span><span style="color:#781f87;">;</span></span>
<span style="font-size:12px;"><span class="identifiers">downloadProtectedResource</span><span style="color:#781f87;">(</span>
<span class="default">   </span><span style="color:#23238e;">"https://addons.mozilla.org/it/firefox/users/login"</span><span style="color:#781f87;">,</span>

<span class="default">   </span><span style="color:#23238e;">"data[Login][email]="</span><span class="default"> </span><span style="color:#781f87;">+</span><span class="default"> </span><span class="identifiers">amoUsername</span><span class="default"> </span><span style="color:#781f87;">+</span><span class="default"> </span><span style="color:#23238e;">"&amp;data[Login][password]"</span><span class="default"> </span><span style="color:#781f87;">+</span><span class="default"> </span><span class="identifiers">amoPassword</span><span style="color:#781f87;">,</span>

<span class="default">   </span><span style="color:#23238e;">"https://addons.mozilla.org/en-US/firefox/downloads/file/33926/richfeedbutton-0.0.21-fx.xpi"</span><span style="color:#781f87;">,</span>

<span class="default">   </span><span style="color:#23238e;">"/tmp/richfeedbutton-0.0.21-fx.xpi"</span><span style="color:#781f87;">);</span></span></pre>
<p><span style="font-size:12px;">where our </span><span style="font-size:12px;"><strong>downloadProtectedResource</strong> function signature is shown below</span></p>
<pre><span style="font-size:12px;">function downloadProtectedResource(loginUrl, postData, resourceUrl, destPathName) { ... }</span></pre>
<p>Nothing special, simply we need to know the HTML input names used for userid and password (ie data[Login][email] and data[Login][password]) and pass them in postData argument.</p>
<p>The <span style="font-size:12px;"><strong>downloadProtectedResource</strong> interacts with <a href="https://developer.mozilla.org/en/nsIChannel">nsIChannel</a> (<a href="https://developer.mozilla.org/en/NsIHttpChannel">nsIHttpChannel</a>) and other XPCOM object<strong><br />
</strong></span></p>
<pre><span style="font-size:12px;"><span style="color:#871f78;">function</span><span class="default"> </span><span class="identifiers">downloadProtectedResource</span><span style="color:#781f87;">(</span><span class="identifiers">loginUrl</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">postData</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">resourceUrl</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">destPathName</span><span style="color:#781f87;">)</span><span class="default"> </span><span style="color:#781f87;">{</span>
<span class="default">   </span><span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">httpChannel</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">makeHttpChannel</span><span style="color:#781f87;">(</span><span class="identifiers">loginUrl</span><span style="color:#781f87;">);</span><span class="default"> </span><span style="color:#696969;font-style:italic;">// create an object nsIHttpChannel
</span><span class="default">   </span><span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">stream</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">makeStringStream</span><span style="color:#781f87;">(</span><span class="identifiers">postData</span><span style="color:#781f87;">);</span><span class="default"> </span><span style="color:#696969;font-style:italic;">// create an object nsIStringInputStream
</span><span class="default">   </span><span class="identifiers">setChannelPostData</span><span style="color:#781f87;">(</span><span class="identifiers">httpChannel</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">stream</span><span style="color:#781f87;">);</span><span class="default"> </span><span style="color:#696969;font-style:italic;">// fill data using nsIUploadChannel
</span><span class="default">
</span><span class="default">   </span><span style="color:#696969;font-style:italic;">// downloader saves data on disk
</span><span class="default">   </span><span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">downloader</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#871f78;">new</span><span class="default"> </span><span class="identifiers">Downloader</span><span style="color:#781f87;">(</span><span class="identifiers">resourceUrl</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">destPathName</span><span style="color:#781f87;">);</span>
<span class="default">   </span><span style="color:#696969;font-style:italic;">// make a login then passes cookies to downloader object
</span><span class="default">   </span><span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">cookieListener</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#871f78;">new</span><span class="default"> </span><span class="identifiers">CookieRetrieverListener</span><span style="color:#781f87;">(</span><span class="identifiers">downloader</span><span style="color:#781f87;">);</span>
<span class="default">
</span><span class="default">   </span><span style="color:#696969;font-style:italic;">// start authentication and download
</span><span class="default">   </span><span class="identifiers">httpChannel</span><span style="color:#781f87;">.</span><span class="identifiers">asyncOpen</span><span style="color:#781f87;">(</span><span class="identifiers">cookieListener</span><span style="color:#781f87;">,</span><span class="default"> </span><span style="color:#871f78;">null</span><span style="color:#781f87;">);</span>
<span style="color:#781f87;">}</span>
</span></pre>
<p>The object Downloader and CookieRetrieverListener implement the <a href="http://www.xulplanet.com/references/xpcomref/ifaces/nsIStreamListener.html">nsIStreamListener</a> interface.</p>
<p>The cookieListener after obtaining cookies aborts the operation because we don&#8217;t need all server output, then it calls the downloader.</p>
<pre><span style="font-size:12px;"><span style="color:#871f78;">function</span><span class="default"> </span><span class="identifiers">CookieRetrieverListener</span><span style="color:#781f87;">(</span><span class="identifiers">downloader</span><span style="color:#781f87;">)</span><span class="default"> </span><span style="color:#781f87;">{</span>
<span class="default">   </span><span style="color:#871f78;">this</span><span style="color:#781f87;">.</span><span class="identifiers">downloader</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">downloader</span><span style="color:#781f87;">;</span>
<span class="default">   </span><span style="color:#871f78;">this</span><span style="color:#781f87;">.</span><span class="identifiers">cookies</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#23238e;">""</span><span style="color:#781f87;">;</span>
<span style="color:#781f87;">}</span>

<span class="identifiers">CookieRetrieverListener</span><span style="color:#781f87;">.</span><span class="identifiers">prototype</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#781f87;">{</span>
<span class="default">   </span><span class="identifiers">onStartRequest</span><span style="color:#781f87;">:</span><span class="default"> </span><span style="color:#871f78;">function</span><span style="color:#781f87;">(</span><span class="identifiers">request</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">ctx</span><span style="color:#781f87;">)</span><span class="default"> </span><span style="color:#781f87;">{</span>
<span class="default">         </span><span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">channel</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">request</span><span style="color:#781f87;">.</span><span class="identifiers">QueryInterface</span><span style="color:#781f87;">(</span><span class="identifiers">Components</span><span style="color:#781f87;">.</span><span class="identifiers">interfaces</span><span style="color:#781f87;">.</span><span class="identifiers">nsIHttpChannel</span><span style="color:#781f87;">);</span>
<span class="default">         </span><span style="color:#871f78;">this</span><span style="color:#781f87;">.</span><span class="identifiers">cookies</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span class="identifiers">channel</span><span style="color:#781f87;">.</span><span class="identifiers">getRequestHeader</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"Cookie"</span><span style="color:#781f87;">);</span>
<span class="default">
</span><span class="default">         </span><span style="color:#696969;font-style:italic;">// no need more data
</span><span class="default">         </span><span style="color:#871f78;">throw</span><span class="default"> </span><span class="identifiers">Components</span><span style="color:#781f87;">.</span><span class="identifiers">results</span><span style="color:#781f87;">.</span><span class="identifiers">NS_ERROR_ABORT</span><span style="color:#781f87;">;</span>
<span class="default">   </span><span style="color:#781f87;">},</span>

<span class="default">   </span><span class="identifiers">onDataAvailable</span><span class="default"> </span><span style="color:#781f87;">:</span><span class="default"> </span><span style="color:#871f78;">function</span><span style="color:#781f87;">(</span><span class="identifiers">request</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">context</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">inputStream</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">offset</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">count</span><span style="color:#781f87;">)</span><span class="default"> </span><span style="color:#781f87;">{</span>
<span class="default">   </span><span style="color:#781f87;">},</span>

<span class="default">   </span><span class="identifiers">onStopRequest</span><span style="color:#781f87;">:</span><span class="default"> </span><span style="color:#871f78;">function</span><span style="color:#781f87;">(</span><span class="identifiers">request</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">ctx</span><span style="color:#781f87;">,</span><span class="default"> </span><span class="identifiers">status</span><span style="color:#781f87;">)</span><span class="default"> </span><span style="color:#781f87;">{</span>
<span class="default">      </span><span style="color:#871f78;">this</span><span style="color:#781f87;">.</span><span class="identifiers">downloader</span><span style="color:#781f87;">.</span><span class="identifiers">cookies</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#871f78;">this</span><span style="color:#781f87;">.</span><span class="identifiers">cookies</span><span style="color:#781f87;">;</span>
<span class="default">      </span><span style="color:#871f78;">this</span><span style="color:#781f87;">.</span><span class="identifiers">downloader</span><span style="color:#781f87;">.</span><span class="identifiers">start</span><span style="color:#781f87;">();</span>
<span class="default">   </span><span style="color:#781f87;">}</span>
<span style="color:#781f87;">}</span>
</span></pre>
<p>Another way to use this code consists to download localizations from BabelZilla as shown below.<br />
BabelZilla requires many parameters on query string <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_confused.gif' alt=':?' class='wp-smiley' /> </p>
<pre><span style="font-size:12px;">
<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">bzUsername</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#23238e;">"</span></span><span style="font-size:12px;"><span style="color:#23238e;">dafi_duck</span></span><span style="font-size:12px;"><span style="color:#23238e;">"</span><span style="color:#781f87;">;</span>
<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">bzPassword</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#23238e;">"</span></span><span style="font-size:12px;"><span style="color:#23238e;">my_secret_code</span></span><span style="font-size:12px;"><span style="color:#23238e;">"</span><span style="color:#781f87;">;</span>
<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">bzItemId</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#23238e;">"88"</span><span style="color:#781f87;">;</span>
<span style="color:#871f78;">var</span><span class="default"> </span><span class="identifiers">bzExtId</span><span class="default"> </span><span style="color:#781f87;">=</span><span class="default"> </span><span style="color:#23238e;">"4432"</span><span style="color:#781f87;">;</span>
<span class="identifiers">downloadProtectedResource</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"http://www.babelzilla.org/index.php"</span><span style="color:#781f87;">,</span>
<span class="default">                 </span><span style="color:#23238e;">"op2=login&amp;lang=english&amp;message=0"</span>
<span class="default">                        </span><span style="color:#781f87;">+</span><span class="default"> </span><span style="color:#23238e;">"&amp;option=ipblogin&amp;task=login&amp;0b14737c5ade1f7697a8f81b33b0bacf=1"</span>
<span class="default">                        </span><span style="color:#781f87;">+</span><span class="default"> </span><span style="color:#23238e;">"&amp;option=com_frontpage&amp;Itemid=1"</span>
<span class="default">                        </span><span style="color:#781f87;">+</span><span class="default"> </span><span style="color:#23238e;">"&amp;username="</span><span class="default"> </span><span style="color:#781f87;">+</span><span class="default"> </span><span class="identifiers">bzUsername</span>
<span class="default">                        </span><span style="color:#781f87;">+</span><span class="default"> </span><span style="color:#23238e;">"&amp;passwd="</span><span class="default"> </span><span style="color:#781f87;">+</span><span class="default"> </span><span class="identifiers">bzPassword</span><span style="color:#781f87;">,</span>
<span class="default">                 </span><span style="color:#23238e;">"http://www.babelzilla.org/index.php?option=com_wts&amp;type=downloadtar"</span>
<span class="default">                        </span><span style="color:#781f87;">+</span><span class="default"> </span><span style="color:#23238e;">"&amp;Itemid="</span><span class="default"> </span><span style="color:#781f87;">+</span><span class="default"> </span><span class="identifiers">bzItemId</span>
<span class="default">                        </span><span style="color:#781f87;">+</span><span class="default"> </span><span style="color:#23238e;">"&amp;extension="</span><span class="default"> </span><span style="color:#781f87;">+</span><span class="default"> </span><span class="identifiers">bzExtId</span><span style="color:#781f87;">,</span>
<span class="default">                 </span><span style="color:#23238e;">"/tmp/vsw.tar.gz"</span><span style="color:#781f87;">);</span>
</span></pre>
<h3>nsIChannel.asyncOpen</h3>
<p>Accessing to cookies received from server requires to use <a href="http://www.xulplanet.com/references/xpcomref/ifaces/nsIStreamListener.html">nsIStreamListener</a> available only in asynchronous open calls.</p>
<p>This needs to start the download only when cookies are surely retrieved, this is achieved using the <a href="http://www.xulplanet.com/references/xpcomref/ifaces/nsIRequestObserver.html#method_onStopRequest">nsIRequestObserver.onStopRequest</a>, any better idea is very appreciated.</p>
<h3>Complete code</h3>
<p>The complete code contains a few of helper functions (reading binary stream, saving file) and is available on <a href="http://dafizilla.svn.sourceforge.net/viewvc/dafizilla/trunk/komodo/macros/bzDownload.js?view=markup">SVN</a>, it&#8217;s ready to be executed as Komodo macro simply setting userid and password.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dafizilla.wordpress.com/385/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dafizilla.wordpress.com/385/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dafizilla.wordpress.com/385/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dafizilla.wordpress.com/385/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dafizilla.wordpress.com/385/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dafizilla.wordpress.com/385/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dafizilla.wordpress.com/385/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dafizilla.wordpress.com/385/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dafizilla.wordpress.com/385/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dafizilla.wordpress.com/385/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dafizilla.wordpress.com&blog=887576&post=385&subd=dafizilla&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://dafizilla.wordpress.com/2008/12/22/downloading-protected-resources-using-nsichannel-and-friends/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5759d7f64a710425e4ab730ba7a8311e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dafi</media:title>
		</media:content>
	</item>
		<item>
		<title>Adding Komodo macros to context menu</title>
		<link>http://dafizilla.wordpress.com/2008/10/20/adding-komodo-macros-to-context-menu/</link>
		<comments>http://dafizilla.wordpress.com/2008/10/20/adding-komodo-macros-to-context-menu/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 16:37:59 +0000</pubDate>
		<dc:creator>dafi</dc:creator>
				<category><![CDATA[context menu]]></category>
		<category><![CDATA[komodo]]></category>
		<category><![CDATA[macro]]></category>
		<category><![CDATA[onpopupshowing]]></category>
		<category><![CDATA[xul]]></category>

		<guid isPermaLink="false">http://dafizilla.wordpress.com/?p=243</guid>
		<description><![CDATA[Komodo macros allow to add new features to the editor, they are like little XUL extensions embedded into application.
I&#8217;ve written dozen of macros and many of them are strictly related to cursor position or selected text so it sounds reasonable to access them using the context menu but at this time Komodo doesn&#8217;t allow this.
Adding [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dafizilla.wordpress.com&blog=887576&post=243&subd=dafizilla&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Komodo macros allow to add new features to the editor, they are like little XUL extensions embedded into application.</p>
<p>I&#8217;ve written dozen of macros and many of them are strictly related to cursor position or selected text so it sounds reasonable to access them using the context menu but at this time Komodo doesn&#8217;t allow this.</p>
<p>Adding macros to context menu is easy, it can be done also using a &#8216;Trojan&#8217; macro <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  triggered at Komodo startup but the best results are achieved using an extension containing configuration dialogs and other whistle and bells.</p>
<p>I&#8217;m lazy so I use <strong>one</strong> <strong>mega</strong> wrapper extension where I put any new code, a very quick and dirty practice.</p>
<p>Here I want to share the snippets necessary to add macros to context menu and running them selecting the corresponding menuitem.</p>
<p>For the sake of example the code shown below adds all macros found on toolbox, this can produce a very long (and unusable) menu.</p>
<p>It is necessary to install the <a href="http://developer.mozilla.org/En/XUL/Attribute/Onpopupshowing">onpopupshowing</a> event handler so we can add/remove menu items dynamically.</p>
<pre><span style="font-size:12px;">
<span class="identifiers">onLoad</span><span class="default">&nbsp;</span><span style="color:#781f87;">:</span><span class="default">&nbsp;</span><span style="color:#871f78;">function</span><span style="color:#781f87;">()</span><span class="default">&nbsp;</span><span style="color:#781f87;">{</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#871f78;">var</span><span class="default">&nbsp;</span><span class="identifiers">ctx</span><span class="default">&nbsp;</span><span style="color:#781f87;">=</span><span class="default">&nbsp;</span><span class="identifiers">document</span><span style="color:#781f87;">.</span><span class="identifiers">getElementById</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"editorContextMenu"</span><span style="color:#781f87;">);</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="identifiers">ctx</span><span style="color:#781f87;">.</span><span class="identifiers">addEventListener</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"popupshowing"</span><span style="color:#781f87;">,</span><span class="default">&nbsp;</span><span style="color:#871f78;">this</span><span style="color:#781f87;">.</span><span class="identifiers">onPopupShowing</span><span style="color:#781f87;">,</span><span class="default">&nbsp;</span><span style="color:#871f78;">false</span><span style="color:#781f87;">);</span>
<span style="color:#781f87;">}</span>

</span></pre>
<p>the onPopupShowing function accesses to toolbox and populates the context menu</p>
<pre><span style="font-size:12px;">
<span class="identifiers">onPopupShowing</span><span class="default">&nbsp;</span><span style="color:#781f87;">:</span><span class="default">&nbsp;</span><span style="color:#871f78;">function</span><span style="color:#781f87;">(</span><span class="identifiers">event</span><span style="color:#781f87;">)</span><span class="default">&nbsp;</span><span style="color:#781f87;">{</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#871f78;">var</span><span class="default">&nbsp;</span><span class="identifiers">arr</span><span class="default">&nbsp;</span><span style="color:#781f87;">=</span><span class="default">&nbsp;</span><span style="color:#781f87;">{};</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#871f78;">var</span><span class="default">&nbsp;</span><span class="identifiers">count</span><span class="default">&nbsp;</span><span style="color:#781f87;">=</span><span class="default">&nbsp;</span><span style="color:#781f87;">{};</span>

<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#696969;font-style:italic;">//&nbsp;get&nbsp;all&nbsp;macros,&nbsp;very&nbsp;ugly&nbsp;but&nbsp;easy&nbsp;to&nbsp;customize
</span><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="identifiers">ko</span><span style="color:#781f87;">.</span><span class="identifiers">toolboxes</span><span style="color:#781f87;">.</span><span class="identifiers">user</span><span style="color:#781f87;">.</span><span class="identifiers">toolbox</span><span style="color:#781f87;">.</span><span class="identifiers">getChildrenByType</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"macro"</span><span style="color:#781f87;">,</span><span class="default">&nbsp;</span><span style="color:#871f78;">true</span><span style="color:#781f87;">,</span><span class="default">&nbsp;</span><span class="identifiers">arr</span><span style="color:#781f87;">,</span><span class="default">&nbsp;</span><span class="identifiers">count</span><span style="color:#781f87;">);</span>

<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#696969;font-style:italic;">//&nbsp;remove&nbsp;menu&nbsp;items
</span><span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#871f78;">var</span><span class="default">&nbsp;</span><span class="identifiers">i</span><span class="default">&nbsp;</span><span style="color:#781f87;">=</span><span class="default">&nbsp;</span><span style="color:#8b0000;">0</span><span style="color:#781f87;">;</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#871f78;">var</span><span class="default">&nbsp;</span><span class="identifiers">mi</span><span style="color:#781f87;">;</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#871f78;">for</span><span class="default">&nbsp;</span><span style="color:#781f87;">(</span><span style="color:#871f78;">var</span><span class="default">&nbsp;</span><span class="identifiers">i</span><span class="default">&nbsp;</span><span style="color:#781f87;">=</span><span class="default">&nbsp;</span><span style="color:#8b0000;">0</span><span style="color:#781f87;">;</span><span class="default">&nbsp;</span><span class="identifiers">mi</span><span class="default">&nbsp;</span><span style="color:#781f87;">=</span><span class="default">&nbsp;</span><span class="identifiers">document</span><span style="color:#781f87;">.</span><span class="identifiers">getElementById</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"macro2ctx"</span><span class="default">&nbsp;</span><span style="color:#781f87;">+</span><span class="default">&nbsp;</span><span class="identifiers">i</span><span style="color:#781f87;">);</span><span class="default">&nbsp;</span><span class="identifiers">i</span><span style="color:#781f87;">++)</span><span class="default">&nbsp;</span><span style="color:#781f87;">{</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="identifiers">mi</span><span style="color:#781f87;">.</span><span class="identifiers">parentNode</span><span style="color:#781f87;">.</span><span class="identifiers">removeChild</span><span style="color:#781f87;">(</span><span class="identifiers">mi</span><span style="color:#781f87;">);</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#781f87;">}</span>

<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#871f78;">var</span><span class="default">&nbsp;</span><span class="identifiers">ctx</span><span class="default">&nbsp;</span><span style="color:#781f87;">=</span><span class="default">&nbsp;</span><span class="identifiers">document</span><span style="color:#781f87;">.</span><span class="identifiers">getElementById</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"editorContextMenu"</span><span style="color:#781f87;">);</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#871f78;">for</span><span class="default">&nbsp;</span><span style="color:#781f87;">(</span><span style="color:#871f78;">var</span><span class="default">&nbsp;</span><span class="identifiers">i</span><span class="default">&nbsp;</span><span style="color:#781f87;">=</span><span class="default">&nbsp;</span><span style="color:#8b0000;">0</span><span style="color:#781f87;">;</span><span class="default">&nbsp;</span><span class="identifiers">i</span><span class="default">&nbsp;</span><span style="color:#781f87;">&lt;</span><span class="default">&nbsp;</span><span class="identifiers">count</span><span style="color:#781f87;">.</span><span class="identifiers">value</span><span style="color:#781f87;">;</span><span class="default">&nbsp;</span><span class="identifiers">i</span><span style="color:#781f87;">++)</span><span class="default">&nbsp;</span><span style="color:#781f87;">{</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#871f78;">var</span><span class="default">&nbsp;</span><span class="identifiers">mi</span><span class="default">&nbsp;</span><span style="color:#781f87;">=</span><span class="default">&nbsp;</span><span class="identifiers">document</span><span style="color:#781f87;">.</span><span class="identifiers">createElement</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"menuitem"</span><span style="color:#781f87;">);</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#871f78;">var</span><span class="default">&nbsp;</span><span class="identifiers">file</span><span class="default">&nbsp;</span><span style="color:#781f87;">=</span><span class="default">&nbsp;</span><span class="identifiers">arr</span><span style="color:#781f87;">.</span><span class="identifiers">value</span><span style="color:#781f87;">[</span><span class="identifiers">i</span><span style="color:#781f87;">].</span><span class="identifiers">getFile</span><span style="color:#781f87;">();</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="identifiers">mi</span><span style="color:#781f87;">.</span><span class="identifiers">setAttribute</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"id"</span><span style="color:#781f87;">,</span><span class="default">&nbsp;</span><span style="color:#23238e;">"macro2ctx"</span><span class="default">&nbsp;</span><span style="color:#781f87;">+</span><span class="default">&nbsp;</span><span class="identifiers">i</span><span style="color:#781f87;">);</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="identifiers">mi</span><span style="color:#781f87;">.</span><span class="identifiers">setAttribute</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"label"</span><span style="color:#781f87;">,</span><span class="default">&nbsp;</span><span class="identifiers">file</span><span style="color:#781f87;">.</span><span class="identifiers">leafName</span><span style="color:#781f87;">);</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="identifiers">mi</span><span style="color:#781f87;">.</span><span class="identifiers">setAttribute</span><span style="color:#781f87;">(</span><span style="color:#23238e;">"oncommand"</span><span style="color:#781f87;">,</span><span class="default">&nbsp;</span><span style="color:#23238e;">"macro2Ctx.onRunMacro('"</span><span class="default">&nbsp;</span><span style="color:#781f87;">+</span><span class="default">&nbsp;</span><span class="identifiers">file</span><span style="color:#781f87;">.</span><span class="identifiers">displayPath</span><span class="default">&nbsp;</span><span style="color:#781f87;">+</span><span class="default">&nbsp;</span><span style="color:#23238e;">"')"</span><span style="color:#781f87;">);</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="identifiers">ctx</span><span style="color:#781f87;">.</span><span class="identifiers">appendChild</span><span style="color:#781f87;">(</span><span class="identifiers">mi</span><span style="color:#781f87;">);</span>
<span class="default">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#781f87;">}</span>
<span style="color:#781f87;">}</span></span></pre>
<p>Finally the onRunMacro function executes the macro found starting from its URL</p>
<p>onRunMacro <span style="color:#871f78;">: function(</span>url<span style="color:#871f78;">) {</span><br />
<span style="color:#871f78;"> var</span> item <span style="color:#871f78;">=</span> ko.toolboxes.user.toolbox.getChildByURL<span style="color:#871f78;">(</span>url<span style="color:#871f78;">);</span><br />
ko.projects.executeMacro<span style="color:#871f78;">(</span>item<span style="color:#871f78;">);</span><br />
<span style="color:#871f78;">}</span></p>
<p>That&#8217;s all Folks</p>
<p>I hope to move all code on a separated extension and publish it&#8230;</p>
<p>but before</p>
<ul>
<li>Macros to add to context menu must be choosen by user</li>
<li>Macros must be removed easily</li>
<li>Choose the context menu to use (tab context menu or editor context menu)</li>
<li>Allow to show macro only if it matches some criteria (like <a href="http://www.xulplanet.com/tutorials/xultu/commands.html">isCommandEnabled</a>)</li>
<li>Better error handling</li>
</ul>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dafizilla.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dafizilla.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dafizilla.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dafizilla.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dafizilla.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dafizilla.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dafizilla.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dafizilla.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dafizilla.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dafizilla.wordpress.com/243/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dafizilla.wordpress.com&blog=887576&post=243&subd=dafizilla&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://dafizilla.wordpress.com/2008/10/20/adding-komodo-macros-to-context-menu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5759d7f64a710425e4ab730ba7a8311e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dafi</media:title>
		</media:content>
	</item>
	</channel>
</rss>