New templating system

This commit is contained in:
Stéphane Goetz 2015-04-23 10:24:50 +02:00
parent de1214cbab
commit 52b679b33f
134 changed files with 529 additions and 592 deletions

View File

@ -22,10 +22,10 @@ module.exports = function (grunt) {
report: 'min'
},
files: {
"templates/default/themes/daux-blue/css/theme.min.css": "templates/default/themes/daux-blue/less/theme.less",
"templates/default/themes/daux-green/css/theme.min.css": "templates/default/themes/daux-green/less/theme.less",
"templates/default/themes/daux-navy/css/theme.min.css": "templates/default/themes/daux-navy/less/theme.less",
"templates/default/themes/daux-red/css/theme.min.css": "templates/default/themes/daux-red/less/theme.less"
"resources/themes/daux-blue/css/theme.min.css": "resources/themes/daux-blue/less/theme.less",
"resources/themes/daux-green/css/theme.min.css": "resources/themes/daux-green/less/theme.less",
"resources/themes/daux-navy/css/theme.min.css": "resources/themes/daux-navy/less/theme.less",
"resources/themes/daux-red/css/theme.min.css": "resources/themes/daux-red/less/theme.less"
}
}
},

View File

@ -13,7 +13,8 @@
],
"require": {
"php": ">=5.4",
"erusev/parsedown": "~1.0"
"erusev/parsedown": "~1.0",
"league/plates": "~3.1"
},
"autoload": {
"psr-4": {"Todaymade\\Daux\\": "libs/"}

77
composer.lock generated
View File

@ -1,9 +1,10 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"hash": "21bea6f01fcb0695632cbacb5a3988a1",
"hash": "183de90aad5bcf722f046eb01453cdc0",
"packages": [
{
"name": "erusev/parsedown",
@ -43,22 +44,68 @@
"parser"
],
"time": "2014-05-14 10:14:49"
},
{
"name": "league/plates",
"version": "3.1.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/plates.git",
"reference": "c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/plates/zipball/c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8",
"reference": "c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8",
"shasum": ""
},
"require-dev": {
"mikey179/vfsstream": "~1.4.0",
"phpunit/phpunit": "~4.0",
"squizlabs/php_codesniffer": "~1.5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"psr-4": {
"League\\Plates\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jonathan Reinink",
"email": "jonathan@reinink.ca",
"role": "Developer"
}
],
"description": "Plates, the native PHP template system that's fast, easy to use and easy to extend.",
"homepage": "http://platesphp.com",
"keywords": [
"league",
"package",
"templates",
"templating",
"views"
],
"time": "2014-10-21 12:06:12"
}
],
"packages-dev": [
],
"aliases": [
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [
],
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": ">=5.3"
"php": ">=5.4"
},
"platform-dev": [
]
"platform-dev": []
}

View File

@ -3,25 +3,27 @@
"tagline": "My Stylish Documentation",
"author": "I, Me & Myself",
"image": "",
"repo": "",
"twitter": [],
"links": {
},
"languages": {},
"theme": "daux-blue",
"ignore": {
"files": [],
"folders": []
},
"breadcrumbs": false,
"template": "default",
"clean_urls": false,
"toggle_code": false,
"date_modified": false,
"float": false,
"file_editor": false,
"repo": "",
"twitter": [],
"google_analytics": "",
"timezone": "America/Los_Angeles",
"google_analytics": false,
"piwik_analytics": false,
"piwik_analytics_id": "0",
"languages": {},
"ignore": {
"files": [],
"folders": []
},
"links": {
}
"piwik_analytics_id": "0"
}

View File

@ -111,36 +111,15 @@ class Daux
public function getParams()
{
$params = array(
//Informations
'tagline' => $this->options['tagline'],
'title' => $this->options['title'],
'author' => $this->options['author'],
'image' => $this->options['image'],
'repo' => $this->options['repo'],
'links' => $this->options['links'],
'twitter' => $this->options['twitter'],
$params = $this->options += array(
//Features
'google_analytics' => ($g = $this->options['google_analytics']) ?
DauxHelper::googleAnalytics($g, $this->host) : '',
'piwik_analytics' => ($p = $this->options['piwik_analytics']) ?
DauxHelper::piwikAnalytics($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,
'template' => $this->options['template'],
'templates' => $this->local_base . DS . 'templates',
);
if ($this->tree) {
@ -172,10 +151,10 @@ class Daux
}
$params['theme'] = DauxHelper::getTheme(
$this->local_base . DS . 'templates' . DS . $this->options['template'] . DS . 'themes' . DS . $this->options['theme'],
$this->local_base . DS . 'resources' . DS . 'themes' . DS . $this->options['theme'],
$params['base_url'],
$this->local_base,
$params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/'
$params['base_url'] . "resources/themes/" . $this->options['theme'] . '/'
);
return $params;

View File

@ -47,15 +47,13 @@ class DauxHelper
'require-jquery' => false,
'bootstrap-js' => false,
'favicon' => '<base_url>resources/img/favicon.png',
'template' => $local_base . DS . 'templates' . DS . 'default/default.php',
'error-template' => $local_base . DS . 'templates' . DS . 'default/error.php',
'templates' => $theme_folder . DS . 'templates',
];
$substitutions = ['<local_base>' => $local_base, '<base_url>' => $base_url, '<theme_url>' => $theme_url];
// Substitute some placeholders
$theme['template'] = strtr($theme['template'], $substitutions);
$theme['error-template'] = strtr($theme['error-template'], $substitutions);
$theme['templates'] = strtr($theme['templates'], $substitutions);
$theme['favicon'] = utf8_encode(strtr($theme['favicon'], $substitutions));
foreach ($theme['css'] as $key => $css) {
@ -73,43 +71,6 @@ class DauxHelper
return $theme;
}
public static function googleAnalytics($analytics, $host)
{
$ga = <<<EOT
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
EOT;
$ga .= "ga('create', '" . $analytics . "', '" . $host . "');";
$ga .= "ga('send', 'pageview');";
$ga .= '</script>';
return $ga;
}
public static function piwikAnalytics($analytics_url, $analytics_id)
{
$pa = <<<EOT
<script type="text/javascript">
var _paq = _paq || [];
_paq.push(["trackPageView"]);
_paq.push(["enableLinkTracking"]);
(function() {
EOT;
$pa .= 'var u=(("https:" == document.location.protocol) ? "https" : "http") + "://' . $analytics_url . '/";';
$pa .= '_paq.push(["setTrackerUrl", u+"piwik.php"]);';
$pa .= '_paq.push(["setSiteId", ' . $analytics_id . ']);';
$pa .= <<<EOT
var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0];
g.type="text/javascript";
g.defer=true; g.async=true; g.src=u+"piwik.js"; s.parentNode.insertBefore(g,s);
})();
</script>
EOT;
return $pa;
}
public static function pathinfo($path)
{
preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $m);

View File

@ -10,18 +10,6 @@ class Helper
@mkdir($path . DS . 'resources');
static::copyRecursive($local_base . DS . 'resources', $path . DS . 'resources');
@mkdir($path . DS . 'js');
static::copyRecursive($local_base . DS . 'js', $path . DS . 'js');
//added and changed these in order to fetch the theme files and put them in the right place
@mkdir($path . DS . 'templates');
@mkdir($path . DS . 'templates' . DS . 'default');
@mkdir($path . DS . 'templates' . DS . 'default' . DS . 'themes');
static::copyRecursive(
$local_base . DS . 'templates' . DS . 'default' . DS . 'themes',
$path . DS . 'templates' . DS . 'default' . DS . 'themes'
);
}
private static function rmdir($dir)

View File

@ -9,7 +9,6 @@ class MarkdownPage extends SimplePage
private $language;
private $homepage;
private $breadcrumb_trail;
private static $template;
public function __construct()
{
@ -51,10 +50,6 @@ class MarkdownPage extends SimplePage
$language_dir = current($file->getParents());
$this->language = $language_dir->name;
}
if (is_null(static::$template)) {
include_once($params['theme']['template']);
static::$template = new Template();
}
}
private function buildBreadcrumbTrail($parents, $multilanguage)
@ -89,20 +84,18 @@ class MarkdownPage extends SimplePage
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]->getUrl());
$entry_page[$name] = $params['base_page'] . $params['entry_page'][$key]->getUrl();
}
} else {
$entry_page['View Documentation'] = utf8_encode($params['base_page'] . $params['entry_page']->getUri());
$entry_page['View Documentation'] = $params['base_page'] . $params['entry_page']->getUri();
}
} elseif ($params['file_uri'] === 'index') {
$entry_page[utf8_encode($params['entry_page']->title)] = utf8_encode($params['base_page'] . $params['entry_page']->getUrl());
$entry_page[$params['entry_page']->title] = $params['base_page'] . $params['entry_page']->getUrl();
}
$page['entry_page'] = $entry_page;
$page['homepage'] = $this->homepage;
$page['title'] = $this->file->getTitle();
$page['tagline'] = $params['tagline'];
$page['author'] = $params['author'];
$page['filename'] = $this->file->getName();
if ($page['breadcrumbs'] = $params['breadcrumbs']) {
$page['breadcrumb_trail'] = $this->breadcrumb_trail;
@ -110,17 +103,13 @@ class MarkdownPage extends SimplePage
}
$page['language'] = $this->language;
$page['path'] = $this->file->getPath();
$page['request'] = utf8_encode($params['request']);
$page['theme'] = $params['theme'];
$page['modified_time'] = filemtime($this->file->getPath());
$page['markdown'] = $this->content;
$page['file_editor'] = $params['file_editor'];
$page['google_analytics'] = $params['google_analytics'];
$page['piwik_analytics'] = $params['piwik_analytics'];
$Parsedown = new \Parsedown();
$page['content'] = $Parsedown->text($this->content);
return static::$template->get_content($page, $params);
$template = new Template($params['templates'], $params['theme']['templates']);
return $template->render($this->homepage? 'home' : 'content', ['page' => $page, 'params' => $params]);
}
}

View File

@ -10,7 +10,6 @@ class ErrorPage extends SimplePage
const FATAL_ERROR_TYPE = 'FATAL_ERROR';
private $params;
private static $template;
public function __construct($title, $content, $params)
{
@ -26,9 +25,6 @@ class ErrorPage extends SimplePage
public function getContent()
{
include_once($this->params['theme']['error-template']);
static::$template = new Template();
if (is_null($this->html)) {
$this->html = $this->generatePage();
}
@ -40,11 +36,9 @@ class ErrorPage extends SimplePage
{
$params = $this->params;
$page['title'] = $this->title;
$page['theme'] = $params['theme'];
$page['content'] = $this->content;
$page['google_analytics'] = $params['google_analytics'];
$page['piwik_analytics'] = $params['piwik_analytics'];
return static::$template->get_content($page, $params);
$template = new Template($params['templates'], $params['theme']['templates']);
return $template->render('error', ['page' => $page, 'params' => $params]);
}
}

117
libs/Template.php Normal file
View File

@ -0,0 +1,117 @@
<?php namespace Todaymade\Daux;
use League\Plates\Engine;
class Template
{
protected $engine;
public function __construct($base, $theme)
{
// Create new Plates instance
$this->engine = new Engine($base);
if (!is_dir($theme)) {
$theme = $base;
}
$this->engine->addFolder('theme', $theme, true);
$this->registerFunctions();
}
public function render($name, array $data = array())
{
$this->engine->addData([
'index' => utf8_encode($data['params']['base_page'] . $data['params']['index']->value),
'base_url' => $data['params']['base_url'],
'base_page' => $data['params']['base_page'],
'page' => $data['page'],
'params' => $data['params'],
//'homepage' => $data['params']['homepage'],
//'project_title' => utf8_encode($data['params']['title']),
'tree' => $data['params']['tree'],
//'entry_page' => $data['page']['entry_page'],
]);
return $this->engine->render($name, $data);
}
protected function registerFunctions()
{
$this->engine->registerFunction('get_navigation', function($tree, $path, $current_url, $base_page, $mode) {
$nav = '<ul class="nav nav-list">';
$nav .= $this->buildNavigation($tree, $path, $current_url, $base_page, $mode);
$nav .= '</ul>';
return $nav;
});
$this->engine->registerFunction('get_breadcrumb_title', function($page, $base_page) {
$title = '';
$breadcrumb_trail = $page['breadcrumb_trail'];
$separator = $this->getSeparator($page['breadcrumb_separator']);
foreach ($breadcrumb_trail as $key => $value) {
$title .= '<a href="' . $base_page . $value . '">' . $key . '</a>' . $separator;
}
if ($page['filename'] === 'index' || $page['filename'] === '_index') {
if ($page['title'] != '') {
$title = substr($title, 0, -1 * strlen($separator));
}
} else {
$title .= '<a href="' . $base_page . $page['request'] . '">' . $page['title'] . '</a>';
}
return $title;
});
}
private function buildNavigation($tree, $path, $current_url, $base_page, $mode)
{
$nav = '';
foreach ($tree->value as $node) {
$url = $node->getUri();
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->getTitle() . '</a></li>';
}
if ($node instanceof \Todaymade\Daux\Tree\Directory) {
$nav .= '<li';
$link = ($path === '') ? $url : $path . '/' . $url;
if (strpos($current_url, $link) === 0) {
$nav .= ' class="open"';
}
$nav .= ">";
if ($mode === \TodayMade\Daux\Daux::STATIC_MODE) {
$link .= "/index.html";
}
if ($node->getIndexPage()) {
$nav .= '<a href="' . $base_page . $link . '" class="folder">' .
$node->getTitle() . '</a>';
} else {
$nav .= '<a href="#" class="aj-nav folder">' . $node->getTitle() . '</a>';
}
$nav .= '<ul class="nav nav-list">';
$new_path = ($path === '') ? $url : $path . '/' . $url;
$nav .= $this->buildNavigation($node, $new_path, $current_url, $base_page, $mode);
$nav .= '</ul></li>';
}
}
return $nav;
}
private function getSeparator($separator)
{
switch ($separator) {
case 'Chevrons':
return ' <i class="glyphicon glyphicon-chevron-right"></i> ';
default:
return $separator;
}
}
}

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Some files were not shown because too many files have changed in this diff Show More