#!/usr/bin/perl -w
#
# opml2mdwn.pl 
#
# This script evolved from:
#
# opml2html.pl, (c) Jeremy Zawodny -- http://jerermy.zawodny.com/blog/
#
# You may distribute this code freely.  It's not rocket science.
#
# Given an OPML file on stdin, produces an MDWN - Output of the Feedlist.
#
# Usage: opml2html.pl < foo.opml > bar.mdwn
#

use strict;      # ---- barfs out *grrr

use warnings;
use XML::Simple;
use XML::OPML;
use Data::Dumper;
use HTML::Entities;

my $xml;

{
    local($/) = undef;
    $xml = <>;
}

my $info = XML::Simple::XMLin($xml,KeyAttr=>"outline",ForceArray=>1);

print "# Feedlist \n\n\n\n";

?MyIterate($info->{body}[0]->{outline},0,5);
	
sub ?MyIterate
	{
	my $obj=shift;
	my $depth=shift;
	my $maxlevel=shift;
	
	if ( $maxlevel < 0) {return}

	my $path="";
	if ($depth>0) 
		{
		for (my $i=0; $i<$depth;$i++)
			{
			$path.=" ";
			}
		}

	for my $o (@{$obj})
		{
		my $title = $o->{title};
		my $h_url = $o->{htmlurl} || $o->{htmlUrl};
		my $x_url = $o->{xmlurl}  || $o->{xmlUrl};
		my $descr = encode_entities($o->{description});
	    print "\n";
	    if (
	    		("" ne $title)
	    	&&	("" ne $h_url)
	    	&&	("" ne $x_url)
	    	&&	("" ne $descr)
	    	)
	    	{
	    	print "$path* ";
			print "[\\[\\]]($h_url) $title [ (Feed) ]($x_url)";
			print "\n$descr\n" if ( $descr ne $title );
			} else {
			print "\n$title";
			}
		
		?MyIterate($o->{outline},$depth+1, $maxlevel-1);
		}
		
	}