<?php 
/** 
 * example3.php 
 * 
 * C.McKinnon 4 Feb 2011 
 * 
 * generate a clientside mage map as well as the graph 
 * the writer needs to provided a callback fn which takes 
 * the filename and function name as arguments 
 * and returns a URL 
 * The example below should return a link to the phpxref documentation 
 */ 
require_once("dotwriter.inc.php"); 
 
$basepath="http://example.com/phpxref/output/nav.html?my_project"; 
    // above will change depending on how phpxref is installed 
    // have a look at the URLs for your current phpxref for more details 
$project_basepath=$_SERVER["DOCUMENT_ROOT"]; 
    // this gets stripped from the file path - NB your document root might not 
    // match the base path for your phpxref project! 
 
$repdirs=parse_truncations(); 
    // this deals with 'include' files declared for phpxref 
 
print "<html>\n<body>\n"; 
if (count($_POST)) { 
    if (file_exists($_POST['file'])) { 
          show_graph(); 
    } else { 
        print "file not found (" . $_POST['file'] . ")\n"; 
    } 
} 
show_form(); 
print "\n</body>\n</html>\n"; 
register_shutdown_function('deltemps'); 
flush(); 
exit; 
 
/** 
 * this is the callback sent to the dotwriter 
 * 
 */ 
function callback($filename, $fn) 
{ 
    global $basepath, $repdirs, $project_basepath; 
    if (substr($filename, 0, strlen($project_basepath))==$project_basepath) { 
        $filename=substr($filename,strlen($project_basepath)); 
    } else { 
        foreach ($repdirs as $r) { 
        if (substr($filename, 0, strlen($r))==$r) { 
            $filename=substr($filename, strlen($r)); 
            break; 
        } 
        } 
    } 
    if (substr($fn, 0, 2)=='::') $fn=substr($fn,2); 
        // in phpxref, everythings a function! 
    return $basepath . $filename . '.html#' . $fn;     
} 
 
function parse_truncations() 
{ 
    // normally phpxref strips leading paths off files 
    // found on the include path... 
    $paths=explode(':', ini_get('include_path')); 
    foreach ($paths as $key=>$val) { 
        if ($val=='.') unset($paths[$key]); 
    } 
    return $paths; 
} 
 
function show_form() 
{ 
    print "<h2>Enter the path to a file to parse</h2>\n"; 
    print ' 
<form method="post" 
enctype="multipart/form-data"> 
Filename: 
<input type="text" name="file" id="file" /> 
<br /> 
<input type="submit" name="submit" value="Submit" /> 
</form>'; 
     
} 
 
function show_graph() 
{     
    global $imgname; 
    $c = new dotrunner(); 
    $tmpname=tempnam('./graphs','graph'); 
    $c->outputFileName=$tmpname . '.jpg'; 
    $imgname='graphs/' . basename($c->outputFileName); 
     
    $c->genGraph( 
        file_get_contents($_POST['file']),  
        $_POST['file'], 
        'callback'); // final (optional) param is callback fn 
            // its possible to specify an object + method too 
            // see the PHP manual for call_user_function                 
    if (file_exists($c->outputFileName)) { 
        print "<img src='" . $imgname . "' usemap='#" . $_POST['file'] . "'>\n"; 
        // the image map name is the same as the title sent to the dotrunner 
        print file_get_contents($imgname . '.cmapx'); 
        // and the image map is stored in a file with the same name 
        // as the output img - but with an extra suffix 
        @unlink($imgname . '.cmapx'); 
    } else { 
        print "erm.....something went wrong?"; 
    } 
    // tempnam creates a file without a suffix - that needs rm'd 
    @unlink($tmpname); 
    $c->cleanUp(); 
} 
 
function deltemps() 
{ 
    global $imgname; 
    sleep(5); // wait for browser to load image 
    if (file_exists($imgname)) { 
        $msg="trying to unlink $imgname"; 
        @unlink($imgname); 
    } else { 
        $msg="Not deleting anything"; 
    } 
    $o=fopen($imgname.'.log', 'w'); 
    if ($o) { 
        fputs($o, $msg); 
        fclose($o); 
    } 
} 
 
 |