<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Chip's Tips for Developers » XML</title>
	
	<link>http://www.chipstips.com</link>
	<description>Contains coding, but not narcotic.</description>
	<lastBuildDate>Mon, 04 Feb 2013 20:50:40 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ChipsTipsXml" /><feedburner:info uri="chipstipsxml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>feedmbox updated to grok RSS 1.0</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/JUWLJzID00Y/</link>
		<comments>http://www.chipstips.com/?p=630#comments</comments>
		<pubDate>Tue, 04 Oct 2011 00:00:45 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[ATOM]]></category>
		<category><![CDATA[OPML]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[atom]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[feeds]]></category>
		<category><![CDATA[rdf]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=630</guid>
		<description><![CDATA[Not too many sites use RSS 1.0 any more. It&#8217;s a completely different standard than RSS 2.0 &#8212; even the abbreviation stands for something different: RDF Site Summary (instead of Really Simple Syndication). But recently, I wanted to subscribe to a hilarious web comic called The Oatmeal, only to find that its feed uses RSS [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=630"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=630" data-text="feedmbox updated to grok RSS 1.0" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D630&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=630";
			reddit_title = "feedmbox updated to grok RSS 1.0";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=630";</script>
		<script type="text/javascript">var dzone_title = "feedmbox updated to grok RSS 1.0";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p><img src="https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2011/Mar/15/feedmbox-logo-1308528854-2_avatar.png" alt="feedmbox" align="left" style="margin-right: 10px" />Not too many sites use RSS 1.0 any more.  It&#8217;s a completely different standard than RSS 2.0 &#8212; even the abbreviation stands for something different: RDF Site Summary (instead of Really Simple Syndication).  But recently, I wanted to subscribe to a hilarious web comic called <a href="http://theoatmeal.com">The Oatmeal</a>, only to find that its feed uses RSS 1.0.  Not to be discouraged, I decided to add RSS 1.0 support to my feed-to-email script, feedmbox.  Download links below.</p>
<p>I&#8217;ve also updated the license to OWL 0.9.  Enjoy!</p>
<div class="downloadbuttons">
    <a href="http://bitbucket.org/sterlingcamden/feedmbox"><img src="http://www.chipstips.com/images/bitbucket.png" alt="BitBucket repository" /></a><br />
    <a href="http://www.chipstips.com/download/feedmbox.tar.bz2"><img src="http://www.chipstips.com/images/tarball.png" alt="tarball" /></a>
</div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/JUWLJzID00Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=630</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=630</feedburner:origLink></item>
		<item>
		<title>feedmbox: pipe feeds to email</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/jXisoJe-phg/</link>
		<comments>http://www.chipstips.com/?p=597#comments</comments>
		<pubDate>Tue, 15 Mar 2011 00:38:20 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[ATOM]]></category>
		<category><![CDATA[OPML]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[atom]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[feeds]]></category>
		<category><![CDATA[rbfeedmbox]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=597</guid>
		<description><![CDATA[I&#8217;ve been using Newspipe for a while now to send my subscribed feeds to an email folder, but there are a few things I don&#8217;t like about that arrangement. Newspipe is not actively maintained. I thought about porting it to FreeBSD (it isn&#8217;t in ports yet) &#8212; but it&#8217;s somewhat Windows-centric (it uses a .INI [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=597" data-text="feedmbox: pipe feeds to email" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D597&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=597";
			reddit_title = "feedmbox: pipe feeds to email";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=597";</script>
		<script type="text/javascript">var dzone_title = "feedmbox: pipe feeds to email";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p><img src="https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2011/Mar/15/feedmbox-logo-1308528854-2_avatar.png" alt="feedmbox" align="left" style="margin-right: 10px" />I&#8217;ve been <a href="http://www.geeksaresexy.net/2010/06/16/how-to-teach-your-old-mutt-some-new-tricks/">using Newspipe</a> for a while now to send my <a href="http://www.chipstips.com/?p=539">subscribed feeds</a> to an email folder, but there are a few things I don&#8217;t like about that arrangement.  Newspipe is not actively maintained.  I thought about porting it to FreeBSD (it isn&#8217;t in ports yet) &#8212; but it&#8217;s somewhat Windows-centric (it uses a .INI file, for example), and it&#8217;s licensed under the GPL.  That makes three strikes.  I decided instead to write my own utility in Ruby to do just what I need.</p>
<p>From the links below you can download the feedmbox utility.  The README should tell you all you need to know.  It takes OPML input and turns that into email output by polling each feed in the OPML document and converting each new item into an email message.  Feedmbox uses a SQLite3 database to keep track of which items it has seen before.</p>
<p>To convert HTML to text, I started with <a href="http://blog.choonkeat.com/weblog/2005/10/html2text-funct.html">this version from Chew</a>, and then tweaked it to my own requirements.  Chew&#8217;s version didn&#8217;t preserve &#8220;title&#8221; or &#8220;alt&#8221; tags from images &#8212; mine prefers &#8220;title&#8221;, but will use &#8220;alt&#8221; if &#8220;title&#8221; is not present.  Chew&#8217;s also used CGI.escape, which doesn&#8217;t handle all HTML entities.  I switched to using the <a href="http://htmlentities.rubyforge.org/">&#8220;htmlentities&#8221; rubygem</a> instead.</p>
<p>So, I have all of my feeds specified in a file named sterling.opml in my Personal folder.  I want my feed emails to go to my Mail/feeds folder, which is in mbox format.  I added a crontab entry to periodically execute the following command:</p>
<p><code>feedmbox.rb ~/Personal/sterling.opml &gt;&gt; ~/Mail/feeds</code></p>
<p>That, my friends, is Really Simple Syndication.</p>
<div class="downloadbuttons">
    <a href="http://bitbucket.org/sterlingcamden/feedmbox"><img src="http://www.chipstips.com/images/bitbucket.png" alt="BitBucket repository" /></a><br />
    <a href="http://www.chipstips.com/download/feedmbox.tar.bz2"><img src="http://www.chipstips.com/images/tarball.png" alt="tarball" /></a>
</div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/jXisoJe-phg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=597</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=597</feedburner:origLink></item>
		<item>
		<title>Legendary new feature for OPML Browser for WordPress</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/Em8K7AmAUJc/</link>
		<comments>http://www.chipstips.com/?p=583#comments</comments>
		<pubDate>Sat, 18 Dec 2010 21:35:28 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[phpopmlbrowse]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[widgets]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=583</guid>
		<description><![CDATA[When we last left our valiant plugin, it had just succeeded in implementing all of the features requested by László Monda, except for one: László wanted to be able to use the rss.png from /wp-includes/images to avoid an extra GET request when loading the page. Although I had provided a way to override the location [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=583"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=583" data-text="Legendary new feature for OPML Browser for WordPress" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D583&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=583";
			reddit_title = "Legendary new feature for OPML Browser for WordPress";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=583";</script>
		<script type="text/javascript">var dzone_title = "Legendary new feature for OPML Browser for WordPress";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>When we <a href="http://www.chipstips.com/?p=580">last left our valiant plugin</a>, it had just succeeded in implementing all of the features requested by <a href="http://monda.hu/">László Monda</a>, except for one:  László wanted to be able to use the rss.png from /wp-includes/images to avoid an extra GET request when loading the page.  Although I had provided a way to override the location for the images, he didn&#8217;t want to put all of the images in /wp-includes/images, because that directory gets overwritten by upgrades to WordPress.  He resorted to making a <a href="http://www.chipstips.com/?p=580&#038;cpage=1#comment-133592">one-line custom modification to the code</a>.</p>
<p>Well, I hate forcing people to patch my code for the functionality they desire.  I can also see his point.  Although the overhead of a single GET does not concern me much, I imagine in bandwidth-restricted circumstances every little bit helps.  On the other hand, I don&#8217;t want to hard-code the location of this image, because existing users may be customizing the images used for the opml-browser plugin.  So, I implemented László&#8217;s change as an option:  the &#8220;Monda option&#8221; &#8212; or more verbosely, &#8220;Use rss.png from wp-includes/images?&#8221;  This option overrides the &#8220;Image URL&#8221; option for rss.png only.</p>
<p>This one change accompanies a bump to version 2.4.  Download links below.</p>
<p>Oh, and if you&#8217;re wondering about the word &#8220;legendary&#8221; in the title of this post, just ask <a href="http://translate.google.com/#hu|en|Monda">Google a mindent tudni</a>.</p>
<div class="downloadbuttons">
    <a href="http://bitbucket.org/sterlingcamden/opml-browser"><img src="http://www.chipstips.com/images/bitbucket.png" alt="BitBucket repository" /></a><br />
    <a href="http://www.chipstips.com/download/opml-browser.tar.bz2"><img src="http://www.chipstips.com/images/tarball.png" alt="tarball" /></a><br />
    <a href="http://www.chipstips.com/download/opml-browser.zip"><img src="http://www.chipstips.com/images/zip.png" alt="zip" /></a>
</div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/Em8K7AmAUJc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=583</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=583</feedburner:origLink></item>
		<item>
		<title>OPML Browser for WordPress version 2.3</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/EZ0T87Bzpa8/</link>
		<comments>http://www.chipstips.com/?p=580#comments</comments>
		<pubDate>Sun, 12 Dec 2010 01:38:17 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[phpopmlbrowse]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[widgets]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=580</guid>
		<description><![CDATA[I never seem to be able to stick my fingers in a WordPress plugin without getting them nasty. After I released version 2.2 of the OPML Browser, László came up with several more suggestions. I didn&#8217;t agree to all of them, but here are the ones I&#8217;ve included in version 2.3: Added option for &#8220;Show [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=580"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=580" data-text="OPML Browser for WordPress version 2.3" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D580&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=580";
			reddit_title = "OPML Browser for WordPress version 2.3";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=580";</script>
		<script type="text/javascript">var dzone_title = "OPML Browser for WordPress version 2.3";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>I never seem to be able to stick my fingers in a WordPress plugin without getting them nasty.  After I released <a href="http://www.chipstips.com/?p=577">version 2.2</a> of the OPML Browser, <a href="http://monda.hu/">László</a> came up with several more suggestions.  I didn&#8217;t agree to all of them, but here are the ones I&#8217;ve included in version 2.3:</p>
<ul>
<li>Added option for &#8220;Show clickable folders for categories&#8221;, with a default value of true.  You can now uncheck this option to suppress the folder icons.  Of course, if you do that, the user cannot collapse categories.</li>
<li>Escape any special HTML characters found in the text, title, description, xmlUrl, or htmlUrl attributes, but without double-escaping.</li>
<li>Changed img tags to use the &#8220;id&#8221; attribute instead of the obsolete &#8220;name&#8221; attribute.</li>
</ul>
<p>The last two items allow the widget to validate cleanly at <a href="http://html5.validator.nu">html5.validator.nu</a>.</p>
<p>I shall now go wash the PHP off my hands.</p>
<div class="downloadbuttons">
    <a href="http://bitbucket.org/sterlingcamden/opml-browser"><img src="http://www.chipstips.com/images/bitbucket.png" alt="BitBucket repository" /></a><br />
    <a href="http://www.chipstips.com/download/opml-browser.tar.bz2"><img src="http://www.chipstips.com/images/tarball.png" alt="tarball" /></a><br />
    <a href="http://www.chipstips.com/download/opml-browser.zip"><img src="http://www.chipstips.com/images/zip.png" alt="zip" /></a>
</div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/EZ0T87Bzpa8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=580</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=580</feedburner:origLink></item>
		<item>
		<title>OPML Browser version 2.2 for WordPress</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/k7ZfxrQwQzA/</link>
		<comments>http://www.chipstips.com/?p=577#comments</comments>
		<pubDate>Tue, 07 Dec 2010 22:55:34 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[phpopmlbrowse]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[widgets]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=577</guid>
		<description><![CDATA[A user (I have users?!?) named László Monda offered some enhancement suggestions for my OPML Browser plugin for WordPress. I have implemented them in version 2.2, which you can download from the links below. Specifically, I added the following options: Image URL, defaulting to the previous hard-coded location (images subdirectory). László wanted to be able [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=577"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=577" data-text="OPML Browser version 2.2 for WordPress" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D577&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=577";
			reddit_title = "OPML Browser version 2.2 for WordPress";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=577";</script>
		<script type="text/javascript">var dzone_title = "OPML Browser version 2.2 for WordPress";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>A user (I have users?!?) named <a href="http://monda.hu/">László Monda</a> offered some enhancement suggestions for my OPML Browser plugin for WordPress.  I have implemented them in version 2.2, which you can download from the links below.</p>
<p>Specifically,  I added the following options:</p>
<ul>
<li><strong>Image URL</strong>, defaulting to the previous hard-coded location (images subdirectory).  László wanted to be able to reuse the rss.png in the /wp-content/images directory instead of loading two RSS icons.  He can do that now by changing the &#8220;Image URL&#8221; in the widget options to that directory and making sure that all of the needed images are located there.</li>
<li><strong>Include OPML descriptions as tooltips</strong>, with a default value of true.  If you uncheck this option, then no tooltips will be displayed.  I also added a delay of one second between the mouseover and the tooltip display.</li>
<li><strong>Include &#8220;Get this widget&#8221; link?</strong>, with a default value of true.  If you uncheck this option, the link will not be displayed and you must either plaster my praises all over your blog or reconcile your conscience to your ingratitude in some other way.</li>
</ul>
<p>I also took this opportunity to move the OPML Browser project into a Mercurial repository on BitBucket, and to offer a .tar.bz2 download in addition to a .zip format.  Enjoy!</p>
<div class="downloadbuttons">
    <a href="http://bitbucket.org/sterlingcamden/opml-browser"><img src="http://www.chipstips.com/images/bitbucket.png" alt="BitBucket repository" /></a><br />
    <a href="http://www.chipstips.com/download/opml-browser.tar.bz2"><img src="http://www.chipstips.com/images/tarball.png" alt="tarball" /></a><br />
    <a href="http://www.chipstips.com/download/opml-browser.zip"><img src="http://www.chipstips.com/images/zip.png" alt="zip" /></a>
</div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/k7ZfxrQwQzA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=577</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=577</feedburner:origLink></item>
		<item>
		<title>OPML-based feed subscriptions made easy</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/oJGw1cxHpsg/</link>
		<comments>http://www.chipstips.com/?p=539#comments</comments>
		<pubDate>Fri, 30 Jul 2010 19:50:12 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[ATOM]]></category>
		<category><![CDATA[OPML]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[atom]]></category>
		<category><![CDATA[mutt]]></category>
		<category><![CDATA[newspipe]]></category>
		<category><![CDATA[rbopmlsub]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=539</guid>
		<description><![CDATA[I&#8217;ve been a much happier feed consumer since I started using Newspipe to pump my feeds to mutt. Subscribing to new feeds, however, got a bit more complicated. I&#8217;d have to edit my OPML file and make sure I got the new element inserted with all the right syntax. Even before that, I&#8217;d have to [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=539"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=539" data-text="OPML-based feed subscriptions made easy" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D539&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=539";
			reddit_title = "OPML-based feed subscriptions made easy";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=539";</script>
		<script type="text/javascript">var dzone_title = "OPML-based feed subscriptions made easy";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>I&#8217;ve been a much happier feed consumer since I started <a href="http://www.geeksaresexy.net/2010/06/16/how-to-teach-your-old-mutt-some-new-tricks/">using Newspipe to pump my feeds to mutt</a>.  Subscribing to new feeds, however, got a bit more complicated.  I&#8217;d have to edit my OPML file and make sure I got the new element inserted with all the right syntax.  Even before that, I&#8217;d have to find the link to the feed I wanted.  You&#8217;d be suprised how many sites don&#8217;t provide a direct link to their feed, so I&#8217;d often have to view the page source and search for an RSS autodiscovery link.</p>
<p>Then a few days ago, a reader asked me if I knew of a utility that would list all the autodiscovered feeds on a site.  Since I could obviosuly use the same thing myself, I wrote it.  It&#8217;s called feeds.rb.  You just type a command like this at the command prompt:<br />
<code>feeds.rb http://example.com</code></p>
<p>&#8230; and it lists out all the feeds that have autodiscovery links on that page.</p>
<p>The next step, of course, is to automate including one of these links in my OPML file.  Yes, I&#8217;m lazy &#8212; it&#8217;s one of the traits of an efficient programmer.  I created a second script, called opmlsub.rb:</p>
<p><code>opmlsub.rb myopmlfile.opml -s http://example.com > myopmlfile.new</code></p>
<p>This one takes the given URL and adds an outline element for it to the incoming OPML file, spitting the result to stdout.  If the URL is a feed, it will just use it directly.  If it&#8217;s an HTML page, it will look for autodiscovery links and use the first RSS 2.0 link, if available, or the first ATOM link if an RSS 2.0 link can&#8217;t be found (I have to prefer RSS 2.0, being a member of <a href="http://www.rssboard.org">The Board</a>).</p>
<p>You can also instruct opmlsub.rb where to place the new link.  The option <code>-i TEXT</code> specifies the value of the &#8220;text&#8221; attribute of an existing &#8220;outline&#8221; entry inside which the new link will be placed, as the new last child element.  If not specified or not found, then the new element will be the last child of the &#8220;body&#8221; element.</p>
<p>I didn&#8217;t include options for editing and deleting elements.  That&#8217;s easy enough to do with vim on the rare occasions when it&#8217;s needed.</p>
<p>Finally, I wanted to be able to do all this while looking at a page in Firefox (or Chromium, when it&#8217;s released on FreeBSD).  So I created a third script named &#8216;clipsub&#8217;, which takes a URL from the clipboard (using xclip) and adds it to my OPML file without any intervention.  I then mapped that to a key shortcut (mod4+shift+S) in my window manager, xmonad.  Because opmlsub.rb validates a subset of the feed, I don&#8217;t have to worry about accidentally invoking this when a non-URL is on the clipboard.  If any error occurs, clipsub pops up the error message in an xmessage window.</p>
<p>So now, when I see a site to which I&#8217;d like to subscribe, I just press ctrl+L (highlight the URL in the address bar), ctrl+C (copy it to the clipboard), and mod4+shift+S (subscribe) &#8212; and the posts start magically showing up in my feeds folder in mutt.</p>
<p><a href="http://bitbucket.org/sterlingcamden/opmlsub/">Mercurial repository on BitBucket</a></p>
<div class="downloadbutton"><a href="http://www.chipstips.com/download/rbopmlsub.tar.bz2"><img src="http://www.chipstips.com/images/download.gif" alt="download" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/oJGw1cxHpsg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=539</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=539</feedburner:origLink></item>
		<item>
		<title>Categories now have feeds, thanks to a new WordPress plugin</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/bUWJtfiGWWo/</link>
		<comments>http://www.chipstips.com/?p=360#comments</comments>
		<pubDate>Tue, 25 Aug 2009 19:02:26 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Site News]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[categories]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[phpcat2opml]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=360</guid>
		<description><![CDATA[On this site I write examples in a variety of programming languages.  I’m sure that some of my WordPress (PHP) audience gets tired of hearing about Synergy/DE, Ruby, and C#.  Some Rubyist readers have commented that I should stick to writing about Ruby.  I experienced a wave of subscriptions from Lispers when I posted twice [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=360"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=360" data-text="Categories now have feeds, thanks to a new WordPress plugin" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D360&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=360";
			reddit_title = "Categories now have feeds, thanks to a new WordPress plugin";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=360";</script>
		<script type="text/javascript">var dzone_title = "Categories now have feeds, thanks to a new WordPress plugin";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" src="http://chipstips.com/wp-content/images/CategoriesnowhavefeedsthankstoanewWordPr_9CE2/image.png" border="0" alt="image" width="122" height="39" align="left" /> On this site I write examples in a variety of programming languages.  I’m sure that some of my WordPress (PHP) audience gets tired of hearing about Synergy/DE, Ruby, and C#.  Some Rubyist readers have commented that I should stick to writing about Ruby.  I experienced a wave of subscriptions from Lispers when I posted twice about Lisp, but they’re probably sick of all the non-Lisp posts I’ve written since then.  So, it’s time to give subscribers more choice.</p>
<p>Take a look over at the right sidebar (<a href="http://chipstips.com">here</a>, if you’re in a feed reader).  Scroll down below the ads and notice the new “Categories” widget.  You can now subscribe to any category by clicking the orange RSS icon beside its name.  Categories that contain other categories also include their content in the feed.  So, you can subscribe to specific programming languages, or the “WordPress” feed, or the “.NET” feed, or the “OPML” feed – depending on what you’re interested in reading.  Note that I often post under more than one category, so for instance if you subscribe to “PHP” you’ll get a superset of “WordPress” &#8212; because all WordPress posts are also under PHP – at least, so far.</p>
<p><strong>How you, too, can display this glorious new Categories widget on your site</strong></p>
<p>Surprise!  It’s really my trusty <a href="http://chipstips.com/?tag=phpopmlbrowse">OPML Browser widget</a>.  But it’s feeding from an OPML file that is automatically updated by a new WordPress plugin that you can download below.  This plugin generates an OPML file containing links to your categories and their feeds.  You can override the feed URLs (in case you want to feed them through <a href="http://feedburner.com">FeedBurner</a>), or let the plugin use the default feed URL.  You can generate the file on demand, but the plugin will automatically regenerate it any time you add, change, or delete a category.</p>
<p>Once you’ve got the Categories OPML plugin all set up, just add the OPML Browser widget to your sidebar and tell it where the file is located.  Make sure you have the latest version of the OPML Browser – the OPML for hierarchical categories posed a few challenges for the older version and <a href="http://www.chipstips.com/?p=355">required an update</a>.</p>
<div class="downloadbutton"><a href="http://www.chipstips.com/download/phpcat2opml.zip"><img src="http://www.chipstips.com/images/download.gif" alt="" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/bUWJtfiGWWo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=360</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=360</feedburner:origLink></item>
		<item>
		<title>OPML Browser for WordPress gets a new parser</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/DsOS4keRmgI/</link>
		<comments>http://www.chipstips.com/?p=355#comments</comments>
		<pubDate>Mon, 24 Aug 2009 22:36:49 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[phpopmlbrowse]]></category>
		<category><![CDATA[regexen]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=355</guid>
		<description><![CDATA[I thought of a new use for my OPML Browser plugin, but the OPML file I intended to use with it threw me a couple of curve balls. First of all, the file contained nested outline elements, with xmlURL attributes on the containing elements.  Until now, I displayed the feed icon if an item had [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=355"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=355" data-text="OPML Browser for WordPress gets a new parser" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D355&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=355";
			reddit_title = "OPML Browser for WordPress gets a new parser";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=355";</script>
		<script type="text/javascript">var dzone_title = "OPML Browser for WordPress gets a new parser";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p><img style="margin: 0px 10px 0px 0px; display: inline" src="http://www.chipstips.com/wp-content/images/opml.jpg" alt="" width="64" height="64" align="left" />I thought of a new use for my OPML Browser plugin, but the OPML file I intended to use with it threw me a couple of curve balls.</p>
<p>First of all, the file contained nested outline elements, with xmlURL attributes on the containing elements.  Until now, I displayed the feed icon if an item had a feed, and only displayed the folder icon if it didn’t (and it had child elements).  Because the only way to expand/collapse the tree is by clicking on the folder icon, I’ve changed this to display both icons in that case.</p>
<p>Second, my file nests the outline tags more than two levels deep.  I was using <a href="http://www.php.net/manual/en/function.preg-match.php">preg_match</a> to parse the XML, with a non-greedy search for the end tag.  Can you guess what the problem was with that approach?  I’d get the end tag for an internal outline item when I was looking for the end of the outer item.  This only happened, of course, when an inner item was terminated by &lt;/outline&gt;.</p>
<p>Rather than trying to get even fancier with my regular expressions, I decided to implement a real XML parser instead.  I took a look at <a href="http://www.php.net/simplexml">SimpleXML</a>, but it requires PHP5 and allow_fopen_url.  Then I looked at PHP’s built-in <a href="http://www.php.net/manual/en/ref.xml.php">XML parser functions</a>, but that’s event-based and I needed to wade through the document on my own terms.  So I implemented my own <a href="http://www.chipstips.com/?p=353">simple XML DOM parser</a>, and included that with the plugin.</p>
<div class="downloadbutton"><a href="http://www.chipstips.com/download/phpopmlbrowse21.zip"><img src="http://www.chipstips.com/images/download.gif" alt="" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/DsOS4keRmgI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=355</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=355</feedburner:origLink></item>
		<item>
		<title>Simple XML DOM parser for PHP</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/q2HnHLp_Sbw/</link>
		<comments>http://www.chipstips.com/?p=353#comments</comments>
		<pubDate>Mon, 24 Aug 2009 21:57:47 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[parser]]></category>
		<category><![CDATA[phpxmlparse]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=353</guid>
		<description><![CDATA[I realize that I’ve just added to the pile of reinvented wheels here, but I needed something simpler than SimpleXML (particularly in the requirements department) that nevertheless translated the event-based model of PHP’s built-in parser to a DOM model. Thus, I created the very simple parser which you can download below.  It’s only 67 lines [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=353"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=353" data-text="Simple XML DOM parser for PHP" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D353&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=353";
			reddit_title = "Simple XML DOM parser for PHP";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=353";</script>
		<script type="text/javascript">var dzone_title = "Simple XML DOM parser for PHP";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p><a href="http://www.warningsigngenerator.com/"><img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" src="http://chipstips.com/wp-content/images/SimpleXMLDOMparserforPHP_CCD5/image.png" border="0" alt="image" width="166" height="200" align="left" /></a> I realize that I’ve just added to the pile of reinvented wheels here, but I needed something simpler than <a href="http://www.php.net/simplexml">SimpleXML</a> (particularly in the <a href="http://www.php.net/manual/en/simplexml.requirements.php">requirements</a> department) that nevertheless translated the event-based model of <a href="http://www.php.net/manual/en/ref.xml.php">PHP’s built-in parser</a> to a DOM model.</p>
<p>Thus, I created the very simple parser which you can download below.  It’s only 67 lines long.  It’s partially based on <a href="http://www.php.net/manual/en/ref.xml.php#84758">the example from wolfon</a>, but simplified even further by adding an xmlElement class instead of trying to force all of the relationships into an array format.</p>
<p>To use:</p>
<p><code>require("xmlparse.php"); </code></p>
<p><code>$dom = new xmlDOM($xml_text);   // Parses $xml_text </code></p>
<p><code>$dom-&gt;root</code> is an xmlElement with a zero-length tagName whose children member is an array of the top-level elements (of which there should only be 1) .</p>
<p><code>$dom-&gt;find_tag($tagName, $from);</code></p>
<p>Returns the first xmlElement whose tagName matches <code>$tagName</code>, starting with the children of $from.  If <code>$from</code> is null, it starts from the root.  If not found, false is returned.</p>
<p>An xmlElement has the following members:</p>
<p><code>parent</code> &#8211; the parent element<br />
<code>tagName</code> &#8211; the tag name<br />
<code>attributes</code> &#8211; an associative array of name =&gt; value<br />
<code>children</code> &#8211; an array of child elements<br />
<code>data</code> – any character data within the element</p>
<p><code>find_tag($tagName)</code> &#8211; finds a descendant element with the specified tag name.  Returns false if none found.</p>
<div class="downloadbutton"><a href="http://www.chipstips.com/download/phpxmlparse.zip"><img src="http://www.chipstips.com/images/download.gif" alt="" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/q2HnHLp_Sbw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=353</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=353</feedburner:origLink></item>
		<item>
		<title>OPML Browser 2.0 for WordPress</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/xsShP-jPHRg/</link>
		<comments>http://www.chipstips.com/?p=272#comments</comments>
		<pubDate>Mon, 11 May 2009 23:38:37 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ATOM]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[phpopmlbrowse]]></category>
		<category><![CDATA[phpopmlroll]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=272</guid>
		<description><![CDATA[Yes, this is such a major upgrade to my OPML Browser plugin for WordPress that it warrants bumping the initial digit in the version number.  Here’s what changed: The plugin now expects to be installed in its own folder: (siteurl)/wp-content/plugins/opml-browser JavaScript and CSS have been separated into their own files. JavaScript events are now hooked [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=272"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=272" data-text="OPML Browser 2.0 for WordPress" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D272&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=272";
			reddit_title = "OPML Browser 2.0 for WordPress";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=272";</script>
		<script type="text/javascript">var dzone_title = "OPML Browser 2.0 for WordPress";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p><img style="margin: 0px 10px 0px 0px; display: inline" src="http://www.chipstips.com/wp-content/images/opml.jpg" alt="" width="31" height="31" align="left" /> Yes, this is such a major upgrade to my OPML Browser plugin for WordPress that it warrants bumping the initial digit in the version number.  Here’s what changed:</p>
<ol>
<li>The plugin now expects to be installed in its own folder: (siteurl)/wp-content/plugins/opml-browser</li>
<li>JavaScript and CSS have been separated into their own files.</li>
<li>JavaScript events are now hooked on window load instead of in the HTML.</li>
<li>Added &#8220;alt&#8221; attribute to all &#8220;img&#8221; tags.</li>
<li>Images are now looked for in (siteurl)/wp-content/plugins/opml-browser/images</li>
<li>If an image cannot be found, it will be replaced by the supplied unknown.png (a question mark).</li>
<li>Added &#8220;Sort items?&#8221; option.  This sorts within categories, unless the “flatten” option is enabled (see next item).</li>
<li>Added the &#8220;Flatten hierarchy?&#8221; option.  This combines all items into one level.  If sorting, all items get sorted together.</li>
<li>The OPML description attribute is now displayed as a tooltip (as in the OPML Blogroll widget, but it also works in IE and Opera now!).</li>
</ol>
<p>As far as I know, the OPML Browser can now do everything that the <a href="http://chipstips.com/?tag=phpopmlroll">OPML Blogroll widget</a> could do (items 7 through 9 filled that out), so I am herewith declaring the OPML Blogroll widget retired from further upgrades.  Please use this plugin’s widget instead from now on.  Let me know if I’ve forgotten any functionality that you need.</p>
<p>A big “thank you” to all of my users who requested various features and reported bugs.  This plugin would not be what it is today without your input. </p>
<div class="downloadbutton"><a href="http://www.chipstips.com/download/phpopmlbrowse20.zip"><img src="http://www.chipstips.com/images/download.gif" alt="" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/xsShP-jPHRg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=272</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=272</feedburner:origLink></item>
		<item>
		<title>OPML Blogroll widget 1.3 for WordPress adds tooltips</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/ZMiNrXCCtuc/</link>
		<comments>http://www.chipstips.com/?p=182#comments</comments>
		<pubDate>Thu, 17 Apr 2008 20:47:33 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[addingajax]]></category>
		<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[phpopmlroll]]></category>
		<category><![CDATA[phpopmlroll13]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[shelleypowers]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=182</guid>
		<description><![CDATA[Thanks to a suggestion from Diego, I have added tooltips to each entry in the OPML Blogroll widget for WordPress.  These tooltips display the content of the &#8220;description&#8221; attribute of each outline entry, if one exists, when the user hovers the mouse over the entry. Note that this is not an update to the OPML [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=182"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=182" data-text="OPML Blogroll widget 1.3 for WordPress adds tooltips" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D182&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=182";
			reddit_title = "OPML Blogroll widget 1.3 for WordPress adds tooltips";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=182";</script>
		<script type="text/javascript">var dzone_title = "OPML Blogroll widget 1.3 for WordPress adds tooltips";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://chipstips.com/wp-content/images/cb20502a2268_B6BD/image03.png" border="0" alt="" width="395" height="220" /></p>
<p>Thanks to a <a href="http://www.chipstips.com/?p=159#comment-30471">suggestion</a> from <a href="http://www.profesorblog.com/">Diego</a>, I have added tooltips to each entry in the OPML Blogroll widget for WordPress.  These tooltips display the content of the &#8220;description&#8221; attribute of each outline entry, if one exists, when the user hovers the mouse over the entry.</p>
<p>Note that this is <em>not </em>an update to the <a href="http://chipstips.com/?tag=phpopmlbrowse">OPML Browser plugin</a>, although I plan to add the same feature to that plugin as well (along with a ton of other enhancements).</p>
<p>I used JavaScript to pop up and remove the Tooltips.  I decided to roll my own (with much help from Shelley Powers&#8217; book <a href="http://www.amazon.com/dp/0596529368?tag=chipsquips-20&amp;camp=0&amp;creative=0&amp;linkCode=as1&amp;creativeASIN=0596529368&amp;adid=0A4T0EQMT4C59FH7D955&amp;">Adding Ajax</a>) rather than use an existing library, in order to keep the widget lean and to avoid conflicts with other libraries that might be in use on your blog.</p>
<p>Thanks to Internet Explorer, this seemingly simple enhancement required about twice as much JavaScript code as as a Firefox/Opera/Safari-only version would have.  Here are the differences that required special code for IE:</p>
<ol>
<li>Of course, events don&#8217;t get passed to event handlers.  So you use window.event.  No big deal.</li>
<li>And we all know about addEventListener vs. attachEvent.  Not a problem, just wrap it in a function.</li>
<li>If you attach a property to a DOM object, lose the reference, and then reacquire that same element from the DOM later, it doesn&#8217;t have the property you added any more.  Apparently IE gives you a new object each time.  So in IE, this plugin has to look up the tooltip for the current item every time it wants to be displayed.</li>
<li>Not having the &#8220;currentTarget&#8221; property on the Event object in IE really sucks.  <a href="http://alex.dojotoolkit.org/?p=536">You can use &#8220;srcElement&#8221;</a>, but it isn&#8217;t the same element as &#8220;currentTarget&#8221;.  For instance, if you have a &#8220;mouseover&#8221; event on an element that contains a link around an image, &#8220;currentTarget&#8221; gives you the element on which the event was specified, whereas srcElement will give you whatever contained element the mouse was actually over.  So this plugin accesses parentNode until it finds the one that&#8217;s meaningful.</li>
</ol>
<p>Another nice &#8220;feature&#8221; of Internet Explorer keeps the tooltips from displaying at all in my theme &#8211; perhaps due to the use of float on nearby div&#8217;s.  I tried <a href="http://www.brunildo.org/test/IE_raf3.html">the fix outlined here</a> to no avail.  It does work using the WordPress default theme, though, so there is hope.  Let me know how it works with your theme.</p>
<p>I also fixed a problem with the auto-discovery link in which the ending quote on the href was missing. <img src='http://www.chipstips.com/wp-includes/images/smilies/icon_redface.gif' alt=':oops:' class='wp-smiley' /> </p>
<p>Linking to <a href="http://www.chipstips.com/?p=159">earlier</a> <a href="http://www.chipstips.com/?p=150">versions</a> for <a href="http://www.chipstips.com/?p=134">pingback</a>.</p>
<p>UPDATE: 2009-05-11: I have incorporated all the features of this widget into my <a href="http://www.chipstips.com/?p=272">OPML Browser plugin version 2.0</a>.  Please upgrade (it&#8217;s free). </p>
<p> </p>
<p> </p>
<div class="downloadbutton"><a href="http://www.chipstips.com/download/phpopmlroll13.zip"><img src="http://www.chipstips.com/images/download.gif" alt="" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/ZMiNrXCCtuc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=182</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=182</feedburner:origLink></item>
		<item>
		<title>More OPML Browser corrections</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/vqcEH3PwRiA/</link>
		<comments>http://www.chipstips.com/?p=171#comments</comments>
		<pubDate>Wed, 26 Sep 2007 21:19:04 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[phpopmlbrowse]]></category>
		<category><![CDATA[phpopmlbrowse13]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[shackdougall]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=171</guid>
		<description><![CDATA[Shack Dougall spotted several HTML coding errors in the latest verion of my OPML Browser plugin.&#160; Get the version 1.3 below. Pingbacks to previous posts.]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=171"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=171" data-text="More OPML Browser corrections" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D171&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=171";
			reddit_title = "More OPML Browser corrections";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=171";</script>
		<script type="text/javascript">var dzone_title = "More OPML Browser corrections";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p><a href="http://liferain.com/">Shack Dougall</a> spotted <a href="http://www.chipstips.com/?p=169#comments">several HTML coding errors</a> in the latest verion of my OPML Browser plugin.&nbsp; Get the version 1.3 below.</p>
<p><a href="http://chipstips.com/?p=169">Pingbacks</a> <a href="http://chipstips.com/?p=162">to</a> <a href="http://chipstips.com/?p=161">previous</a> <a href="http://chipstips.com/?p=159">posts</a>.</p>
<p><a href="http://www.chipstips.com/download/phpopmlbrowse13.zip"><img src="http://www.chipstips.com/images/download.gif"></a></p>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/vqcEH3PwRiA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=171</wfw:commentRss>
		<slash:comments>25</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=171</feedburner:origLink></item>
		<item>
		<title>OPML browsing just got better</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/kX_GJDW_kBo/</link>
		<comments>http://www.chipstips.com/?p=169#comments</comments>
		<pubDate>Sat, 22 Sep 2007 21:21:03 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Wildly popular]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[feeddemon]]></category>
		<category><![CDATA[markbarnes]]></category>
		<category><![CDATA[phpopmlbrowse]]></category>
		<category><![CDATA[phpopmlbrowse12]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[tdavid]]></category>
		<category><![CDATA[tonylindskog]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=169</guid>
		<description><![CDATA[Version 1.2 of the OPML Browser plugin for WordPress has just been released!  This version includes some significant upgrades, including: You may now have up to 9 opml-browser widgets. When upgrading, the options from your existing opml-browser widget are copied to the first opml-browser widget.  Thanks to Mark Barnes for suggesting this enhancement. The option [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=169"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=169" data-text="OPML browsing just got better" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D169&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=169";
			reddit_title = "OPML browsing just got better";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=169";</script>
		<script type="text/javascript">var dzone_title = "OPML browsing just got better";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>Version 1.2 of the OPML Browser plugin for WordPress has just been released!  This version includes some significant upgrades, including:</p>
<ol>
<li>You may now have up to 9 opml-browser widgets. When upgrading, the options from your existing opml-browser widget are copied to the first opml-browser widget.  Thanks to <a href="http://www.4-14.org.uk/">Mark Barnes</a> for <a href="http://www.chipstips.com/?p=159#comment-12363">suggesting</a> this enhancement.</li>
<li>The option to exclude your domain now ignores differences in case when comparing domain names.  Thanks to <a href="http://www.wpviews.info/">Tony Lindskog</a> for <a href="http://www.chipstips.com/?p=162#comment-14795">finding</a> that one.</li>
<li>You can now override the title for the OPML link by entering text into the &#8220;OPML title override&#8221; field.  I didn&#8217;t want mine to read &#8220;FeedDemon Subscriptions&#8221;, so I added that for myself.</li>
<li>Added the ability to embed the browser within a page or post using a special [ opml-browser ] element in the text.  See the readme.</li>
<li>Added a &#8220;Get this widget&#8221; link at the bottom of the widget.  Thanks to <a href="http://makeyougohmm.com">TDavid</a> for suggesting that little bit of self-promotion.</li>
</ol>
<p>Download version 1.2 via the button below.  Pinging <a href="http://www.chipstips.com/?p=134">back</a> <a href="http://www.chipstips.com/?p=150">to</a> <a href="http://www.chipstips.com/?p=159">all</a> <a href="http://www.chipstips.com/?p=161">previous</a> <a href="http://www.chipstips.com/?p=162">posts</a> for those following comments.</p>
<p>UPDATE: More corrections <a href="http://www.chipstips.com/?p=171">here</a>.</p>
<div class="downloadbutton"><a href="http://www.chipstips.com/download/phpopmlbrowse12.zip"><img src="http://www.chipstips.com/images/download.gif" alt="" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/kX_GJDW_kBo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=169</wfw:commentRss>
		<slash:comments>22</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=169</feedburner:origLink></item>
		<item>
		<title>OPML Browser with class</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/8KpjEQA9Cro/</link>
		<comments>http://www.chipstips.com/?p=162#comments</comments>
		<pubDate>Fri, 30 Mar 2007 23:52:28 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Wildly popular]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[phpopmlbrowse]]></category>
		<category><![CDATA[widgets]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=162</guid>
		<description><![CDATA[Well, the OPML Browser plugin for WordPress has only been released for two days and already we&#8217;re up to version 1.1. Hopefully this one will last a while longer. I added a new feature: start with all folders closed. Selecting this option will display the browser with all categories collapsed initially, unless the browser doesn&#8217;t [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=162"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=162" data-text="OPML Browser with class" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D162&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=162";
			reddit_title = "OPML Browser with class";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=162";</script>
		<script type="text/javascript">var dzone_title = "OPML Browser with class";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>Well, the <a href="http://www.chipstips.com/?p=161">OPML Browser plugin</a> for WordPress has only been released for two days and already we&#8217;re up to version 1.1. Hopefully this one will last a while longer.</p>
<p>I added a new feature: start with all folders closed. Selecting this option will display the browser with all categories collapsed initially, unless the browser doesn&#8217;t support Javascript (otherwise the user wouldn&#8217;t be able to open them!).</p>
<p>I also completely reworked the code, using a class for the rendering engine. That allowed me to eliminate all global variables (almost always a good thing) and reduce the number of parameters being passed around.  I still say <a href="http://sob.apotheon.org/?p=224">PHP&#8217;s object syntax sucks</a>, but it&#8217;s a good bit better than what I had before.</p>
<p>I even added some comments.</p>
<p>Let me know how you like it.</p>
<p><strong>UPDATE</strong>:  Get the latest version <a href="http://www.chipstips.com/?p=169">here</a>.</p>
<div class="downloadbutton"><a href="http://www.chipstips.com/download/phpopmlbrowse11.zip"><img src="http://www.chipstips.com/images/download.gif" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/8KpjEQA9Cro" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=162</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=162</feedburner:origLink></item>
		<item>
		<title>New OPML browser plugin for WordPress</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/kHFDrkTdCZU/</link>
		<comments>http://www.chipstips.com/?p=161#comments</comments>
		<pubDate>Thu, 29 Mar 2007 00:39:54 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Wildly popular]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[phpopmlbrowse]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=161</guid>
		<description><![CDATA[Since I first released the OPML Blogroll widget, I&#8217;ve received numerous suggestions for enhancements. One that keeps coming up is the ability to show the hierarchy within the OPML file &#8212; categories, if you will. Because of the way the original widget parses and displays the outline, this request was incompatible with the existing code. [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=161"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=161" data-text="New OPML browser plugin for WordPress" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D161&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=161";
			reddit_title = "New OPML browser plugin for WordPress";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=161";</script>
		<script type="text/javascript">var dzone_title = "New OPML browser plugin for WordPress";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>Since I first released the <a href="http://chipstips.com/?tag=phpopmlroll">OPML Blogroll widget</a>, I&#8217;ve received numerous suggestions for enhancements.  One that keeps coming up is the ability to show the hierarchy within the OPML file &#8212; categories, if you will.</p>
<p>Because of the way the original widget parses and displays the outline, this request was incompatible with the existing code.  So I developed a new widget/plugin that does keep the hierarchy intact, and you can download it below.  It also uses javascript to expand/collapse categories when the associated folder icon is clicked.</p>
<p>The code also includes an API for displaying an OPML browser within PHP code, so you don&#8217;t have to use the widget if your theme is not widget-compatible, or you want to display the browser somewhere else.</p>
<p>See the opml-browser-readme.txt file included in the download for full documentation and tips on how you can control the display through CSS styling to achieve some of the other suggested enhancements &#8212; such as scrolling within a limited height, bolding the categories, and removing the ability to expand/collapse categories.</p>
<p>There&#8217;s still one thing I haven&#8217;t figured out how to do, though.  If the text of an item wraps, it wraps beneath the feed icon to the left.  I&#8217;d like to be able to make it line up with the first line of text, but I&#8217;m not enough of a CSS wizard to manage that yet.  Any suggestions?</p>
<p>UPDATE: Corrected a missing end-quote error in the autodiscovery link at 14:02 3-29-07</p>
<p>UPDATE: Get the latest version <a href="http://www.chipstips.com/?p=169">here</a>.</p>
<div class="downloadbutton"><a href="http://www.chipstips.com/download/phpopmlbrowse.zip"><img src="http://www.chipstips.com/images/download.gif" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/kHFDrkTdCZU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=161</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=161</feedburner:origLink></item>
		<item>
		<title>OPML Blogroll widget update 1.2</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/0o1XEUlKx04/</link>
		<comments>http://www.chipstips.com/?p=159#comments</comments>
		<pubDate>Sun, 04 Mar 2007 23:09:57 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Wildly popular]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[phpopmlroll]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=159</guid>
		<description><![CDATA[Sorry Paul, this isn&#8217;t the big update you&#8217;re waiting for &#8212; just a few loose screws that needed tightening up. After upgrading to WordPress 2.1, I noticed that the RSS icons in my OPML blogroll widget disappeared. I was using an image that is no longer distributed in the same location, so I put a [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=159"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=159" data-text="OPML Blogroll widget update 1.2" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D159&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=159";
			reddit_title = "OPML Blogroll widget update 1.2";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=159";</script>
		<script type="text/javascript">var dzone_title = "OPML Blogroll widget update 1.2";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p><img height="128" alt="" hspace="10" src="/wp-content/images/opml.jpg" width="128" align="left" />Sorry <a href="http://www.contentquake.com/">Paul</a>, this isn&#8217;t the <em>big</em> <a href="http://www.chipstips.com/?p=134#comment-1444">update</a> you&#8217;re waiting for &#8212; just a few loose screws that needed tightening up.</p>
<p>After upgrading to WordPress 2.1, I noticed that the RSS icons in my <a href="http://www.chipstips.com/?p=150">OPML blogroll widget</a> disappeared.  I was using an image that is no longer distributed in the same location, so I put a copy of rss.png in the wp-content/widgets/images directory.</p>
<p>Taking a look at how I was referencing images, I realized that it also wouldn&#8217;t work if your blog was not in the root folder of your domain.  So I added a call to get_settings(&#8216;siteurl&#8217;) to fix that up.</p>
<p>Last month I nearly ran out of bandwidth on <a href="http://www.chipsquips.com/?p=769">Chip&#8217;s Quips</a>, and after analyzing the requests I found that nearly half of the bandwidth for the month was consumed by requests for my OPML file.  In my case, the OPML file resides on the same server as my site, so there&#8217;s no need to request it over HTTP.  I added a &#8220;Local path&#8221; option to the widget which, if specified, will open the file locally.</p>
<p>So now of course the &#8220;OPML URL&#8221; option is no longer required.  If you leave that empty, then the auto-discovery link will be suppressed.  It doesn&#8217;t make much sense to auto-discover a link on the local file system.</p>
<p>I also discovered that WordPress&#8217;s cache support in wp-includes/cache.php ignores the $expire parameter that you can pass when adding or setting cache data.  This has not been fixed in WordPress 2.1 either.  I&#8217;ll have to come up with a better solution so the OPML file doesn&#8217;t get banged every fifteen minutes, whether or not it&#8217;s on a local drive.  But we&#8217;ll leave that for the next revision.</p>
<p>UPDATE (3/29/07): <a href="http://www.wpviews.info/">Tony Lindskog</a> found a bug where a feed that has no &#8220;text&#8221; attribute caused a regular expression parsing error, and <a href="http://contentquake.com/">Paul McGillivary</a> found a missing end-quote in the auto-discovery link.  I&#8217;ve included fixes for those as well.</p>
<p>UPDATE (3/29/07): For an OPML plugin that preserves the hierarchy within the OPML file (categories, usually) and lets you expand/collapse that hierarchy, <a href="http://www.chipstips.com/?p=161">go here</a>.</p>
<p>UPDATE (4/17/08): The latest version of this plugin can be found <a href="http://www.chipstips.com/?p=182">here</a>.</p>
</p>
<div class="downloadbutton"><a href="http://www.chipstips.com/download/phpopmlroll12.zip"><img src="http://www.chipstips.com/images/download.gif" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/0o1XEUlKx04" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=159</wfw:commentRss>
		<slash:comments>31</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=159</feedburner:origLink></item>
		<item>
		<title>The right way to redirect a WordPress 2.0 feed through FeedBurner</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/9W6ZqA5zcJQ/</link>
		<comments>http://www.chipstips.com/?p=158#comments</comments>
		<pubDate>Tue, 06 Feb 2007 20:07:08 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[ATOM]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Wildly popular]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[randymorin]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=158</guid>
		<description><![CDATA[UPDATE: WordPress 2.2 stuffs this approach. But fear not, there is yet a far, far better way of doing this. Download and activate the FeedBurner FeedSmith plugin &#8211; it&#8217;s automagic! For a while now I&#8217;ve been redirecting my WordPress feeds through FeedBurner using a content pumping hack. That approach has the advantage of maintaining the standard feed [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=158"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=158" data-text="The right way to redirect a WordPress 2.0 feed through FeedBurner" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D158&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=158";
			reddit_title = "The right way to redirect a WordPress 2.0 feed through FeedBurner";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=158";</script>
		<script type="text/javascript">var dzone_title = "The right way to redirect a WordPress 2.0 feed through FeedBurner";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>UPDATE: WordPress 2.2 stuffs this approach. But fear not, there is yet a far, far better way of doing this. Download and activate the <a href="http://www.google.com/support/feedburner/bin/answer.py?hl=en&amp;answer=78483">FeedBurner FeedSmith plugin</a> &#8211; it&#8217;s automagic!</p>
<p>For a while now I&#8217;ve been redirecting my WordPress feeds through <a href="http://feedburner.com">FeedBurner</a> using a <a href="http://www.chipstips.com/?p=132">content pumping hack</a>. That approach has the advantage of maintaining the standard feed URLs for WordPress, but it does place a little more burden on my server. After changing servers, I discovered another disadvantage: for some reason FeedBurner suddenly stopped distinguishing individual visitors. I&#8217;m guessing it&#8217;s a change to the way fopen works on a URL between versions of PHP.</p>
<p>Then yesterday, <a href="http://www.kbcafe.com/iBLOGthere4iM">Randy</a> invited me to join the <a href="http://networks.feedburner.com/KBCafe">KBCafe FeedBurner network</a>. While doing so, I also decided to join the FeedBurner Ad Network. Somehow, I don&#8217;t think feed advertisers would be exactly chomping at the bit to place ads in a feed with only four subscribers, three of them bots. Time to fix this.</p>
<p><strong>The right way</strong></p>
<p>Instead of regurgitating content, you can just return a header to redirect the client. If you haven&#8217;t already, rename wp-rss2.php in your root directory to wp-rss2-fb.php. Burn a feed in FeedBurner, using that page as the feed source. Now create a new wp-rss2.php that contains only:</p>
<p><code>&lt;?php<br />
header( 'Location: http://feeds.feedburner.com/ChipsTips');<br />
?&gt;</code></p>
<p>Replace &#8220;ChipsTips&#8221; in the URL with your FeedBurner feed name. This performs a temporary redirect, so your feed&#8217;s URL remains the same in all clients, they just always get redirected to FeedBurner. If you want to save yourself some traffic, you can use a permanent redirect instead:</p>
<p><code>&lt;?php<br />
header( 'Location: http://feeds.feedburner.com/ChipsTips', TRUE, 301);<br />
?&gt;</code></p>
<p>The 301 response code directs the client to permanently change the URL for this resource, which loses the advantage of keeping the standard WordPress URL. What if you decide to leave FeedBurner? Won&#8217;t you lose all your subscribers? Well, it turns out that FeedBurner will return the favor and permanently redirect your feed for 30 days if you unsubscribe. <a href="http://www.kbcafe.com/rss">Randy</a> says he&#8217;s tested it. So I decided to permanently redirect, hoping to improve throughput for both my feeds and my sites.</p>
<p>Next, make the same change to your ATOM (wp-atom.php), RSS 0.92 (wp-rss.php) and RDF 1.0 (wp-rdf.php) feeds. I decided to redirect all of these to my RSS 2.0 feed in FeedBurner, and then use FeedBurner&#8217;s SmartFeed service to convert to other formats as needed. That allows me to aggregate my FeedBurner stats.</p>
<p>And speaking of stats, after FeedBurner had a chance to collect them correctly for a day, I found that even before my move it had failed to disambiguate quite a few subscribers. I have more than twice as many subs as I had thought! Thanks to all of you!</p>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/9W6ZqA5zcJQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=158</wfw:commentRss>
		<slash:comments>32</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=158</feedburner:origLink></item>
		<item>
		<title>New and improved WordPress OPML Blogroll widget</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/X6XQGhVLBB8/</link>
		<comments>http://www.chipstips.com/?p=150#comments</comments>
		<pubDate>Mon, 09 Oct 2006 19:50:50 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Wildly popular]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[phpopmlroll]]></category>
		<category><![CDATA[phpopmlroll11]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=150</guid>
		<description><![CDATA[Thanks to some suggestions from Sergio Longoni, this morning I whipped up version 1.1 of the opml-blogroll widget for WordPress. New features include: OPML auto-discovery link tag added to the &#8220;head&#8221; section of your page automatically (Sergio provided the code). You can suppress the OPML image and link by unchecking a new option &#8220;Link to [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=150"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=150" data-text="New and improved WordPress OPML Blogroll widget" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D150&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=150";
			reddit_title = "New and improved WordPress OPML Blogroll widget";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=150";</script>
		<script type="text/javascript">var dzone_title = "New and improved WordPress OPML Blogroll widget";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>Thanks to some suggestions from <a href="http://kromeblog.kromeboy.net">Sergio Longoni</a>, this morning I whipped up version 1.1 of the <a href="http://www.chipstips.com/?p=134">opml-blogroll widget</a> for <a href="http://wordpress.org">WordPress</a>.</p>
<p>New features include:</p>
<ul>
<li>OPML auto-discovery link tag added to the &#8220;head&#8221; section of your page automatically (Sergio provided the code).</li>
<li>You can suppress the OPML image and link by unchecking a new option &#8220;Link to OPML?&#8221; which is checked by default when upgrading.</li>
<li>If you keep the OPML link, I&#8217;ve added the new semi-standard <a href="http://www.opmlicons.com/">OPML icon</a>.</li>
<li>Closed the &#8220;img&#8221; tag for the RSS icons for XHTML compliance (oops).</li>
</ul>
<p>Suggestions for future enhancements:</p>
<ul>
<li>Sergio suggested adding more control over how items are displayed.  For instance, he would prefer &#8220;li&#8221; tags instead of a table.  I&#8217;m going to give that some thought, but perhaps I could include options for prolog, epilog, pre-item, post-item, etc. and let you control the HTML.</li>
<li>The <a href="http://dead20.com">Dead 2.0 skeptic</a> (who appears to have been hammered out of the blogosphere by the traffic surge incumbent upon his identity intrigue) suggested a while ago that I add some form of paging, so that only the first N items would be displayed unless the user took some action.</li>
</ul>
<p>What do you think of these suggestions?  Got any more?</p>
<p>UPDATE: Latest version <a href="http://www.chipstips.com/?p=182">here</a>.</p>
<div><a href="http://www.chipstips.com/download/phpopmlroll11.zip"><img src="http://www.chipstips.com/images/download.gif" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/X6XQGhVLBB8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=150</wfw:commentRss>
		<slash:comments>25</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=150</feedburner:origLink></item>
		<item>
		<title>Extreme makeover for Chip’s Tips!</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/VDtvdx42KAM/</link>
		<comments>http://www.chipstips.com/?p=145#comments</comments>
		<pubDate>Wed, 05 Jul 2006 00:19:35 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSLT]]></category>
		<category><![CDATA[apotheon]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[ccdcopywrite]]></category>
		<category><![CDATA[chicklet]]></category>
		<category><![CDATA[chipsquips]]></category>
		<category><![CDATA[chipstips]]></category>
		<category><![CDATA[creativecommons]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[feedpass]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[importer]]></category>
		<category><![CDATA[randymorin]]></category>
		<category><![CDATA[redirect]]></category>
		<category><![CDATA[reeferss]]></category>
		<category><![CDATA[rmail]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[stevenhargrove]]></category>
		<category><![CDATA[tagging]]></category>
		<category><![CDATA[technorati]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/?p=145</guid>
		<description><![CDATA[In case you didn&#8217;t notice, I&#8217;ve converted Chip&#8217;s Tips into a WordPress blog. How do you like the new look? I started Chip&#8217;s Tips back in 2001, before most people had ever heard of blogs. Yet, that&#8217;s more or less what it was from the start. I created my own XML grammar for outlining the [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=145"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=145" data-text="Extreme makeover for Chip&#8217;s Tips!" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D145&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=145";
			reddit_title = "Extreme makeover for Chip&#8217;s Tips!";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=145";</script>
		<script type="text/javascript">var dzone_title = "Extreme makeover for Chip&#8217;s Tips!";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>In case you didn&#8217;t notice, I&#8217;ve converted <a href="http://www.chipstips.com">Chip&#8217;s Tips</a> into a <a href="http://wordpress.org">WordPress</a> blog. How do you like the new look?</p>
<p>I started Chip&#8217;s Tips back in 2001, before most people had ever heard of blogs. Yet, that&#8217;s more or less what it was from the start. I created my own XML grammar for outlining the topics, and another grammar for the posts themselves. Then I wrote Active Server Pages (ASP) to transform those XML documents into HTML pages using XSLT. It was my first project in both ASP and XSLT, and it worked quite well.</p>
<p>Lately, though, it&#8217;s been showing its age. ASP (not ASP.NET) is now an <em>old</em> technology. Blogs have evolved rapidly, and I wanted to be able to easily implement several key features:</p>
<ol>
<li>An <a href="http://www.chipstips.com/?feed=rss2">RSS feed</a> for the posts</li>
<li>Comments and trackback/pingback</li>
<li>Tagging and multiple categories per post</li>
</ol>
<p>Besides, my process for posting was less than smooth. I would copy an existing XML document for a post, modify its content, add an entry for it in the outline XML file, then upload both of those plus any download file. Often I would create unmatched tags in the body of the topic file so the XML parser would fail. Count on at least fifteen minutes of fiddling in addition to however long it took me to write a post. With a blog, all of that is automagic.</p>
<p>So, how did I migrate?</p>
<p>First, I needed a content migration strategy. I wrote a PHP script to read the existing outline and topic XML files and generate an RSS feed. That way, I could use WordPress&#8217; RSS importer to pull the content.</p>
<p>Second, I set up the WordPress site and tweaked the theme I was using for <a href="http://www.chipsquips.com">Chip&#8217;s Quips</a> to work here. Different color scheme, some new pages, etc. Add the <a href="https://www.google.com/adsense/">Google ads and search</a>, and the scripts for <a href="http://technorati.com">Technorati</a> and ReefeRSS.</p>
<p>Third, I applied <a href="http://www.chipstips.com/?p=132">the same hack</a> I used on Chip&#8217;s Quips to redirect the feeds, and burned the feeds at FeedBurner. Then I setup landing pages at <a href="http://www.feedpass.com">FeedPass</a>. Added the subscribe links along with the <a href="http://www.kbcafe.com/rss/chicklet.aspx">Chicklet generator</a> and <a href="http://www.r-mail.org/">R-mail widget</a> to the sidebar.</p>
<p>The hardest part was setting up all of the new categories (I wanted to reshuffle those) and tag all of the existing posts. I also included one unique tag per post that matched the original mnemonic from the old system.</p>
<p>Next, I modified showtopic.asp to permanently redirect to a tag search for the mnemonic requested, so any existing external topic links will be unbroken. Thanks to <a href="http://www.stevenhargrove.com/redirect-web-pages/">Steven Hargrove</a> for providing the most excellent way to do this in ASP, as well as just about any other web language).  Then I redirected default.asp to the <a href="http://www.chipstips.com">main page</a>, chip.asp to the &#8220;<a href="http://www.chipstips.com/?page_id=2">About</a>&#8221; page, and resources.asp to the &#8220;<a href="http://www.chipstips.com/?page_id=141">Resources</a>&#8221; page. I&#8217;m leaving topics.asp alone, because attempting to map from the old categories to the new proved too daunting. So, any external links to a general topic will still show the old outline page, but clicking on a link to a topic there will take you to the corresponding page on the new site.</p>
<p>Last but not least, I converted licensing to the <a href="http://ccd.apotheon.org/">CCD CopyWrite license</a>, which I have also adopted for Chip&#8217;s Quips. No big change there from <a href="http://creativecommons.org/">Creative Commons</a> Attribution &#8211; you&#8217;re free to copy and reuse this content to your heart&#8217;s content, provided you give appropriate credit to yours truly.</p>
<p>Enjoy, and please feel free to comment!</p>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/VDtvdx42KAM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=145</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=145</feedburner:origLink></item>
		<item>
		<title>OPML blogroll widget for WordPress</title>
		<link>http://feedproxy.google.com/~r/ChipsTipsXml/~3/5ugagfAaqss/</link>
		<comments>http://www.chipstips.com/?p=134#comments</comments>
		<pubDate>Wed, 14 Jun 2006 18:59:01 +0000</pubDate>
		<dc:creator>Sterling Camden</dc:creator>
				<category><![CDATA[OPML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wildly popular]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[feeddemon]]></category>
		<category><![CDATA[opmlmanager]]></category>
		<category><![CDATA[opmlworkstation]]></category>
		<category><![CDATA[phpopmlroll]]></category>
		<category><![CDATA[shareyouropml]]></category>
		<category><![CDATA[sidebar]]></category>
		<category><![CDATA[syo]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.chipstips.com/new/?p=134</guid>
		<description><![CDATA[I don&#8217;t know about you, but when Share Your OPML went live, my first thought was &#8220;Oh great, something else to keep updated!&#8221; It&#8217;s bad enough trying to keep my blogroll on my blog up to date with my subscriptions in my feed reader(s). Now there&#8217;s SYO to keep updated, too. Not to mention other [...]]]></description>
				<content:encoded><![CDATA[<div class="socialize-in-content socialize-in-content-right"><div class="socialize-in-button socialize-in-button-right"><g:plusone size="tall" href="http://www.chipstips.com/?p=134"></g:plusone></div><div class="socialize-in-button socialize-in-button-right"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.chipstips.com/?p=134" data-text="OPML blogroll widget for WordPress" data-count="vertical" data-via="socializeWP" ><!--Tweetter--></a></div><div class="socialize-in-button socialize-in-button-right"><iframe src="//www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.chipstips.com%2F%3Fp%3D134&amp;send=&amp;layout=box_count&amp;width=50&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px; height:65px;" allowTransparency="true"></iframe></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">
			<!-- 
			reddit_url = "http://www.chipstips.com/?p=134";
			reddit_title = "OPML blogroll widget for WordPress";	//-->
		</script><script type="text/javascript" src="http://www.reddit.com/static/button/button2.js"></script></div><div class="socialize-in-button socialize-in-button-right"><script type="text/javascript">var dzone_url = "http://www.chipstips.com/?p=134";</script>
		<script type="text/javascript">var dzone_title = "OPML blogroll widget for WordPress";</script>
		<script type="text/javascript">
			<!-- 
			var dzone_style = "1";
			//-->
		</script><script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"></script></div></div><p>I don&#8217;t know about you, but when <a href="http://share.opml.org">Share Your OPML</a> went live, my first thought was &#8220;Oh great, something else to keep updated!&#8221;  It&#8217;s bad enough trying to keep my blogroll on my blog up to date with my subscriptions in my feed reader(s).  Now there&#8217;s SYO to keep updated, too.  Not to mention other similar sites like <a href="http://www.opmlworkstation.com">OPML Workstation</a> and <a href="http://www.opmlmanager.com">OPML Manager</a>.</p>
<p>This little widget hopes to bring us some relief.  Rather than having to reload your blogroll or manually update it every time your subscriptions change, you can display your blogroll directly from a hosted OPML file.  So, you can keep your OPML at <a href="http://www.opmlworkstation.com">OPML Workstation</a> or <a href="http://www.opmlmanager.com">OPML Manager</a> (would be nice if SYO offered an external link as well), and just keep <strong>that</strong> up to date.  Or, you can host the OPML file on your own site and just hand the URL to <a href="http://share.opml.org">SYO</a>.  Either way, you only have to keep this file updated in one place.</p>
<p>For me, that means that when I add a subcription to my Favorite Feeds folder in <a href="http://www.feeddemon.com">FeedDemon</a>,  I&#8217;ll export my OPML and upload it to my site.  Done.</p>
<p>Installation and configuration instructions are included in the opml-blogroll-readme.txt file enclosed.</p>
<p>UPDATE:  Latest version <a href="http://chipstips.com/?p=182">here</a>.</p>
<div><a href="http://www.chipstips.com/download/phpopmlroll.zip"><img src="http://www.chipstips.com/images/download.gif" /></a></div>
<img src="http://feeds.feedburner.com/~r/ChipsTipsXml/~4/5ugagfAaqss" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.chipstips.com/?feed=rss2&amp;p=134</wfw:commentRss>
		<slash:comments>33</slash:comments>
		<feedburner:origLink>http://www.chipstips.com/?p=134</feedburner:origLink></item>
	</channel>
</rss>
