Remove PicoTools

This commit is contained in:
Frédéric Guillot 2014-03-16 21:56:43 -04:00
parent e6e6db71f8
commit b74b8dd784
32 changed files with 45 additions and 638 deletions

View File

@ -20,6 +20,7 @@ Features
- Keyboard shortcuts (pressing '?' displays a pop-up listing the shortcuts; pressing 'q' closes it)
- Basic bookmarks
- Translated in English, French, German, Italian, Czech, Spanish, Portuguese and Simplified Chinese
- RTL language support
- Themes support
- Alternative login with a Google Account or Mozilla Persona
- **Full article download for feeds that display only a summary** (website scraper based on Xpath rules)
@ -98,7 +99,6 @@ Libraries used
- [PicoFeed](https://github.com/fguillot/picoFeed)
- [PicoFarad](https://github.com/fguillot/picoFarad)
- [PicoTools](https://github.com/fguillot/picoTools)
- [PicoDb](https://github.com/fguillot/picoDb)
- [SimpleValidator](https://github.com/fguillot/simpleValidator)
- [PHP 5.5 password backport](https://github.com/ircmaxell/password_compat)

View File

@ -6,7 +6,7 @@ a);b&&(b.innerHTML="");if(b=document.getElementById("last-checked-feed-"+a))b.in
function(b){b=e.indexOf(b.feed_id);0<=b&&e.splice(b,1);0==a.length&&0==e.length&&(clearInterval(d),clearInterval(f),window.location.href="?action=unread")})}},100)}}}();
Miniflux.Item=function(){function d(b){var a=document.getElementById("item-"+b);a||(a=document.getElementById("current-item"),a.getAttribute("data-item-id")!=b&&(a=!1));return a}function c(b){if((b=document.getElementById("bookmark-"+b))&&b.getAttribute("data-reverse-label")){var a=b.innerHTML;b.innerHTML=b.getAttribute("data-reverse-label");b.setAttribute("data-reverse-label",a)}}function a(b){if(b=document.getElementById("status-"+b)){var a=b.innerHTML;b.innerHTML=b.getAttribute("data-reverse-label");
b.setAttribute("data-reverse-label",a)}}function e(b){"mouse"!=Miniflux.Event.lastEventType&&Miniflux.Nav.SelectNextItem();b.parentNode.removeChild(b);if(b=document.getElementById("page-counter"))counter=parseInt(b.textContent.trim(),10)-1,0==counter?window.location="?action=unread":(b.textContent=counter+" ",document.title="miniflux ("+counter+")",document.getElementById("nav-counter").textContent="("+counter+")")}function f(b){var c=new XMLHttpRequest;c.onload=function(){if(Miniflux.Nav.IsListing()){var c=
d(b);if(c)if(c.getAttribute("data-hide"))e(c);else{c.setAttribute("data-item-status","read");a(b);if(c=document.getElementById("show-"+b)){c.className="read";var g=document.createElement("span");g.id="read-icon-"+b;g.appendChild(document.createTextNode("\u2611 "));c.parentNode.insertBefore(g,c)}(c=document.getElementById("status-"+b))&&c.setAttribute("data-action","mark-unread")}}};c.open("POST","?action=mark-item-read&id="+b,!0);c.send()}function h(b){var c=new XMLHttpRequest;c.onload=function(){if(Miniflux.Nav.IsListing()){var c=
d(b);if(c)if(c.getAttribute("data-hide"))e(c);else{c.setAttribute("data-item-status","read");a(b);if(c=document.getElementById("show-"+b)){c.className="read";var g=document.createElement("span");g.id="read-icon-"+b;g.appendChild(document.createTextNode("\u2714 "));c.parentNode.insertBefore(g,c)}(c=document.getElementById("status-"+b))&&c.setAttribute("data-action","mark-unread")}}};c.open("POST","?action=mark-item-read&id="+b,!0);c.send()}function h(b){var c=new XMLHttpRequest;c.onload=function(){if(Miniflux.Nav.IsListing()){var c=
d(b);if(c)if(c.getAttribute("data-hide"))e(c);else{c.setAttribute("data-item-status","unread");a(b);if(c=document.getElementById("show-"+b))c.className="";(c=document.getElementById("read-icon-"+b))&&c.parentNode.removeChild(c);(c=document.getElementById("status-"+b))&&c.setAttribute("data-action","mark-read")}}};c.open("POST","?action=mark-item-unread&id="+b,!0);c.send()}function l(b,a){var e=b.getAttribute("data-item-id"),d=new XMLHttpRequest;d.onload=function(){b.setAttribute("data-item-bookmark",
a);if(a)if(Miniflux.Nav.IsListing()){if(f=document.getElementById("show-"+e)){var d=document.createElement("span");d.id="bookmark-icon-"+e;d.appendChild(document.createTextNode("\u2605 "));f.parentNode.insertBefore(d,f)}c(e)}else{var f=document.getElementById("bookmark-"+e);f&&(f.innerHTML="\u2605")}else if(Miniflux.Nav.IsListing())(d=document.getElementById("bookmark-icon-"+e))&&d.parentNode.removeChild(d),c(e);else if(d=document.getElementById("bookmark-"+e))d.innerHTML="\u2606"};d.open("POST",
"?action=bookmark&id="+e+"&value="+a,!0);d.send()}return{Get:d,MarkAsRead:f,MarkAsUnread:h,SwitchBookmark:function(b){"1"==b.getAttribute("data-item-bookmark")?l(b,0):l(b,1)},SwitchStatus:function(b){var a=b.getAttribute("data-item-id");b=b.getAttribute("data-item-status");"read"==b?h(a):"unread"==b&&f(a)},ChangeStatus:function(b,a){switch(a){case "read":f(b);break;case "unread":h(b)}},Show:function(b){(b=document.getElementById("show-"+b))&&b.click()},OpenOriginal:function(b){var a=document.getElementById("original-"+

View File

@ -93,7 +93,7 @@ Miniflux.Item = (function() {
var icon = document.createElement("span");
icon.id = "read-icon-" + item_id;
icon.appendChild(document.createTextNode(" "));
icon.appendChild(document.createTextNode(" "));
link.parentNode.insertBefore(icon, link);
}

View File

@ -1,7 +1,7 @@
<?php
require __DIR__.'/check_setup.php';
require __DIR__.'/vendor/PicoTools/Translator.php';
require __DIR__.'/lib/Translator.php';
require __DIR__.'/vendor/PicoDb/Database.php';
require __DIR__.'/vendor/PicoFeed/Client.php';
require __DIR__.'/vendor/PicoFeed/Parser.php';

View File

@ -6,7 +6,7 @@ use PicoFarad\Router;
use PicoFarad\Response;
use PicoFarad\Request;
use PicoFarad\Session;
use PicoTools\Template;
use PicoFarad\Template;
// Ajax call to add or remove a bookmark
Router\post_action('bookmark', function() {

View File

@ -4,7 +4,7 @@ use PicoFarad\Router;
use PicoFarad\Response;
use PicoFarad\Request;
use PicoFarad\Session;
use PicoTools\Template;
use PicoFarad\Template;
// Called before each action
Router\before(function($action) {
@ -19,7 +19,7 @@ Router\before(function($action) {
// Load translations
$language = Model\Config\get('language') ?: 'en_US';
if ($language !== 'en_US') PicoTools\Translator\load($language);
if ($language !== 'en_US') \Translator\load($language);
// Set timezone
date_default_timezone_set(Model\Config\get('timezone') ?: 'UTC');

View File

@ -4,7 +4,7 @@ use PicoFarad\Router;
use PicoFarad\Response;
use PicoFarad\Request;
use PicoFarad\Session;
use PicoTools\Template;
use PicoFarad\Template;
use PicoDb\Database;
// Re-generate tokens

View File

@ -4,7 +4,7 @@ use PicoFarad\Router;
use PicoFarad\Response;
use PicoFarad\Request;
use PicoFarad\Session;
use PicoTools\Template;
use PicoFarad\Template;
// Flush console messages
Router\get_action('flush-console', function() {

View File

@ -4,7 +4,7 @@ use PicoFarad\Router;
use PicoFarad\Response;
use PicoFarad\Request;
use PicoFarad\Session;
use PicoTools\Template;
use PicoFarad\Template;
// Refresh all feeds, used when Javascript is disabled
Router\get_action('refresh-all', function() {

View File

@ -4,7 +4,7 @@ use PicoFarad\Router;
use PicoFarad\Response;
use PicoFarad\Request;
use PicoFarad\Session;
use PicoTools\Template;
use PicoFarad\Template;
// Display history page
Router\get_action('history', function() {

View File

@ -4,7 +4,7 @@ use PicoFarad\Router;
use PicoFarad\Response;
use PicoFarad\Request;
use PicoFarad\Session;
use PicoTools\Template;
use PicoFarad\Template;
// Display unread items
Router\get_action('unread', function() {

View File

@ -1,10 +1,12 @@
<?php
require_once __DIR__.'/../lib/AuthProvider.php';
use PicoFarad\Router;
use PicoFarad\Response;
use PicoFarad\Request;
use PicoFarad\Session;
use PicoTools\Template;
use PicoFarad\Template;
// Logout and destroy session
Router\get_action('logout', function() {
@ -45,15 +47,12 @@ Router\post_action('login', function() {
// Link to a Google Account (redirect)
Router\get_action('google-redirect-link', function() {
require 'vendor/PicoTools/AuthProvider.php';
Response\Redirect(AuthProvider\google_get_url(Helper\get_current_base_url(), '?action=google-link'));
});
// Link to a Google Account (association)
Router\get_action('google-link', function() {
require 'vendor/PicoTools/AuthProvider.php';
list($valid, $token) = AuthProvider\google_validate();
if ($valid) {
@ -70,15 +69,12 @@ Router\get_action('google-link', function() {
// Authenticate with a Google Account (redirect)
Router\get_action('google-redirect-auth', function() {
require 'vendor/PicoTools/AuthProvider.php';
Response\Redirect(AuthProvider\google_get_url(Helper\get_current_base_url(), '?action=google-auth'));
});
// Authenticate with a Google Account (callback url)
Router\get_action('google-auth', function() {
require 'vendor/PicoTools/AuthProvider.php';
list($valid, $token) = AuthProvider\google_validate();
if ($valid && $token === Model\Config\get('auth_google_token')) {
@ -104,8 +100,6 @@ Router\get_action('google-auth', function() {
// Authenticate with a Mozilla Persona (ajax check)
Router\post_action('mozilla-auth', function() {
require 'vendor/PicoTools/AuthProvider.php';
list($valid, $token) = AuthProvider\mozilla_validate(Request\param('token'));
if ($valid && $token === Model\Config\get('auth_mozilla_token')) {
@ -125,8 +119,6 @@ Router\post_action('mozilla-auth', function() {
// Link Miniflux to a Mozilla Account (ajax check)
Router\post_action('mozilla-link', function() {
require 'vendor/PicoTools/AuthProvider.php';
list($valid, $token) = AuthProvider\mozilla_validate(Request\param('token'));
if ($valid) {

View File

@ -1,12 +1,12 @@
<?php
require __DIR__.'/common.php';
require __DIR__.'/vendor/PicoTools/Template.php';
require __DIR__.'/vendor/PicoFarad/Template.php';
require __DIR__.'/vendor/PicoFarad/Response.php';
require __DIR__.'/vendor/PicoFarad/Request.php';
require __DIR__.'/vendor/PicoFarad/Session.php';
require __DIR__.'/vendor/PicoFarad/Router.php';
require __DIR__.'/helpers.php';
require __DIR__.'/lib/helpers.php';
use PicoFarad\Router;
use PicoFarad\Response;

1
lib/.htaccess Normal file
View File

@ -0,0 +1 @@
Deny from all

View File

@ -1,15 +1,6 @@
<?php
/*
* This file is part of PicoTools.
*
* (c) Frédéric Guillot http://fredericguillot.com
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PicoTools\Translator {
namespace Translator {
const PATH = 'locales/';
@ -137,26 +128,25 @@ namespace PicoTools\Translator {
}
}
namespace {
function tne() {
return call_user_func_array('\PicoTools\Translator\translate_no_escaping', func_get_args());
return call_user_func_array('\Translator\translate_no_escaping', func_get_args());
}
function t() {
return call_user_func_array('\PicoTools\Translator\translate', func_get_args());
return call_user_func_array('\Translator\translate', func_get_args());
}
function c() {
return call_user_func_array('\PicoTools\Translator\currency', func_get_args());
return call_user_func_array('\Translator\currency', func_get_args());
}
function n() {
return call_user_func_array('\PicoTools\Translator\number', func_get_args());
return call_user_func_array('\Translator\number', func_get_args());
}
function dt() {
return call_user_func_array('\PicoTools\Translator\datetime', func_get_args());
return call_user_func_array('\Translator\datetime', func_get_args());
}
}
}

View File

@ -268,7 +268,7 @@ function save(array $values)
$_SESSION['config'] = $values;
// Reload translations for flash session message
\PicoTools\Translator\load($values['language']);
\Translator\load($values['language']);
// If the user does not want content of feeds, remove it in previous ones
if (isset($values['nocontent']) && (bool) $values['nocontent']) {

View File

@ -12,10 +12,10 @@
<section class="items" id="listing">
<?php foreach ($items as $item): ?>
<?= \PicoTools\Template\load('item', array('item' => $item, 'menu' => $menu, 'offset' => $offset, 'hide' => false)) ?>
<?= \PicoFarad\Template\load('item', array('item' => $item, 'menu' => $menu, 'offset' => $offset, 'hide' => false)) ?>
<?php endforeach ?>
<?= \PicoTools\Template\load('paging', array('menu' => $menu, 'nb_items' => $nb_items, 'items_per_page' => $items_per_page, 'offset' => $offset, 'order' => $order, 'direction' => $direction)) ?>
<?= \PicoFarad\Template\load('paging', array('menu' => $menu, 'nb_items' => $nb_items, 'items_per_page' => $items_per_page, 'offset' => $offset, 'order' => $order, 'direction' => $direction)) ?>
</section>
<?php endif ?>

View File

@ -87,7 +87,7 @@
<li><a href="?action=download-db"><?= t('Download the entire database') ?></a> <?= t('(Gzip compressed Sqlite file)') ?></li>
</ul>
</div>
<?= \PicoTools\Template\load('keyboard_shortcuts') ?>
<?= \PicoFarad\Template\load('keyboard_shortcuts') ?>
<div class="alert alert-normal">
<h3><?= t('About') ?></h3>
<ul>

View File

@ -18,14 +18,14 @@
<section class="items" id="listing">
<?php foreach ($items as $item): ?>
<?= \PicoTools\Template\load('item', array('item' => $item, 'menu' => $menu, 'offset' => $offset, 'hide' => false)) ?>
<?= \PicoFarad\Template\load('item', array('item' => $item, 'menu' => $menu, 'offset' => $offset, 'hide' => false)) ?>
<?php endforeach ?>
<div id="bottom-menu">
<a href="?action=mark-feed-as-read&amp;feed_id=<?= $feed['id'] ?>" data-action="mark-feed-read" data-feed-id="<?= $feed['id'] ?>"><?= t('mark all as read') ?></a>
</div>
<?= \PicoTools\Template\load('paging', array('menu' => $menu, 'nb_items' => $nb_items, 'items_per_page' => $items_per_page, 'offset' => $offset, 'order' => $order, 'direction' => $direction, 'feed_id' => $feed['id'])) ?>
<?= \PicoFarad\Template\load('paging', array('menu' => $menu, 'nb_items' => $nb_items, 'items_per_page' => $items_per_page, 'offset' => $offset, 'order' => $order, 'direction' => $direction, 'feed_id' => $feed['id'])) ?>
</section>
<?php endif ?>

View File

@ -15,10 +15,10 @@
<section class="items" id="listing">
<?php foreach ($items as $item): ?>
<?= \PicoTools\Template\load('item', array('item' => $item, 'menu' => $menu, 'offset' => $offset, 'hide' => true)) ?>
<?= \PicoFarad\Template\load('item', array('item' => $item, 'menu' => $menu, 'offset' => $offset, 'hide' => true)) ?>
<?php endforeach ?>
<?= \PicoTools\Template\load('paging', array('menu' => $menu, 'nb_items' => $nb_items, 'items_per_page' => $items_per_page, 'offset' => $offset, 'order' => $order, 'direction' => $direction)) ?>
<?= \PicoFarad\Template\load('paging', array('menu' => $menu, 'nb_items' => $nb_items, 'items_per_page' => $items_per_page, 'offset' => $offset, 'order' => $order, 'direction' => $direction)) ?>
</section>
<?php endif ?>

View File

@ -40,7 +40,7 @@
<a href="<?= $item['enclosure'] ?>" rel="noreferrer" target="_blank"><?= t('media') ?></a>
</li>
<?php endif ?>
<?= \PicoTools\Template\load('bookmark_links', array('item' => $item, 'menu' => $menu, 'offset' => $offset, 'source' => '')) ?>
<?= \PicoTools\Template\load('status_links', array('item' => $item, 'redirect' => $menu, 'offset' => $offset)) ?>
<?= \PicoFarad\Template\load('bookmark_links', array('item' => $item, 'menu' => $menu, 'offset' => $offset, 'source' => '')) ?>
<?= \PicoFarad\Template\load('status_links', array('item' => $item, 'redirect' => $menu, 'offset' => $offset)) ?>
</ul>
</article>

View File

@ -12,7 +12,7 @@
<h2><?= t('Help') ?></h2>
</div>
<section>
<?= \PicoTools\Template\load('keyboard_shortcuts') ?>
<?= \PicoFarad\Template\load('keyboard_shortcuts') ?>
</section>
</section>
</body>

View File

@ -16,14 +16,14 @@
<section class="items" id="listing">
<?php foreach ($items as $item): ?>
<?= \PicoTools\Template\load('item', array('item' => $item, 'menu' => $menu, 'offset' => $offset, 'hide' => true)) ?>
<?= \PicoFarad\Template\load('item', array('item' => $item, 'menu' => $menu, 'offset' => $offset, 'hide' => true)) ?>
<?php endforeach ?>
<div id="bottom-menu">
<a href="?action=mark-as-read" data-action="mark-all-read"><?= t('mark all as read') ?></a>
</div>
<?= \PicoTools\Template\load('paging', array('menu' => $menu, 'nb_items' => $nb_items, 'items_per_page' => $items_per_page, 'offset' => $offset, 'order' => $order, 'direction' => $direction)) ?>
<?= \PicoFarad\Template\load('paging', array('menu' => $menu, 'nb_items' => $nb_items, 'items_per_page' => $items_per_page, 'offset' => $offset, 'order' => $order, 'direction' => $direction)) ?>
</section>
<?php endif ?>

View File

@ -17,7 +17,9 @@ function content_type($mimetype)
function status($status_code)
{
if (strpos(php_sapi_name(), 'apache') !== false) {
$sapi_name = php_sapi_name();
if (strpos($sapi_name, 'apache') !== false || $sapi_name === 'cli-server') {
header('HTTP/1.0 '.$status_code);
}
else {

View File

@ -104,12 +104,10 @@ function find_route($method, $route, \Closure $callback)
{
if ($_SERVER['REQUEST_METHOD'] === $method) {
if ($_SERVER['QUERY_STRING']) {
if (! empty($_SERVER['QUERY_STRING'])) {
$url = substr($_SERVER['REQUEST_URI'], 0, -(strlen($_SERVER['QUERY_STRING']) + 1));
}
else {
$url = $_SERVER['REQUEST_URI'];
}
@ -117,7 +115,7 @@ function find_route($method, $route, \Closure $callback)
if (url_match($route, $url, $params)) {
before($handler);
before($route);
\call_user_func_array($callback, $params);
exit;
}

View File

@ -1,36 +1,23 @@
<?php
/*
* This file is part of PicoTools.
*
* (c) Frédéric Guillot http://fredericguillot.com
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PicoTools\Template;
namespace PicoFarad\Template;
const PATH = 'templates/';
// Template\load('template_name', ['bla' => 'value']);
function load()
{
if (func_num_args() < 1 || func_num_args() > 2) {
die('Invalid template arguments');
}
if (! file_exists(PATH.func_get_arg(0).'.php')) {
die('Unable to load the template: "'.func_get_arg(0).'"');
}
if (func_num_args() === 2) {
if (! is_array(func_get_arg(1))) {
die('Template variables must be an array');
}
@ -38,9 +25,7 @@ function load()
}
ob_start();
include PATH.func_get_arg(0).'.php';
return ob_get_clean();
}
@ -48,4 +33,4 @@ function load()
function layout($template_name, array $template_args = array(), $layout_name = 'layout')
{
return load($layout_name, $template_args + array('content_for_layout' => load($template_name, $template_args)));
}
}

View File

@ -1,175 +0,0 @@
<?php
/*
* This file is part of picoTools.
*
* (c) Frédéric Guillot http://fredericguillot.com
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PicoTools;
/**
* Execute an external command
*
* @author Frédéric Guillot
*/
class Command
{
/**
* Command line
*
* @access private
* @var string
*/
private $cmd_line = '';
/**
* Command stdout
*
* @access private
* @var string
*/
private $cmd_stdout = '';
/**
* Command stderr
*
* @access private
* @var string
*/
private $cmd_sdterr = '';
/**
* Command environements variables
*
* @access private
* @var array
*/
private $cmd_env = array();
/**
* Command working directory
*
* @access private
* @var string
*/
private $cmd_dir = null;
/**
* Command return value
*
* @access private
* @var integer
*/
private $cmd_return = 0;
/**
* Constructor
*
* @access public
* @param string $command Command line
*/
public function __construct($command)
{
$this->cmd_line = $command;
}
/**
* Execute the command
*
* @access public
*/
public function execute()
{
$process = proc_open(
$this->cmd_line,
array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w')
),
$pipes,
$this->cmd_dir,
$this->cmd_env
);
if (is_resource($process)) {
$this->cmd_stdout = stream_get_contents($pipes[1]);
$this->cmd_stderr = stream_get_contents($pipes[2]);
$this->cmd_return = proc_close($process);
}
}
/**
* Set working directory
*
* @access public
* @param string $dir Working directory
*/
public function setDir($dir)
{
$this->cmd_dir = $dir;
}
/**
* Set command env variables
*
* @access public
* @param array $env Environnement variables
*/
public function setEnv(array $env)
{
$this->cmd_env = $env;
}
/**
* Get the return value
*
* @access public
* @return integer Return value
*/
public function getReturnValue()
{
return $this->cmd_return;
}
/**
* Get stdout
*
* @access public
* @return string stdout
*/
public function getStdout()
{
return $this->cmd_stdout;
}
/**
* Get stderr
*
* @access public
* @return string stderr
*/
public function getStderr()
{
return $this->cmd_stderr;
}
}

View File

@ -1,97 +0,0 @@
<?php
/*
* This file is part of PicoTools.
*
* (c) Frédéric Guillot http://fredericguillot.com
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PicoTools;
/**
* Handle configuration parameters
*
* @author Frédéric Guillot
*/
class Config
{
/**
* Container
*
* @access private
* @static
* @var array
*/
private static $container = array();
/**
* Set a new configuration parameter
*
* @access public
* @static
* @param string $name Parameter name
* @param string $value Parameter value
*/
public static function set($name, $value)
{
self::$container[$name] = $value;
}
/**
* Fetch a parameter value
*
* @access public
* @static
* @param string $name Parameter name
* @param string $defaultValue Default parameter value
*/
public static function get($name, $defaultValue = null)
{
return isset(self::$container[$name]) ? self::$container[$name] : $defaultValue;
}
/**
* Load a PHP config file
*
* @access public
* @static
*/
public static function load($env = null)
{
if ($env !== null) {
$filename = 'config/'.$env.'.php';
if (file_exists($filename)) {
require $filename;
}
else {
throw new \RuntimeException('Unable to load the config file: '.$filename);
}
}
else {
if (file_exists('config/prod.php')) {
require 'config/prod.php';
}
else if (file_exists('config/dev.php')) {
require 'config/dev.php';
}
else {
throw new \RuntimeException('No config file loaded.');
}
}
}
}

View File

@ -1,49 +0,0 @@
<?php
/*
* This file is part of PicoTools.
*
* (c) Frédéric Guillot http://fredericguillot.com
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PicoTools;
function singleton($name)
{
static $instance = array();
if (! isset($instance[$name])) {
$callback = container($name);
if (! is_callable($callback)) {
return null;
}
$instance[$name] = $callback();
}
return $instance[$name];
}
function container($name, $value = null)
{
static $container = array();
if (null !== $value) {
$container[$name] = $value;
}
else if (isset($container[$name])) {
return $container[$name];
}
return null;
}

View File

@ -1,240 +0,0 @@
<?php
namespace Helper;
function get_current_base_url()
{
$url = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url .= $_SERVER['SERVER_NAME'];
$url .= $_SERVER['SERVER_PORT'] == 80 || $_SERVER['SERVER_PORT'] == 443 ? '' : ':'.$_SERVER['SERVER_PORT'];
$url .= dirname($_SERVER['PHP_SELF']) !== '/' ? dirname($_SERVER['PHP_SELF']).'/' : '/';
return $url;
}
function escape($value)
{
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8', false);
}
function flash($html)
{
$data = '';
if (isset($_SESSION['flash_message'])) {
$data = sprintf($html, escape($_SESSION['flash_message']));
unset($_SESSION['flash_message']);
}
return $data;
}
function flash_error($html)
{
$data = '';
if (isset($_SESSION['flash_error_message'])) {
$data = sprintf($html, escape($_SESSION['flash_error_message']));
unset($_SESSION['flash_error_message']);
}
return $data;
}
function format_bytes($size, $precision = 2)
{
$base = log($size) / log(1024);
$suffixes = array('', 'k', 'M', 'G', 'T');
return round(pow(1024, $base - floor($base)), $precision).$suffixes[floor($base)];
}
function get_host_from_url($url)
{
return escape(parse_url($url, PHP_URL_HOST)) ?: $url;
}
function summary($value, $min_length = 5, $max_length = 120, $end = '[...]')
{
$length = strlen($value);
if ($length > $max_length) {
return substr($value, 0, strpos($value, ' ', $max_length)).' '.$end;
}
else if ($length < $min_length) {
return '';
}
return $value;
}
function in_list($id, array $listing)
{
if (isset($listing[$id])) {
return escape($listing[$id]);
}
return '?';
}
function relative_time($timestamp, $fallback_date_format = '%e %B %Y %k:%M')
{
$diff = time() - $timestamp;
if ($diff < 60) return \t('%d second'.($diff > 1 ? 's' : '').' ago', $diff);
$diff = floor($diff / 60);
if ($diff < 60) return \t('%d minute'.($diff > 1 ? 's' : '').' ago', $diff);
$diff = floor($diff / 60);
if ($diff < 24) return \t('%d hour'.($diff > 1 ? 's' : '').' ago', $diff);
$diff = floor($diff / 24);
if ($diff < 7) return \t('%d day'.($diff > 1 ? 's' : '').' ago', $diff);
$diff = floor($diff / 7);
if ($diff < 4) return \t('%d week'.($diff > 1 ? 's' : '').' ago', $diff);
$diff = floor($diff / 4);
if ($diff < 12) return \t('%d month'.($diff > 1 ? 's' : '').' ago', $diff);
return \dt($fallback_date_format, $timestamp);
}
function error_class(array $errors, $name)
{
return ! isset($errors[$name]) ? '' : ' form-error';
}
function error_list(array $errors, $name)
{
$html = '';
if (isset($errors[$name])) {
$html .= '<ul class="form-errors">';
foreach ($errors[$name] as $error) {
$html .= '<li>'.escape($error).'</li>';
}
$html .= '</ul>';
}
return $html;
}
function form_value($values, $name)
{
if (isset($values->$name)) {
return 'value="'.escape($values->$name).'"';
}
return isset($values[$name]) ? 'value="'.escape($values[$name]).'"' : '';
}
function form_hidden($name, $values = array())
{
return '<input type="hidden" name="'.$name.'" id="form-'.$name.'" '.form_value($values, $name).'/>';
}
function form_default_select($name, array $options, $values = array(), array $errors = array(), $class = '')
{
$options = array('' => '?') + $options;
return form_select($name, $options, $values, $errors, $class);
}
function form_select($name, array $options, $values = array(), array $errors = array(), $class = '')
{
$html = '<select name="'.$name.'" id="form-'.$name.'" class="'.$class.'">';
foreach ($options as $id => $value) {
$html .= '<option value="'.escape($id).'"';
if (isset($values->$name) && $id == $values->$name) $html .= ' selected="selected"';
if (isset($values[$name]) && $id == $values[$name]) $html .= ' selected="selected"';
$html .= '>'.escape($value).'</option>';
}
$html .= '</select>';
$html .= error_list($errors, $name);
return $html;
}
function form_radios($name, array $options, array $values = array())
{
$html = '';
foreach ($options as $value => $label) {
$html .= form_radio($name, $label, $value, isset($values[$name]) && $values[$name] == $value);
}
return $html;
}
function form_radio($name, $label, $value, $selected = false, $class = '')
{
return '<label><input type="radio" name="'.$name.'" class="'.$class.'" value="'.escape($value).'" '.($selected ? 'selected="selected"' : '').'>'.escape($label).'</label>';
}
function form_checkbox($name, $label, $value, $checked = false, $class = '')
{
return '<label><input type="checkbox" name="'.$name.'" class="'.$class.'" value="'.escape($value).'" '.($checked ? 'checked="checked"' : '').'>&nbsp;'.escape($label).'</label>';
}
function form_label($label, $name, $class = '')
{
return '<label for="form-'.$name.'" class="'.$class.'">'.escape($label).'</label>';
}
function form_textarea($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '')
{
$class .= error_class($errors, $name);
$html = '<textarea name="'.$name.'" id="form-'.$name.'" class="'.$class.'" ';
$html .= implode(' ', $attributes).'>';
$html .= isset($values->$name) ? escape($values->$name) : isset($values[$name]) ? $values[$name] : '';
$html .= '</textarea>';
$html .= error_list($errors, $name);
return $html;
}
function form_input($type, $name, $values = array(), array $errors = array(), array $attributes = array(), $class = '')
{
$class .= error_class($errors, $name);
$html = '<input type="'.$type.'" name="'.$name.'" id="form-'.$name.'" '.form_value($values, $name).' class="'.$class.'" ';
$html .= implode(' ', $attributes).'/>';
$html .= error_list($errors, $name);
return $html;
}
function form_text($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '')
{
return form_input('text', $name, $values, $errors, $attributes, $class);
}
function form_password($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '')
{
return form_input('password', $name, $values, $errors, $attributes, $class);
}
function form_email($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '')
{
return form_input('email', $name, $values, $errors, $attributes, $class);
}
function form_date($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '')
{
return form_input('date', $name, $values, $errors, $attributes, $class);
}
function form_number($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '')
{
return form_input('number', $name, $values, $errors, $attributes, $class);
}