<?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, $layout, null, null, null);
 
 
// 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>';
 
}
 
 
 |