<?
$file 
"/path/to/Subscriptions.opml";




$folder 2;    #size of first level of folders (i.e. <h$folder>)
$bookmark false;

$open_tags = array(
    
'OPML' => '<OPML>',
    
'HEAD' => '<HEAD>',
    
'TITLE' => '<TITLE>',
    
'BODY' => '<BODY>',
    
'OUTLINE' => '<OUTLINE>',
);

$close_tags = array(
    
'OPML' => '</OPML>',
    
'HEAD' => '</HEAD>',
    
'TITLE' => '</TITLE>',
    
'BODY' => '</BODY>',
    
'OUTLINE' => '</OUTLINE>',
);


function 
startElement($parser$name$attrs)
{
    global 
$open_tags$current_tag$folder$bookmark;
    
$current_tag $name;
    switch(
$name)
    {
        case 
'OUTLINE':
            if (empty(
$attrs['XMLURL']))
            {    
#start of folder
                
$h min($folder,6);
?>
                <li class="header">
                 <h<?=$h?>><?=$attrs['TITLE']?></h<?=$h?>>
                 <ul>
<?                $folder++;
            }
            else
            {
                
$bookmark true;
                
$htmlurl htmlspecialchars($attrs['HTMLURL']);
                
$xmlurl htmlspecialchars($attrs['XMLURL']);
                
$title htmlspecialchars($attrs['TITLE']);
                
$descr htmlspecialchars(preg_replace(
                    
"/^{$attrs['TITLE']}:/",
                    
"",
                    
$attrs['DESCRIPTION']));
?>
                <li>
                 <a href="<?=$htmlurl?>"><?=$title?></a>
                 <span class="spaced">
                  [<a href="<?=$xmlurl?>"><?=$attrs['TYPE']?></a>]
                 </span>
                
<?                if (!empty($descr))
                    print 
"<div class=\"descr\">$descr</div>\n";
                
            }
            break;
        default:
            break;
    }
}

function 
endElement($parser$name)
{
    global 
$close_tags$current_tag$folder$bookmark;
    
    switch(
$name)
    {
        case 
"OUTLINE";
            if (
$bookmark)
                print 
"</li>\n";
            else
            {
                
$folder--;
                print 
"</ul>\n</li>\n";
            }
            break;
        default:
            break;
    }
    
$bookmark false;

}



$xml_parser xml_parser_create($type);
xml_parser_set_option($xml_parserXML_OPTION_CASE_FOLDINGtrue);
xml_parser_set_option($xml_parserXML_OPTION_TARGET_ENCODING'UTF-8');

xml_set_element_handler($xml_parser"startElement""endElement");
xml_set_character_data_handler($xml_parser"characterData");
$fp fopen($file"r") or die("could not open XML input " $file);


print 
"<br /><br />updated: "date("d M Y  h:m:s T",filemtime($file));

print 
"\n\n<ul class=\"blogroll\">\n";
while (
$data fread($fp4096))
{
    
xml_parse($xml_parser$datafeof($fp)) or 
        die (
sprintf("XML error: %s at line %d",
            
xml_error_string(xml_get_error_code($xml_parser)),
            
xml_get_current_line_number($xml_parser)));
    
}
xml_parser_free($xml_parser);

print 
"</ul>";
?>