<?
    
# A PHP/XSLT based RDFS Schema browser/explorer.

    # (c) 2003 Morten Frederiksen
    # License: http://www.gnu.org/licenses/gpl

    
$path=$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
    
$path=preg_replace('|\?.+|','',$path);
    
$rdfs2xhtml='rdfs-xhtml.xsl';
    
$metadata=join('',@file('rdfs.rdf'));
    
$xhtml='';
    
$schema='';

    
# Create XSLT parser.
    
$xslt=xslt_create();
    
xslt_set_error_handler($xslt,'xsltError');
    
$xslterror='';

    if (
preg_match('|^http:|',@$_GET['rdfs']))
    {
        
# Try to retrieve schema.
        
$rdfs=$_GET['rdfs'];
        
$rdfs=preg_replace('|#.+$|','#',$rdfs);
        
$schema=@file($rdfs);
        if (
$schema)
        {
            
# Extract RDF.
            
$schema=@join('',$schema);
            
# Try to convert to XHTML.
            
if (!($xhtml=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
                    array(
'/_xsl'=>join('',file($rdfs2xhtml)),'/_xml'=>$schema),
                    array(
'uri'=>$rdfs,'language'=>'en','embed'=>'true'))))
            {
                
# Try to extract inline RDF (assuming UTF-8, no external entities).
                
$schema=preg_replace('|^.*(<\w+:RDF.+</\w+:RDF>).*$|s','$1',$schema);
                if (!(
$xhtml=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
                        array(
'/_xsl'=>join('',file($rdfs2xhtml)),'/_xml'=>$schema),
                        array(
'uri'=>$rdfs,'language'=>'en','embed'=>'true'))))
                    
# Flag un-parsable RDF Schema.
                    
$xhtml='<h1>Error</h1><p>Unable to parse RDF Schema ('.$rdfs.').</p><p>'.$xslterror.'</p>';
            };
        }
        else
            
# Flag non-retrievable RDF Schema.
            
$xhtml='<h1>Error</h1><p>Unable to find or read RDF Schema ('.$rdfs.').</p>';
    }
    elseif (@
$_GET['rdfs']!='')
        
$xhtml='<h1>Error</h1><p>Invalid request ('.$_GET['rdfs'].'), only absolute HTTP URLs allowed.</p>';

    if (
$xhtml=='')
    {
        
# Create service form.
        
if (!($xhtml=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
                array(
'/_xsl'=>join('',@file('services-xhtml.xsl',1)),'/_xml'=>$metadata),
                array(
'path'=>$path))))
            
$xhtml='<p>Unable to parse metadata.</p><p>'.$xslterror.'</p>';
    };

    
# Transform metadata into header and footer.
    
if (!($metahead=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
            array(
'/_xsl'=>join('',@file('metahead.xsl',1)),'/_xml'=>$metadata))))
        
$metahead='<title>Parse error: '.$xslterror.'</title>';
    elseif (!(
$metatop=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
            array(
'/_xsl'=>join('',@file('metatop.xsl',1)),'/_xml'=>$metadata),
            array(
'path'=>$path,'uri'=>$rdfs))))
        
$metatop='<p>Unable to parse metadata.</p><p>'.$xslterror.'</p>';
    elseif (!(
$metafoot=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
            array(
'/_xsl'=>join('',@file('metafoot.xsl',1)),'/_xml'=>$metadata))))
        
$metafoot='<p>Unable to parse metadata.</p><p>'.$xslterror.'</p>';

    
# Display page.
    
print('<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
'
.$metahead.'
    <style type="text/css">
table.schema { width: 100% }
.schema h4 { margin: 0 }
.schema h3 { padding-top: 1em }
.schema th { text-align: left; vertical-align: top }
.schema td { vertical-align: top }
.schema .details th { text-align: right; font-size: 80%; font-style: italic; vertical-align: top }
.schema .details td { font-size: 80% }
.schema dl { margin: 0; padding: 0 }
.schema dt { margin: 0; padding: 0; font-style: italic }
.schema dd { margin: 0 1em; padding: 0 }
    </style>
</head>
<body>
'
.$metatop.'
  <div style="padding: 1em">
'
.$xhtml.'
  </div>
'
.$metafoot.'
</body>
<!--
'
.str_replace('--','- -',$schema).'
-->
</html>'
);

    function
xsltError($x,$e,$l,$f)
    {
        global
$xslterror;
        
$xslterror='Sablotron XSLT transformation error';
        
reset($f);
        while(list(
$key,$val)=each($f))
        {
            if (
$key=='line')
                
$xslterror.=' on line '.$val;
            if (
$key=='msg')
                
$xslterror.=': <strong>'.$val.'</strong>';
        };
        
$xslterror.='.';
    };

?>