Login   Register  
PHP Classes
elePHPant
Icontem

File: bin/example_directory_tree.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Stefan Löwe  >  Reingold Tilford  >  bin/example_directory_tree.php  >  Download  
File: bin/example_directory_tree.php
Role: Example script
Content type: text/plain
Description: example script that plots the directory structure of the installation
Class: Reingold Tilford
Render tree structures in several image formats
Author: By
Last change: made inclusion of bootstrap script more robust
Date: 2011-11-10 09:09
Size: 4,301 bytes
 

Contents

Class file image Download
<?php

/**
 * This example exports the directory structure of the installation folder of this package to HTML.
 *
 * Just direct your browser to this file.
 */

use Utils\Autoload\Autoloader;
use 
ReingoldTilford\Algorithms\ReingoldTilfordAlgorithm;
use 
ReingoldTilford\Models\FSTreeModel;
use 
ReingoldTilford\Plotters\Plotter;
use 
ReingoldTilford\Styles\TreeStyle;
use 
Utils\Graphics2D\DrawingPanes\HtmlDrawingPane;
use 
Utils\Graphics2D\Shapes\Styles\TextStyle;
use 
Utils\Geom\Dimension;
use 
Utils\File\Directory;
use 
Utils\Font\FontManager;
use 
Utils\Font\FontMetricServices\FontMetricServiceFactory;
use 
Utils\URL\Url;

// this example only runs through a web server
if(PHP_SAPI === 'cli')
{
    echo 
'This eample can only be run through a web server.'."\n".'This script will exit now.';
    exit(-
1);
}

require_once 
__DIR__.'/../app/bootstrap.inc';

// get the directory information
$rootDirectory = new Directory(new SplFileInfo(INSTALLATION_FOLDER));
$rootDirectory->expand();
$basenames  getFilenames($rootDirectory);

// get the default style for a tree
$style      = new TreeStyle();

// get the respective font metric, to be able to determine the maximal string length
// this uses the Browser's rendering engine plus an AJAX call - which might fail
// see FontManager::createFontMetric and subsequent calls for more information
$metric     getFontMetric($style->textStyle);

// set the width and height of the nodes of the tree
$style->shapeStyle->setWidth($metric->getMaxWidth($basenames));
$style->shapeStyle->setHeight($metric->getMaxHeight($basenames));

// get a new instance of the algorithm
$algorithm  = new ReingoldTilfordAlgorithm();

// get the model for the root directory, so that the algorithm can traverse it
$model      = new FSTreeModel($rootDirectory);

// get the layout of the tree
$layout     $algorithm->getLayout($model$style->orientation)->normalize();

// pass it to the plotter
$plotter    = new Plotter($model$layoutnullnullnull);

// create a new document
$document = new HtmlDrawingPane($layout->getDimension($style));

// plot it onto the document
$plotter->plot($style$document);

// print the html head
printHtmlHead($style);

// print the document
echo $document->save();


/**
 * This helper method returns the font metric for a given text style.
 *
 * In order to get the metrics of the font, back into the calling script, an AJAX request is pointed to to backend to initialise the font metric.
 *
 * @param TextStyle $textStyle the text style for which to font metric is needed
 * @return FontMetric
 */
function getFontMetric(TextStyle $textStyle)
{
    
$currentUrl Url::createCurrentUrlFromServerInfo();

    
$endpointUrl $currentUrl->setPath(str_replace('example_directory_tree.php''FontManagerServiceEndpoint.php'$currentUrl->getPath()));

    
$fontManager = new FontManager(FontMetricServiceFactory::createFontMetricService($endpointUrl));

    return 
$fontManager->getFontMetric($textStyle);
}

/**
 * This helper method gets the names of all folders and files of the given directory.
 *
 * @param Directory $root
 * @return ArrayObject the names of all folders and files of the given directory
 */
function getFilenames(Directory $root)
{
    
$basenames = new \ArrayObject();

    foreach(
$root->getDecendants() as $node)
        
$basenames[] = $node->getBasename();

    return 
$basenames;
}

/**
 * This helper method prints the html head, e.g. the CSS styles in use.
 */
function printHtmlHead(TreeStyle $treeStyle)
{
    echo 
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"'.PHP_EOL.
       
'"http://www.w3.org/TR/html4/loose.dtd">'.PHP_EOL.
        
'<style>'.PHP_EOL.
            
'.rt_node'.PHP_EOL.
            
'{'.PHP_EOL.
                
'position:          absolute;'.PHP_EOL.
            
'}'.PHP_EOL.

            
'.rt_edge'.PHP_EOL.
            
'{'.
                
'position:          absolute;'.PHP_EOL.
            
'}'.PHP_EOL.

            
'.text'.PHP_EOL.
            
'{'.
                
'width:             '.$treeStyle->shapeStyle->width.'px;'.PHP_EOL.
                
'text-align:        center;'.PHP_EOL.
            
'}'.PHP_EOL.
        
'</style>';
}