more work, about to mess w/ blueprint
This commit is contained in:
parent
a30d7b4e84
commit
ba7875f1dc
16
Rakefile
16
Rakefile
@ -1,8 +1,9 @@
|
|||||||
require 'rubygems'
|
require 'rubygems'
|
||||||
require 'rake'
|
require 'rake'
|
||||||
require 'echoe'
|
require 'echoe'
|
||||||
|
require 'fileutils'
|
||||||
|
|
||||||
Echoe.new('trivial', '0.0.5') do |p|
|
Echoe.new('trivial', '0.0.6') do |p|
|
||||||
p.summary = "Ultra-lightweight website framework for PHP"
|
p.summary = "Ultra-lightweight website framework for PHP"
|
||||||
p.description = <<-EOT
|
p.description = <<-EOT
|
||||||
For those who are using PHP to build their sites and want a very simple framework
|
For those who are using PHP to build their sites and want a very simple framework
|
||||||
@ -16,3 +17,16 @@ Echoe.new('trivial', '0.0.5') do |p|
|
|||||||
p.email = "john@coswelproductions.com"
|
p.email = "john@coswelproductions.com"
|
||||||
p.url = "http://github.com/johnbintz/trivial"
|
p.url = "http://github.com/johnbintz/trivial"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
namespace :blueprint do
|
||||||
|
desc "Include the latest Blueprint CSS files"
|
||||||
|
task :download do
|
||||||
|
FileUtils.rm_r 'blueprint' if File.directory? 'blueprint'
|
||||||
|
FileUtils.mkdir 'blueprint'
|
||||||
|
Dir.chdir 'blueprint'
|
||||||
|
system 'git clone git://github.com/joshuaclayton/blueprint-css.git'
|
||||||
|
FileUtils.cp_r File.join('blueprint-css', 'blueprint'), File.join('..', 'styles')
|
||||||
|
Dir.chdir '..'
|
||||||
|
FileUtils.rm_r 'blueprint'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
3
config/trivial.inc
Normal file
3
config/trivial.inc
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$trivial_env = "development";
|
1
content/dynamic.inc
Normal file
1
content/dynamic.inc
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?php echo "hello world!" ?>
|
118
lib/trivial.php
118
lib/trivial.php
@ -1,15 +1,39 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
// If you're using a different global default layout name, change it here
|
// PUT SITE CONFIGURATION IN config/trivial.inc
|
||||||
$layout = 'application';
|
|
||||||
|
|
||||||
if (!isset($_SERVER['REDIRECT_URL'])) {
|
if (!isset($_SERVER['REDIRECT_URL'])) {
|
||||||
header('HTTP/1.1 403 Forbidden');
|
header('HTTP/1.1 403 Forbidden');
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// END OF USER-CONFIGURABLE SETTINGS
|
$root_dir = realpath(dirname(__FILE__) . '/../');
|
||||||
|
|
||||||
|
// All of these should be set within config/trivial.inc!
|
||||||
|
|
||||||
|
// The default layout.
|
||||||
|
$layout = 'application';
|
||||||
|
|
||||||
|
// Additional scripts and stylesheets can be loaded in this way. Blueprint does not get loaded this way.
|
||||||
|
$global_head = array('scripts' => array(), 'styles' => array());
|
||||||
|
|
||||||
|
// If the environment is anything but production, errors will be rendered in the page.
|
||||||
|
$trivial_env = 'development';
|
||||||
|
|
||||||
|
if (($config = fe_check('config/trivial.inc')) !== false) {
|
||||||
|
include($config);
|
||||||
|
}
|
||||||
|
|
||||||
|
$trim = str_replace(realpath($_SERVER['DOCUMENT_ROOT']), '', realpath($root_dir));
|
||||||
|
|
||||||
|
$requested = preg_replace('#/$#', '/index.html', $_SERVER['REDIRECT_URL']);
|
||||||
|
$requested = preg_replace("#${trim}/(.*)\.[^\.]+\$#", '\1', $requested);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check the root path for the requested file.
|
||||||
|
* @param string $path The path to look for.
|
||||||
|
* @return string The path to the file on the filesystem, or false if not found.
|
||||||
|
*/
|
||||||
function fe_check($path) {
|
function fe_check($path) {
|
||||||
global $root_dir;
|
global $root_dir;
|
||||||
if (file_exists($full_path = ($root_dir . '/' . $path))) {
|
if (file_exists($full_path = ($root_dir . '/' . $path))) {
|
||||||
@ -19,6 +43,13 @@ function fe_check($path) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a partial file.
|
||||||
|
* Partials live in the views directory and are prefixed with an underscore (ex: section/_a_partial.inc).
|
||||||
|
* @param string $name The name of the partial without the leading underscore (ex: section/a_partial).
|
||||||
|
* @param array $local A hash of variables to include into the local scope of the partial.
|
||||||
|
* @return string The partial's result.
|
||||||
|
*/
|
||||||
function partial($name, $local = array()) {
|
function partial($name, $local = array()) {
|
||||||
$name = preg_replace('#/([^/]+)$', '/_\1', $name);
|
$name = preg_replace('#/([^/]+)$', '/_\1', $name);
|
||||||
if (($path = fe_check('views/' . $name . '.inc')) !== false) {
|
if (($path = fe_check('views/' . $name . '.inc')) !== false) {
|
||||||
@ -27,30 +58,62 @@ function partial($name, $local = array()) {
|
|||||||
include($path);
|
include($path);
|
||||||
return ob_get_clean();
|
return ob_get_clean();
|
||||||
} else {
|
} else {
|
||||||
trigger_error("No partial named ${name} found!");
|
render_error("No partial named ${name} found!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$root_dir = realpath(dirname(__FILE__) . '/../');
|
/**
|
||||||
|
* Handle a rendering error.
|
||||||
$trim = str_replace(realpath($_SERVER['DOCUMENT_ROOT']), '', realpath($root_dir));
|
* If the environment is 'production', the error is only logged. If it's anything else, it's printed
|
||||||
|
* on the screen. Regardless, an HTTP 500 error is returned and processing stops.
|
||||||
$requested = preg_replace('#/$#', '/index.html', $_SERVER['REDIRECT_URL']);
|
* @param string $error The error message to display.
|
||||||
$requested = preg_replace("#${trim}/(.*)\.[^\.]+\$#", '\1', $requested);
|
*/
|
||||||
|
function render_error($error) {
|
||||||
|
global $trivial_env;
|
||||||
|
if ($trivial_env == 'production') {
|
||||||
|
error_log($error);
|
||||||
|
} else {
|
||||||
|
echo "<div id='trivial-error'>${error}</div>";
|
||||||
|
}
|
||||||
|
header('HTTP/1.1 500 Internal Server Error');
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render style link tags.
|
||||||
|
*/
|
||||||
function styles() {
|
function styles() {
|
||||||
return head_component(func_get_args(), 'styles/%s.css', '<link rel="stylesheet" href="styles/%s.css" type="text/css" />');
|
return head_component('styles', func_get_args(), 'styles/%s.css', '<link rel="stylesheet" href="styles/%s.css" type="text/css" />');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render script tags.
|
||||||
|
*/
|
||||||
function scripts() {
|
function scripts() {
|
||||||
return head_component(func_get_args(), 'scripts/%s.js', '<script type="text/javascript" src="scripts/%s.js"></script>');
|
return head_component('scripts', func_get_args(), 'scripts/%s.js', '<script type="text/javascript" src="scripts/%s.js"></script>');
|
||||||
}
|
}
|
||||||
|
|
||||||
function head_component($additional, $search, $format) {
|
/**
|
||||||
global $requested;
|
* Render head compoments.
|
||||||
|
* @param string $what The type of component to render. $global_head is searched for a matching key and values for that key are merged into the list of styles.
|
||||||
|
* @param array $additional An array of additional components to display.
|
||||||
|
* @param string $search The search pattern to use for each component, run through sprintf() with the first %s being replaced with the component name.
|
||||||
|
* @param string $format The output format of the HTML tag to bring in the content.
|
||||||
|
* @return string The HTML for all found components.
|
||||||
|
*/
|
||||||
|
function head_component($what, $additional, $search, $format) {
|
||||||
|
global $requested, $global_head;
|
||||||
|
|
||||||
$output = array();
|
$output = array();
|
||||||
foreach (array_merge(array('application', $requested), $additional) as $file) {
|
|
||||||
|
$components = array_merge(array('application', $requested), $additional);
|
||||||
|
if (is_array($global_head[$what])) {
|
||||||
|
$components = array_merge($components, $global_head[$what]);
|
||||||
|
}
|
||||||
|
|
||||||
|
sort($components);
|
||||||
|
|
||||||
|
foreach ($components as $file) {
|
||||||
if (fe_check(sprintf($search, $file)) !== false) {
|
if (fe_check(sprintf($search, $file)) !== false) {
|
||||||
$output[] = sprintf($format, $file);
|
$output[] = sprintf($format, $file);
|
||||||
}
|
}
|
||||||
@ -58,31 +121,54 @@ function head_component($additional, $search, $format) {
|
|||||||
return implode("\n", $output);
|
return implode("\n", $output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the code to embed the Blueprint CSS framework.
|
||||||
|
* You should be starting with Blueprint and working your way from there, if only for the CSS reset & IE fixes alone.
|
||||||
|
* @return string The HTML for Blueprint.
|
||||||
|
*/
|
||||||
|
function blueprint() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search for files in the content directory, starting with .inc files (which will be include()d), then .html files (which will be file_get_content()sed)
|
||||||
$content = null;
|
$content = null;
|
||||||
|
if (($content_file = fe_check('content/' . $requested . '.inc')) !== false) {
|
||||||
|
ob_start();
|
||||||
|
include($content_file);
|
||||||
|
$content = ob_get_clean();
|
||||||
|
} else {
|
||||||
if (($content_file = fe_check('content/' . $requested . '.html')) !== false) {
|
if (($content_file = fe_check('content/' . $requested . '.html')) !== false) {
|
||||||
$content = file_get_contents($content_file);
|
$content = file_get_contents($content_file);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look for an action for the request. If it's found, execute it. Remember, $content contains the result of the above operation, if something was found.
|
||||||
foreach (array('application', $requested) as $action) {
|
foreach (array('application', $requested) as $action) {
|
||||||
if (($action_file = fe_check('actions/' . $action . '.inc')) !== false) {
|
if (($action_file = fe_check('actions/' . $action . '.inc')) !== false) {
|
||||||
include($action_file);
|
include($action_file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Look for a view with the same name as the request. If it's found, include() it, wrapping the include() in an output buffer block.
|
||||||
if (($view_file = fe_check('views/' . $requested . '.inc')) !== false) {
|
if (($view_file = fe_check('views/' . $requested . '.inc')) !== false) {
|
||||||
ob_start();
|
ob_start();
|
||||||
include($view_file);
|
include($view_file);
|
||||||
$content = ob_get_clean();
|
$content = ob_get_clean();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We should have content by this point. If not, raise an error.
|
||||||
if (is_null($content)) {
|
if (is_null($content)) {
|
||||||
trigger_error("No content generated for ${requested}! Did you create a content, action, or view file for this request?");
|
render_error("No content generated for ${requested}! Did you create a content, action, or view file for this request?");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We should have a layout, too. If not, raise an error.
|
||||||
if (($layout_file = fe_check('views/' . $layout . '.inc')) !== false) {
|
if (($layout_file = fe_check('views/' . $layout . '.inc')) !== false) {
|
||||||
ob_start();
|
ob_start();
|
||||||
include($layout_file);
|
include($layout_file);
|
||||||
$content = ob_get_clean();
|
$content = ob_get_clean();
|
||||||
|
} else {
|
||||||
|
render_error("Layout not found: ${layout}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We're done!
|
||||||
echo $content;
|
echo $content;
|
||||||
|
@ -35,3 +35,8 @@ does the following (for the examples, the request was for `about_us/contact.html
|
|||||||
## Styles and scripts
|
## Styles and scripts
|
||||||
|
|
||||||
Styles and scripts can be searched for in a structured way. The included `views/application.inc` gives an example as to how this works.
|
Styles and scripts can be searched for in a structured way. The included `views/application.inc` gives an example as to how this works.
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
Trivial includes the reset.css and typography.css files from the [Blueprint CSS Framework](http://blueprintcss.org/).
|
||||||
|
They're automatically included in the default application.css file.
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
* {
|
|
||||||
font-family: helvetica, arial
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background-color: #eee
|
|
||||||
}
|
|
@ -1,6 +1,7 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>My Application</title>
|
<title>My Application</title>
|
||||||
|
<?php echo blueprint() ?>
|
||||||
<?php echo scripts() ?>
|
<?php echo scripts() ?>
|
||||||
<?php echo styles() ?>
|
<?php echo styles() ?>
|
||||||
</head>
|
</head>
|
||||||
|
Loading…
Reference in New Issue
Block a user