8
0
Fork 0

Extract tree builder

Add related files directly in the documentation
Dieser Commit ist enthalten in:
Stéphane Goetz 2015-04-22 18:24:10 +02:00 committet von Stéphane Goetz
Ursprung 2c228273fb
Commit ecd5efe758
23 geänderte Dateien mit 327 neuen und 304 gelöschten Zeilen

Datei anzeigen

@ -74,7 +74,7 @@ If you want to create a beautiful landing page for your project, simply create a
{
"title": "Daux.io",
"tagline": "The Easiest Way To Document Your Project",
"image": "<base_url>img/app.png"
"image": "app.png"
}
```

Datei anzeigen

@ -75,7 +75,7 @@ If you want to create a beautiful landing page for your project, simply create a
{
"title": "Daux.io",
"tagline": "The Easiest Way To Document Your Project",
"image": "<base_url>img/app.png"
"image": "app.png"
}
```

Datei anzeigen

@ -6,7 +6,7 @@
<h3>Features</h3>
<hr/>
<img src="img/app-thumbs.png" alt="alt text" class="img-responsive pull-right" style="margin-bottom:20px;">
<img src="app-thumbs.png" alt="alt text" class="img-responsive pull-right" style="margin-bottom:20px;">
* 100% Mobile Responsive
* Supports GitHub Flavored Markdown
@ -38,4 +38,4 @@ var google_remarketing_only = true;
<div style="display:inline;">
<img height="1" width="1" style="border-style:none;" alt="" src="//googleads.g.doubleclick.net/pagead/viewthroughconversion/983836026/?value=0&amp;guid=ON&amp;script=0"/>
</div>
</noscript>
</noscript>

Datei anzeigen

Vorher

Breite:  |  Höhe:  |  Größe: 91 KiB

Nachher

Breite:  |  Höhe:  |  Größe: 91 KiB

Datei anzeigen

Vorher

Breite:  |  Höhe:  |  Größe: 235 KiB

Nachher

Breite:  |  Höhe:  |  Größe: 235 KiB

Datei anzeigen

@ -1,8 +1,8 @@
{
"title": "DAUX.IO",
"tagline": "The Easiest Way To Document Your Project",
"author": "Justin Walsh",
"image": "<base_url>img/app.png",
"author": "Justin Walsh",
"image": "app.png",
"theme": "daux-blue",
"template": "default",
"clean_urls": true,
@ -11,7 +11,7 @@
"breadcrumb_separator": "Chevrons",
"date_modified": true,
"float": true,
"file_editor": false,
"file_editor": false,
"repo": "justinwalsh/daux.io",
"ignore": {
"files": ["Work_In_Progress.md"],

Datei anzeigen

@ -2,6 +2,7 @@
use Todaymade\Daux\Server\Helper as ServerHelper;
use Todaymade\Daux\Generator\Helper as GeneratorHelper;
use Todaymade\Daux\Tree\Builder;
class Daux
{
@ -80,7 +81,7 @@
}
private function generate_directory_tree() {
$this->tree = DauxHelper::build_directory_tree($this->docs_path, $this->options['ignore'], $this->mode);
$this->tree = Builder::build($this->docs_path, $this->options['ignore'], $this->mode);
if (!empty($this->options['languages'])) {
foreach ($this->options['languages'] as $key => $node) {
$this->tree->value[$key]->title = $node;
@ -89,9 +90,8 @@
}
public function get_base_params() {
return array(
'local_base' => $this->local_base,
$params = array(
//Informations
'tagline' => $this->options['tagline'],
'title' => $this->options['title'],
'author' => $this->options['author'],
@ -99,44 +99,46 @@
'repo' => $this->options['repo'],
'links' => $this->options['links'],
'twitter' => $this->options['twitter'],
//Features
'google_analytics' => ($g = $this->options['google_analytics']) ? DauxHelper::google_analytics($g, $this->host) : '',
'piwik_analytics' => ($p = $this->options['piwik_analytics']) ? DauxHelper::piwik_analytics($p, $this->options['piwik_analytics_id']) : '',
'toggle_code' => $this->options['toggle_code'],
'float' => $this->options['float'],
'date_modified' => $this->options['date_modified'],
'file_editor' => false,
'breadcrumbs' => $this->options['breadcrumbs'],
'breadcrumb_separator' => $this->options['breadcrumb_separator'],
'multilanguage' => !empty($this->options['languages']),
'languages' => $this->options['languages'],
//Paths and tree
'mode' => $this->mode,
'local_base' => $this->local_base,
'docs_path' => $this->docs_path,
'tree' => $this->tree,
'index' => ($this->tree->index_page !== false) ? $this->tree->index_page : $this->tree->first_page,
'template' => $this->options['template'],
);
}
//TODO :: move to generator
public function get_page_params($mode = '') {
if ($mode === '') $mode = $this->mode;
$params = $this->get_base_params();
$params['mode'] = $mode;
$params['index_key'] = 'index.html';
$params['base_url'] = '';
$params['base_page'] = $params['base_url'];
if ($params['breadcrumbs'] = $this->options['breadcrumbs'])
$params['breadcrumb_separator'] = $this->options['breadcrumb_separator'];
$params['multilanguage'] = !empty($this->options['languages']);
$params['languages'] = $this->options['languages'];
if (empty($this->options['languages'])) {
$params['entry_page'] = $this->tree->first_page;
} else {
if (!$params['multilanguage']) {
foreach ($this->options['languages'] as $key => $name) {
$params['entry_page'][$key] = $this->tree->value[$key]->first_page;
}
} else {
$params['entry_page'] = $this->tree->first_page;
}
$params['toggle_code'] = $this->options['toggle_code'];
$params['float'] = $this->options['float'];
$params['date_modified'] = $this->options['date_modified'];
$params['file_editor'] = false;
return $params;
}
//TODO :: move to generator
public function get_page_params() {
$params = $this->get_base_params();
$params['index_key'] = 'index.html';
$params['base_page'] = $params['base_url'] = '';
$params['theme'] = DauxHelper::get_theme(
$this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'],
@ -152,34 +154,13 @@
public function get_live_page_params() {
$params = $this->get_base_params();
$params['mode'] = Daux::LIVE_MODE;
$params['index_key'] = 'index';
$protocol = '//';
$params['base_url'] = $protocol . $this->base_url;
$params['base_page'] = $params['base_url'];
$params['host'] = $this->host;
$params['clean_urls'] = $this->options['clean_urls'];
$params['base_page'] = $params['base_url'] = '//' . $this->base_url;
if (!$this->options['clean_urls']) $params['base_page'] .= 'index.php/';
if ($params['image'] !== '') $params['image'] = str_replace('<base_url>', $params['base_url'], $params['image']);
if ($params['breadcrumbs'] = $this->options['breadcrumbs'])
$params['breadcrumb_separator'] = $this->options['breadcrumb_separator'];
$params['multilanguage'] = !empty($this->options['languages']);
$params['languages'] = $this->options['languages'];
if (empty($this->options['languages'])) {
$params['entry_page'] = $this->tree->first_page;
} else {
foreach ($this->options['languages'] as $key => $name) {
$params['entry_page'][$key] = $this->tree->value[$key]->first_page;
}
}
$params['toggle_code'] = $this->options['toggle_code'];
$params['float'] = $this->options['float'];
$params['date_modified'] = $this->options['date_modified'];
$params['file_editor'] = $this->options['file_editor'];
$params['theme'] = DauxHelper::get_theme(
$this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'],
$params['base_url'],

Datei anzeigen

@ -22,38 +22,6 @@
return $request;
}
public static function get_title_from_file($file) {
$file = static::pathinfo($file);
return static::get_title_from_filename($file['filename']);
}
public static function get_title_from_filename($filename) {
$filename = explode('_', $filename);
if ($filename[0] == '' || is_numeric($filename[0])) unset($filename[0]);
else {
$t = $filename[0];
if ($t[0] == '-') $filename[0] = substr($t, 1);
}
$filename = implode(' ', $filename);
return $filename;
}
public static function get_url_from_file($file) {
$file = static::pathinfo($file);
return static::get_url_from_filename($file['filename']);
}
public static function get_url_from_filename($filename) {
$filename = explode('_', $filename);
if ($filename[0] == '' || is_numeric($filename[0])) unset($filename[0]);
else {
$t = $filename[0];
if ($t[0] == '-') $filename[0] = substr($t, 1);
}
$filename = implode('_', $filename);
return $filename;
}
public static function get_theme($theme_folder, $base_url, $local_base, $theme_url) {
$name = static::pathinfo($theme_folder);
@ -71,7 +39,7 @@
'fonts' => [],
'require-jquery' => false,
'bootstrap-js' => false,
'favicon' => '<base_url>img/favicon.png',
'favicon' => '<base_url>resources/img/favicon.png',
'template' => $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/default.tpl',
'error-template' => $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/error.tpl',
];
@ -132,38 +100,6 @@ EOT;
return $pa;
}
public static function build_directory_tree($dir, $ignore, $mode = Daux::LIVE_MODE, $parents = null) {
if ($dh = opendir($dir)) {
$node = new Entry($dir, $parents);
$new_parents = $parents;
if (is_null($new_parents)) $new_parents = array();
else $new_parents[] = $node;
while (($entry = readdir($dh)) !== false) {
if ($entry == '.' || $entry == '..') continue;
$path = $dir . DIRECTORY_SEPARATOR . $entry;
if (is_dir($path) && in_array($entry, $ignore['folders'])) continue;
if (!is_dir($path) && in_array($entry, $ignore['files'])) continue;
$file_details = static::pathinfo($path);
if (is_dir($path)) $entry = static::build_directory_tree($path, $ignore, $mode, $new_parents);
else if (in_array($file_details['extension'], Daux::$VALID_MARKDOWN_EXTENSIONS))
{
$entry = new Entry($path, $new_parents);
if ($mode === Daux::STATIC_MODE) $entry->uri .= '.html';
}
if ($entry instanceof Entry) $node->value[$entry->uri] = $entry;
}
$node->sort();
$node->first_page = $node->get_first_page();
$index_key = ($mode === Daux::LIVE_MODE) ? 'index' : 'index.html';
if (isset($node->value[$index_key])) {
$node->value[$index_key]->first_page = $node->first_page;
$node->index_page = $node->value[$index_key];
} else $node->index_page = false;
return $node;
}
}
public static function pathinfo($path) {
preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $m);
if (isset($m[1])) $ret['dir']=$m[1];

Datei anzeigen

@ -1,127 +0,0 @@
<?php namespace Todaymade\Daux;
class Entry
{
const FILE_TYPE = 'FILE_TYPE';
const DIRECTORY_TYPE = 'DIRECTORY_TYPE';
public $name;
public $title;
public $type;
public $index_page;
public $first_page;
public $value;
public $uri;
public $local_path;
public $last_modified;
public $parents;
function __construct($path = '', $parents = array()) {
if (!isset($path) || $path == '' || !file_exists($path)) return;
$this->local_path = $path;
$this->parents = $parents;
$this->last_modified = filemtime($path);
$this->name = DauxHelper::pathinfo($path);
$this->name = $this->name['filename'];
$this->title = DauxHelper::get_title_from_file($this->name);
$this->uri = DauxHelper::get_url_from_filename($this->name);
$this->index_page = false;
if (is_dir($path)) {
$this->type = Entry::DIRECTORY_TYPE;
$this->value = array();
} else {
$this->type = Entry::FILE_TYPE;
$this->value = $this->uri;
}
}
public function sort() {
if ($this->type == static::DIRECTORY_TYPE) uasort($this->value, array($this, 'compare_directory_entries'));
}
public function retrieve_file($request, $get_first_file = false) {
$tree = $this;
$request = explode('/', $request);
foreach ($request as $node) {
if ($tree->type === static::DIRECTORY_TYPE) {
if (isset($tree->value[$node])) $tree = $tree->value[$node];
else {
if ($node === 'index' || $node === 'index.html') {
if ($get_first_file) {
return ($tree->index_page) ? $tree->index_page : $tree->first_page;
} else {
return $tree->index_page;
}
} else return false;
}
} else return false;
}
if ($tree->type === static::DIRECTORY_TYPE) {
if ($tree->index_page) return $tree->index_page;
else return ($get_first_file) ? $tree->first_page : false;
} else {
return $tree;
}
}
public function get_url() {
$url = '';
foreach ($this->parents as $node) {
$url .= $node->uri . '/';
}
$url .= $this->uri;
return $url;
}
public function get_first_page() {
foreach ($this->value as $node) {
if ($node->type === static::FILE_TYPE && $node->title != 'index')
return $node;
}
foreach ($this->value as $node) {
if ($node->type === static::DIRECTORY_TYPE) {
$page = $node->get_first_page();
if ($page) return $page;
}
}
return false;
}
public function write($content) {
if (is_writable($this->local_path)) file_put_contents($this->local_path, $content);
else return false;
return true;
}
private function compare_directory_entries($a, $b) {
$name_a = explode('_', $a->name);
$name_b = explode('_', $b->name);
if (is_numeric($name_a[0])) {
$a = intval($name_a[0]);
if (is_numeric($name_b[0])) {
$b = intval($name_b[0]);
if (($a >= 0) == ($b >= 0)) {
$a = abs($a);
$b = abs($b);
if ($a == $b) return (strcasecmp($name_a[1], $name_b[1]));
return ($a > $b) ? 1 : -1;
}
return ($a >= 0) ? -1 : 1;
}
$t = $name_b[0];
if ($t && $t[0] === '-') return -1;
return ($a < 0) ? 1 : -1;
} else {
if (is_numeric($name_b[0])) {
$b = intval($name_b[0]);
if ($b >= 0) return 1;
$t = $name_a[0];
if ($t && $t[0] === '-') return 1;
return ($b >= 0) ? 1 : -1;
}
$p = $name_a[0];
$q = $name_b[0];
if (($p && $p[0] === '-') == ($q && $q[0] === '-')) return strcasecmp($p, $q);
else return ($p[0] === '-') ? 1 : -1;
}
}
}

Datei anzeigen

@ -3,6 +3,8 @@
use Todaymade\Daux\Daux;
use Todaymade\Daux\Entry;
use Todaymade\Daux\MarkdownPage;
use Todaymade\Daux\Tree\Directory;
use Todaymade\Daux\Tree\Content;
class Generator {
public function generate($global_config, $destination) {
@ -26,16 +28,18 @@ class Generator {
$params['image'] = str_replace('<base_url>', $base_url, $params['image']);
if ($base_url !== '') $params['entry_page'] = $tree->first_page;
foreach ($tree->value as $key => $node) {
if ($node->type === Entry::DIRECTORY_TYPE) {
if ($node instanceof Directory) {
$new_output_dir = $output_dir . DIRECTORY_SEPARATOR . $key;
@mkdir($new_output_dir);
$this->recursive_generate_static($node, $new_output_dir, $new_params, '../' . $base_url);
} else {
} else if ($node instanceof Content) {
$params['request'] = $node->get_url();
$params['file_uri'] = $node->name;
$page = MarkdownPage::fromFile($node, $params);
file_put_contents($output_dir . DIRECTORY_SEPARATOR . $key, $page->get_page_content());
} else {
copy($node->local_path, $output_dir . DIRECTORY_SEPARATOR . $key);
}
}
}

Datei anzeigen

@ -8,8 +8,8 @@ class Helper {
@mkdir($path);
static::clean_directory($path);
@mkdir($path . DIRECTORY_SEPARATOR . 'img');
static::copy_recursive($local_base . DIRECTORY_SEPARATOR . 'img', $path . DIRECTORY_SEPARATOR . 'img');
@mkdir($path . DIRECTORY_SEPARATOR . 'resources');
static::copy_recursive($local_base . DIRECTORY_SEPARATOR . 'resources', $path . DIRECTORY_SEPARATOR . 'resources');
@mkdir($path . DIRECTORY_SEPARATOR . 'js');
static::copy_recursive($local_base . DIRECTORY_SEPARATOR . 'js', $path . DIRECTORY_SEPARATOR . 'js');
//added and changed these in order to fetch the theme files and put them in the right place

Datei anzeigen

@ -75,15 +75,18 @@ class MarkdownPage extends SimplePage
private function generate_page() {
$params = $this->params;
$Parsedown = new \Parsedown();
if ($params['request'] === $params['index_key']) {
if ($params['multilanguage']) {
foreach ($params['languages'] as $key => $name) {
$entry_page[utf8_encode($name)] = utf8_encode($params['base_page'] . $params['entry_page'][$key]->get_url());
}
} else $entry_page['View Documentation'] = utf8_encode($params['base_page'] . $params['entry_page']->uri);
} else if ($params['file_uri'] === 'index')
$entry_page[utf8_encode($params['entry_page']->title)] = utf8_encode($params['base_page'].
$params['entry_page']->get_url());
$entry_page = [];
//TODO :: debug entry pages
//if ($params['request'] === $params['index_key']) {
// if ($params['multilanguage']) {
// foreach ($params['languages'] as $key => $name) {
// $entry_page[utf8_encode($name)] = utf8_encode($params['base_page'] . $params['entry_page'][$key]->get_url());
// }
// } else $entry_page['View Documentation'] = utf8_encode($params['base_page'] . $params['entry_page']->uri);
//} else if ($params['file_uri'] === 'index') {
// $entry_page[utf8_encode($params['entry_page']->title)] = utf8_encode($params['base_page'] . $params['entry_page']->get_url());
//}
$page['entry_page'] = (isset($entry_page)) ? $entry_page : null;
$page['homepage'] = $this->homepage;

Datei anzeigen

@ -1,6 +1,7 @@
<?php namespace Todaymade\Daux\Server;
use Todaymade\Daux\SimplePage;
use Todaymade\Daux\Template;
class ErrorPage extends SimplePage
{
@ -9,25 +10,21 @@ class ErrorPage extends SimplePage
const FATAL_ERROR_TYPE = 'FATAL_ERROR';
private $params;
private $type;
private static $template;
public function __construct($title, $content, $params) {
parent::__construct($title, $content);
$this->params = $params;
$this->type = $params['error_type'];
}
public function display() {
http_response_code($this->type === static::MISSING_PAGE_ERROR_TYPE ? 404 : 500);
http_response_code(404);
parent::display();
}
public function get_page_content() {
if ($this->type !== static::FATAL_ERROR_TYPE && is_null(static::$template)) {
include_once($this->params['theme']['error-template']);
static::$template = new Template();
}
include_once($this->params['theme']['error-template']);
static::$template = new Template();
if (is_null($this->html)) {
$this->html = $this->generate_page();
@ -37,7 +34,6 @@ class ErrorPage extends SimplePage
}
public function generate_page() {
if ($this->type === static::FATAL_ERROR_TYPE) return $this->content;
$params = $this->params;
$page['title'] = $this->title;
$page['theme'] = $params['theme'];

Datei anzeigen

@ -4,30 +4,6 @@ use Todaymade\Daux\Daux;
use Todaymade\Daux\DauxHelper;
class Helper {
public static function get_error_params(Daux $daux)
{
$params = $daux->get_base_params();
$params['theme'] = DauxHelper::get_theme(
$daux->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $daux->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $daux->options['theme'],
$params['base_url'],
$daux->local_base,
$params['base_url'] . "templates/" . $params['template'] . "/themes/" . $daux->options['theme'] . '/'
);
$params['index_key'] = 'index';
$protocol = '//';
$params['base_url'] = $protocol . $daux->base_url;
$params['base_page'] = $params['base_url'];
$params['host'] = $daux->host;
$params['clean_urls'] = $daux->options['clean_urls'];
if ($params['image'] !== '') $params['image'] = str_replace('<base_url>', $params['base_url'], $params['image']);
return $params;
}
public static function get_request()
{
if (isset($_SERVER['PATH_INFO'])) $uri = $_SERVER['PATH_INFO'];

Datei anzeigen

@ -22,7 +22,7 @@ class Server {
}
catch( NotFoundException $e )
{
$page = new ErrorPage("An error occured", $e->getMessage(), Helper::get_error_params($daux));
$page = new ErrorPage("An error occured", $e->getMessage(), $daux->get_live_page_params());
}
$page->display();
@ -33,10 +33,8 @@ class Server {
}
public function handle($url, $query = []) {
$this->params = $this->daux->get_live_page_params();
if (!$this->params['clean_urls']) $this->params['base_page'] .= 'index.php/';
$request = Helper::get_request();
$request = urldecode($request);
$request_type = isset($query['method']) ? $query['method'] : '';
@ -68,8 +66,43 @@ class Server {
}
private function get_file_from_request($request) {
$file = $this->daux->tree->retrieve_file($request);
return $file;
$tree = $this->daux->tree;
$request = explode('/', $request);
foreach ($request as $node) {
// If the element we're in currently is not a
// directory, we failed to find the requested file
if (!$tree instanceof Directory) {
return false;
}
// if the node exists in the current request tree,
// change the $tree variable to reference the new
// node and proceed to the next url part
if (isset($tree->value[$node])) {
$tree = $tree->value[$node];
continue;
}
// At this stage, we're in a directory, but no
// sub-item matches, so the current node must
// be an index page or we failed
if ($node !== 'index' && $node !== 'index.html') {
return false;
}
return $tree->index_page;
}
// If the entry we found is not a directory, we're done
if (!$tree instanceof Directory) {
return $tree;
}
if ($tree->index_page){
return $tree->index_page;
}
return ($get_first_file) ? $tree->first_page : false;
}
private function get_page($request) {

62
libs/Tree/Builder.php Normale Datei
Datei anzeigen

@ -0,0 +1,62 @@
<?php namespace Todaymade\Daux\Tree;
use Todaymade\Daux\Daux;
use Todaymade\Daux\DauxHelper;
class Builder {
public static function build($dir, $ignore, $mode = Daux::LIVE_MODE, $parents = null) {
if (!$dh = opendir($dir)) {
return;
}
$node = new Directory($dir, $parents);
$new_parents = $parents;
if (is_null($new_parents)) {
$new_parents = array();
} else{
$new_parents[] = $node;
}
while (($file = readdir($dh)) !== false) {
if ($file == '.' || $file == '..') {
continue;
}
$path = $dir . DIRECTORY_SEPARATOR . $file;
if ((is_dir($path) && in_array($file, $ignore['folders'])) || (!is_dir($path) && in_array($file, $ignore['files']))) {
continue;
}
$file_details = DauxHelper::pathinfo($path);
$entry = null;
if (is_dir($path)) {
$entry = static::build($path, $ignore, $mode, $new_parents);
} else if(in_array($file_details['extension'], Daux::$VALID_MARKDOWN_EXTENSIONS)) {
$entry = new Content($path, $new_parents);
if ($mode === Daux::STATIC_MODE) {
$entry->uri .= '.html';
}
} else {
$entry = new Raw($path, $new_parents);
}
if ($entry instanceof Entry) {
$node->value[$entry->uri] = $entry;
}
}
$node->sort();
$node->first_page = $node->get_first_page();
$index_key = ($mode === Daux::LIVE_MODE) ? 'index' : 'index.html';
if (isset($node->value[$index_key])) {
$node->value[$index_key]->first_page = $node->first_page;
$node->index_page = $node->value[$index_key];
} else $node->index_page = false;
return $node;
}
}

19
libs/Tree/Content.php Normale Datei
Datei anzeigen

@ -0,0 +1,19 @@
<?php namespace Todaymade\Daux\Tree;
use Todaymade\Daux\DauxHelper;
class Content extends Entry {
public $title;
public function __construct($path = '', $parents = array()) {
parent::__construct($path, $parents);
$this->value = $this->uri;
}
protected function getFilename($file) {
$file = DauxHelper::pathinfo($file);
return $file['filename'];
}
}

43
libs/Tree/Directory.php Normale Datei
Datei anzeigen

@ -0,0 +1,43 @@
<?php namespace Todaymade\Daux\Tree;
class Directory extends Entry {
public $value = [];
public function sort() {
uasort($this->value, array($this, 'compare_directory_entries'));
}
private function compare_directory_entries($a, $b) {
$name_a = explode('_', $a->name);
$name_b = explode('_', $b->name);
if (is_numeric($name_a[0])) {
$a = intval($name_a[0]);
if (is_numeric($name_b[0])) {
$b = intval($name_b[0]);
if (($a >= 0) == ($b >= 0)) {
$a = abs($a);
$b = abs($b);
if ($a == $b) return (strcasecmp($name_a[1], $name_b[1]));
return ($a > $b) ? 1 : -1;
}
return ($a >= 0) ? -1 : 1;
}
$t = $name_b[0];
if ($t && $t[0] === '-') return -1;
return ($a < 0) ? 1 : -1;
} else {
if (is_numeric($name_b[0])) {
$b = intval($name_b[0]);
if ($b >= 0) return 1;
$t = $name_a[0];
if ($t && $t[0] === '-') return 1;
return ($b >= 0) ? 1 : -1;
}
$p = $name_a[0];
$q = $name_b[0];
if (($p && $p[0] === '-') == ($q && $q[0] === '-')) return strcasecmp($p, $q);
else return ($p[0] === '-') ? 1 : -1;
}
}
}

86
libs/Tree/Entry.php Normale Datei
Datei anzeigen

@ -0,0 +1,86 @@
<?php namespace Todaymade\Daux\Tree;
use Todaymade\Daux\DauxHelper;
abstract class Entry
{
public $title;
public $name;
public $index_page;
public $first_page;
public $uri;
public $local_path;
public $last_modified;
public $parents;
function __construct($path = '', $parents = array()) {
if (!isset($path) || $path == '' || !file_exists($path)) return;
$this->local_path = $path;
$this->parents = $parents;
$this->last_modified = filemtime($path);
$this->name = DauxHelper::pathinfo($path)['filename'];
$this->title = $this->get_title_from_filename($this->name);
$this->uri = $this->get_url_from_filename($this->getFilename($path));
$this->index_page = false;
}
public function get_url() {
$url = '';
foreach ($this->parents as $node) {
$url .= $node->uri . '/';
}
$url .= $this->uri;
return $url;
}
public function get_first_page() {
foreach ($this->value as $node) {
if ($node instanceof Content && $node->title != 'index')
return $node;
}
foreach ($this->value as $node) {
if ($node instanceof Directory) {
$page = $node->get_first_page();
if ($page) return $page;
}
}
return false;
}
public function write($content) {
if (!is_writable($this->local_path)) {
return false;
}
file_put_contents($this->local_path, $content);
return true;
}
protected function getFilename($file) {
$parts = explode('/', $file);
return end($parts);
}
protected function get_title_from_filename($filename) {
$filename = explode('_', $filename);
if ($filename[0] == '' || is_numeric($filename[0])) unset($filename[0]);
else {
$t = $filename[0];
if ($t[0] == '-') $filename[0] = substr($t, 1);
}
$filename = implode(' ', $filename);
return $filename;
}
protected function get_url_from_filename($filename) {
$filename = explode('_', $filename);
if ($filename[0] == '' || is_numeric($filename[0])) unset($filename[0]);
else {
$t = $filename[0];
if ($t[0] == '-') $filename[0] = substr($t, 1);
}
$filename = implode('_', $filename);
return $filename;
}
}

9
libs/Tree/Raw.php Normale Datei
Datei anzeigen

@ -0,0 +1,9 @@
<?php namespace Todaymade\Daux\Tree;
class Raw extends Entry {
public function __construct($path = '', $parents = array()) {
parent::__construct($path, $parents);
$this->value = $this->uri;
}
}

Datei anzeigen

Vorher

Breite:  |  Höhe:  |  Größe: 1.0 KiB

Nachher

Breite:  |  Höhe:  |  Größe: 1.0 KiB

Datei anzeigen

@ -13,13 +13,14 @@
$nav = '';
foreach ($tree->value as $node) {
$url = $node->uri;
if ($node->type === \TodayMade\Daux\Entry::FILE_TYPE) {
if ($node instanceof \Todaymade\Daux\Tree\Content) {
if ($node->value === 'index') continue;
$nav .= '<li';
$link = ($path === '') ? $url : $path . '/' . $url;
if ($current_url === $link) $nav .= ' class="active"';
$nav .= '><a href="' . $base_page . $link . '">' . $node->title . '</a></li>';
} else {
}
if ($node instanceof \Todaymade\Daux\Tree\Directory) {
$nav .= '<li';
$link = ($path === '') ? $url : $path . '/' . $url;
if (strpos($current_url, $link) === 0) $nav .= ' class="open"';

Datei anzeigen

@ -12,11 +12,12 @@
private function build_navigation($tree, $path, $base_page) {
$nav = '';
foreach ($tree->value as $url => $node) {
if ($node->type === \TodayMade\Daux\Entry::FILE_TYPE) {
if ($node instanceof \Todaymade\Daux\Tree\Content) {
if ($node->value === 'index') continue;
$link = ($path === '') ? $url : $path . '/' . $url;
$nav .= '<li><a href="' . utf8_encode($base_page . $link) . '">' . $node->title . '</a></li>';
} else {
}
if ($node instanceof \Todaymade\Daux\Tree\Directory) {
$nav .= '<li>';
$link = ($path === '') ? $url : $path . '/' . $url;
if ($node->index_page) $nav .= '<a href="' . $base_page . $link . '" class="folder">' . $node->title . '</a>';