daux.io/libs/Tree/Builder.php

130 lignes
3.4 KiB
PHP
Brut Vue normale Historique

<?php namespace Todaymade\Daux\Tree;
use Todaymade\Daux\Daux;
2015-07-17 18:28:54 +02:00
use Todaymade\Daux\DauxHelper;
2015-04-23 00:32:30 +02:00
class Builder
{
2015-07-17 23:38:06 +02:00
/**
* Build the initial tree
*
* @param string $dir
* @param array $ignore
* @param \Todaymade\Daux\Config $params
* @param array $parents
* @return Directory|void
*/
2015-04-23 00:32:30 +02:00
public static function build($dir, $ignore, $params, $parents = null)
{
if (!$dh = opendir($dir)) {
return;
}
$node = new Directory($dir, $parents);
$new_parents = $parents;
if (is_null($new_parents)) {
$new_parents = array();
2015-04-23 00:32:30 +02:00
} else {
$new_parents[] = $node;
}
while (($file = readdir($dh)) !== false) {
if ($file == '.' || $file == '..') {
continue;
}
2015-04-23 00:32:30 +02:00
$path = $dir . DS . $file;
2015-04-23 00:32:30 +02:00
if (is_dir($path) && in_array($file, $ignore['folders'])) {
continue;
}
if (!is_dir($path) && in_array($file, $ignore['files'])) {
continue;
}
$entry = null;
if (is_dir($path)) {
2015-04-23 00:32:30 +02:00
$entry = static::build($path, $ignore, $params, $new_parents);
2015-04-23 21:04:00 +02:00
} elseif (in_array(pathinfo($path, PATHINFO_EXTENSION), Daux::$VALID_MARKDOWN_EXTENSIONS)) {
$entry = new Content($path, $new_parents);
2015-04-23 00:32:30 +02:00
if ($params['mode'] === Daux::STATIC_MODE) {
$entry->setUri($entry->getUri() . '.html');
}
} else {
$entry = new Raw($path, $new_parents);
}
if ($entry instanceof Entry) {
2015-04-23 00:32:30 +02:00
$node->value[$entry->getUri()] = $entry;
}
}
$node->sort();
2015-04-23 00:32:30 +02:00
if (isset($node->value[$params['index_key']])) {
$node->value[$params['index_key']]->setFirstPage($node->getFirstPage());
$node->setIndexPage($node->value[$params['index_key']]);
} else {
$node->setIndexPage(false);
}
return $node;
}
2015-07-17 18:28:54 +02:00
2015-07-17 23:38:06 +02:00
/**
* @param Entry $parent
* @param String $title
* @return Directory
*/
public static function getOrCreateDir($parent, $title)
{
2015-07-17 18:28:54 +02:00
$slug = DauxHelper::slug($title);
if (array_key_exists($slug, $parent->value)) {
return $parent->value[$slug];
}
$dir = new Directory();
$dir->setTitle($title);
$dir->setUri($slug);
$parent->value[$slug] = $dir;
return $dir;
}
2015-07-17 23:38:06 +02:00
/**
* @param array $parents
* @param string $title
* @return Content
*/
public static function getOrCreatePage($parents, $title)
{
2015-07-17 18:28:54 +02:00
$slug = DauxHelper::slug($title);
$uri = $slug . ".html";
$nearestParent = end($parents);
if (array_key_exists($uri, $nearestParent->value)) {
return $nearestParent->value[$uri];
}
$page = new Content('', $parents);
$page->setUri($uri);
$page->setContent("-"); //set an almost empty content to avoid problems
if ($title == 'index') {
$page->setName('_index');
$page->setTitle($nearestParent->getTitle());
$page->value = 'index';
$nearestParent->setIndexPage($page);
} else {
$page->setName($slug);
$page->setTitle($title);
}
$nearestParent->value[$uri] = $page;
return $page;
}
}