<?php
/***************************************************************************
- * Copyright (C) 2003-2006 Polytechnique.org *
+ * Copyright (C) 2003-2008 Polytechnique.org *
* http://opensource.polytechnique.org/ *
* *
* This program is free software; you can redistribute it and/or modify *
require_once 'smarty/libs/Smarty.class.php';
-class PlatalPage extends Smarty
+abstract class PlatalPage extends Smarty
{
- var $_page_type;
- var $_tpl;
- var $_errors;
- var $_failure;
-
- // defaults
- var $caching = false;
- var $config_overwrite = false;
- var $use_sub_dirs = false;
+ private $_page_type;
+ private $_tpl;
+ private $_errors;
+ private $_failure;
+ private $_jsonVars;
// {{{ function PlatalPage()
- function PlatalPage($tpl, $type = SKINNED)
+ public function __construct($tpl, $type = SKINNED)
{
- global $globals;
+ parent::Smarty();
- $this->Smarty();
+ global $globals;
+ $this->caching = false;
+ $this->config_overwrite = false;
+ $this->use_sub_dirs = false;
$this->template_dir = $globals->spoolroot."/templates/";
$this->compile_dir = $globals->spoolroot."/spool/templates_c/";
array_unshift($this->plugins_dir, $globals->spoolroot."/plugins/");
$this->compile_check = !empty($globals->debug);
- $this->_page_type = $type;
- $this->_tpl = $tpl;
+ $this->changeTpl($tpl, $type);
$this->_errors = array();
+ $this->_jsonVars = array();
$this->_failure = false;
+ if ($globals->mode != 'rw') {
+ $this->_errors[] = "En raison d'une maintenance, une partie des fonctionnalités du site sont actuellement"
+ . " désactivée, en particuliers aucune donnée ne sera sauvegardée";
+ }
$this->register_prefilter('at_to_globals');
- $this->register_prefilter('trimwhitespace');
- $this->register_prefilter('form_force_encodings');
$this->addJsLink('xorg.js');
}
// }}}
// {{{ function changeTpl()
- function changeTpl($tpl, $type = SKINNED)
+ public function changeTpl($tpl, $type = SKINNED)
+ {
+ $this->_tpl = $tpl;
+ $this->_page_type = $type;
+ $this->assign('xorg_tpl', $tpl);
+ }
+
+ // }}}
+ // {{{ function raw()
+
+ public function raw()
{
- $this->_tpl = $tpl;
- $this->_page_type = $type;
- $this->assign('xorg_tpl', $tpl);
+ global $globals;
+ $this->assign('globals', $globals);
+ return $this->fetch($this->_tpl);
}
// }}}
// {{{ function _run()
- function _run($skin)
+ protected function _run($skin)
{
global $globals, $TIME_BEGIN;
session_write_close();
+ $this->register_prefilter('trimwhitespace');
+ $this->register_prefilter('form_force_encodings');
+ $this->register_prefilter('wiki_include');
+ $this->register_prefilter('if_has_perms');
$this->assign('xorg_errors', $this->_errors);
$this->assign('xorg_failure', $this->_failure);
$this->assign('globals', $globals);
+ if (Env::has('json') && count($this->_jsonVars)) {
+ return $this->jsonDisplay();
+ }
+
+ if (Env::v('display') == 'light') {
+ $this->_page_type = SIMPLE;
+ } elseif (Env::v('display') == 'raw') {
+ $this->_page_type = NO_SKIN;
+ } elseif (Env::v('display') == 'full') {
+ $this->_page_typ = SKINNED;
+ }
+
switch ($this->_page_type) {
case NO_SKIN:
- error_reporting(0);
+ if (!($globals->debug & DEBUG_SMARTY)) {
+ error_reporting(0);
+ }
$this->display($this->_tpl);
exit;
$this->assign('simple', true);
case SKINNED:
- $this->register_modifier('escape_html', 'escape_html');
- $this->default_modifiers = Array('@escape_html');
+ $this->register_modifier('escape_html', 'escape_html');
+ $this->default_modifiers = Array('@escape_html');
+ }
+ if (S::i('auth') <= AUTH_PUBLIC) {
+ $this->register_outputfilter('hide_emails');
}
- $this->register_outputfilter('hide_emails');
$this->addJsLink('wiki.js');
- header("Accept-Charset: iso-8859-15, latin9, us-ascii, ascii");
+ header("Accept-Charset: utf-8");
+ if (Env::v('forceXml')) {
+ header("Content-Type: text/xml; charset=utf-8");
+ }
if (!$globals->debug) {
error_reporting(0);
exit;
}
- if ($globals->debug & 1) {
- $this->assign('db_trace', XDB::trace_format($this, 'database-debug.tpl'));
- }
-
$this->assign('validate', true);
- error_reporting(0);
+ if (!($globals->debug & DEBUG_SMARTY)) {
+ error_reporting(0);
+ }
+ $START_SMARTY = microtime(true);
$result = $this->fetch($skin);
- $ttime = sprintf('Temps total: %.02fs<br />', microtime_float() - $TIME_BEGIN);
- $replc = "<span class='erreur'>VALIDATION HTML INACTIVE</span><br />";
-
- if ($globals->debug & 2) {
+ $ttime = sprintf('Temps total: %.02fs (Smarty %.02fs) - Mémoire totale : %dKo<br />',
+ microtime(true) - $TIME_BEGIN, microtime(true) - $START_SMARTY,
+ memory_get_peak_usage(true) / 1024);
+ if ($globals->debug & DEBUG_BT) {
+ PlBacktrace::clean();
+ $this->assign_by_ref('backtraces', PlBacktrace::$bt);
+ $result = str_replace('@@BACKTRACE@@', $this->fetch('skin/common.backtrace.tpl'), $result);
+ } else {
+ $result = str_replace('@@BACKTRACE@@', '', $result);
+ }
+ $replc = "<span class='erreur'>VALIDATION HTML INACTIVE</span><br />";
+ if ($globals->debug & DEBUG_VALID) {
$fd = fopen($this->compile_dir."/valid.html","w");
fwrite($fd, $result);
fclose($fd);
exit;
}
+ abstract public function run();
+
// }}}
// {{{ function nb_errs()
- function nb_errs()
+ public function nb_errs()
{
return count($this->_errors);
}
// }}}
// {{{ function trig()
- function trig($msg)
+ public function trig($msg)
{
$this->_errors[] = $msg;
}
// }}}
// {{{ function kill()
- function kill($msg)
+ public function kill($msg)
{
global $platal;
// }}}
// {{{ function addJsLink
- function addJsLink($path)
+ public function addJsLink($path)
{
$this->append('xorg_js', $path);
}
// }}}
// {{{ function addCssLink
- function addCssLink($path)
+ public function addCssLink($path)
{
$this->append('xorg_css', $path);
}
// }}}
+ // {{{ function addCssInline
+
+ public function addCssInline($css)
+ {
+ if (!empty($css)) {
+ $this->append('xorg_inline_css', $css);
+ }
+ }
+
+ // }}}
// {{{ function setRssLink
- function setRssLink($title, $path)
+ public function setRssLink($title, $path)
{
$this->assign('xorg_rss', array('title' => $title, 'href' => $path));
}
// }}}
+ // {{{ function jsonDisplay
+ protected function jsonDisplay()
+ {
+ header("Content-type: text/javascript; charset=utf-8");
+ array_walk_recursive($this->_jsonVars, "escape_xorgDB");
+ $jsonbegin = Env::v('jsonBegin');
+ $jsonend = Env::v('jsonEnd');
+ if (Env::has('jsonVar')) {
+ $jsonbegin = Env::v('jsonVar').' = ';
+ $jsonend = ';';
+ } elseif (Env::has('jsonFunc')) {
+ $jsonbegin = Env::v('jsonFunc').'(';
+ $jsonend = ');';
+ }
+ echo $jsonbegin, json_encode($this->_jsonVars), $jsonend;
+ exit;
+ }
+ // }}}
+ // {{{ function jsonAssign
+ public function jsonAssign($var, $value)
+ {
+ $this->_jsonVars[$var] = $value;
+ }
+
+ // }}}
+}
+
+function escape_xorgDB(&$item, $key)
+{
+ if (is_a($item, 'XOrgDBIterator')) {
+ $expanded = array();
+ while ($a = $item->next()) {
+ $expanded[] = $a;
+ }
+ $item = $expanded;
+ }
}
// {{{ function escape_html ()
/**
* default smarty plugin, used to auto-escape dangerous html.
- *
+ *
* < --> <
* > --> >
* " --> "
function escape_html($string)
{
if (is_string($string)) {
- $transtbl = Array('<' => '<', '>' => '>', '"' => '"', '\'' => ''');
- return preg_replace("/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,4};)/", "&" , strtr($string, $transtbl));
+ return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
} else {
- return $string;
+ return $string;
}
}
function trimwhitespace($source, &$smarty)
{
- $tags = array('script', 'pre', 'textarea');
-
- foreach ($tags as $tag) {
- preg_match_all("!<{$tag}[^>]+>.*?</{$tag}>!is", $source, ${$tag});
- $source = preg_replace("!<{$tag}[^>]+>.*?</{$tag}>!is", "&&&{$tag}&&&", $source);
- }
+ $tags = '(script|pre|textarea)';
+ preg_match_all("!<$tags.*?>.*?</(\\1)>!ius", $source, $tagsmatches);
+ $source = preg_replace("!<$tags.*?>.*?</(\\1)>!ius", "&&&tags&&&", $source);
// remove all leading spaces, tabs and carriage returns NOT
// preceeded by a php close tag.
$source = preg_replace('/((?<!\?>)\n)[\s]+/m', '\1', $source);
+ $source = preg_replace("!&&&tags&&&!e", 'array_shift($tagsmatches[0])', $source);
- foreach ($tags as $tag) {
- $source = preg_replace("!&&&{$tag}&&&!e", 'array_shift(${$tag}[0])', $source);
- }
+ return $source;
+}
+
+// }}}
+// {{{ function wiki_include
+
+function wiki_include($source, &$smarty)
+{
+ return preg_replace('/\{include( [^}]*)? wiki=([^} ]+)(.*?)\}/ui',
+ '{include\1 file="../spool/wiki.d/cache_\2.tpl"\3 included=1}',
+ $source);
+}
- return $source;
+// }}}
+//{{{ function hasPerm
+
+function if_has_perms($source, &$smarty)
+{
+ $source = preg_replace('/\{if([^}]*) (\!?)hasPerms\(([^)]+)\)([^}]*)\}/',
+ '{if\1 \2$smarty.session.perms->hasFlagCombination(\3)\4}',
+ $source);
+ return preg_replace('/\{if([^}]*) (\!?)hasPerm\(([^)]+)\)([^}]*)\}/',
+ '{if\1 \2($smarty.session.perms && $smarty.session.perms->hasFlag(\3))\4}',
+ $source);
}
// }}}
function form_force_encodings($source, &$smarty)
{
return preg_replace('/<form[^\w]/',
- '\0 accept-charset="iso-8859-15 latin9 us-ascii ascii" ',
+ '\0 accept-charset="utf-8" ',
$source);
}
function _hide_email($source)
{
$source = str_replace("\n", '', $source);
- return '<script type="text/javascript">Nix.decode("' . addslashes(str_rot13($source)) . '");</script>';
+ return '<script type="text/javascript">//<![CDATA[' . "\n" .
+ 'Nix.decode("' . addslashes(str_rot13($source)) . '");' . "\n" .
+ '//]]></script>';
}
function hide_emails($source, &$smarty)
{
- //prevent email replacement in <script> and <textarea>
- $tags = array('script', 'textarea', 'select');
-
- foreach ($tags as $tag) {
- preg_match_all("!<{$tag}[^>]+>.*?</{$tag}>!is", $source, ${$tag});
- $source = preg_replace("!<{$tag}[^>]+>.*?</{$tag}>!is", "&&&{$tag}&&&", $source);
+ if (!strpos($source, '@')) {
+ return $source;
}
+ //prevent email replacement in <script> and <textarea>
+ $tags = '(script|textarea|select)';
+ preg_match_all("!<$tags.*?>.*?</(\\1)>!ius", $source, $tagsmatches);
+ $source = preg_replace("!<$tags.*?>.*?</(\\1)>!ius", "&&&tags&&&", $source);
+
//catch all emails in <a href="mailto:...">
- preg_match_all("!<a[^>]+href=[\"'][^\"']*[-a-z0-9_.]+@[-a-z0-9_.]+[^\"']*[\"'][^>]*>.*?</a>!is", $source, $ahref);
- $source = preg_replace("!<a[^>]+href=[\"'][^\"']*[-a-z0-9_.]+@[-a-z0-9_.]+[^\"']*[\"'][^>]*>.*?</a>!is", '&&&ahref&&&', $source);
+ preg_match_all("!<a[^>]+href=[\"'][^\"']*[-a-z0-9+_.]+@[-a-z0-9_.]+[^\"']*[\"'].*?>.*?</a>!ius", $source, $ahref);
+ $source = preg_replace("!<a[^>]+href=[\"'][^\"']*[-a-z0-9+_.]+@[-a-z0-9_.]+[^\"']*[\"'].*?>.*?</a>!ius", '&&&ahref&&&', $source);
//prevant replacement in tag attributes
- preg_match_all("!<[^>]+[-a-z0-9_.]+@[-a-z0-9_.]+[^>]+>!is", $source, $misc);
- $source = preg_replace("!<[^>]+[-a-z0-9_.]+@[-a-z0-9_.]+[^>]+>!is", '&&&misc&&&', $source);
+ preg_match_all("!<[^>]+[-a-z0-9_+.]+@[-a-z0-9_.]+.+?>!ius", $source, $misc);
+ $source = preg_replace("!<[^>]+[-a-z0-9_+.]+@[-a-z0-9_.]+.+?>!ius", '&&&misc&&&', $source);
//catch !
- $source = preg_replace('!([-a-z0-9_.]+@[-a-z0-9_.]+)!ie', '_hide_email("\1")', $source);
+ $source = preg_replace('!([-a-z0-9_+.]+@[-a-z0-9_.]+)!iue', '_hide_email("\1")', $source);
$source = preg_replace('!&&&ahref&&&!e', '_hide_email(array_shift($ahref[0]))', $source);
// restore data
$source = preg_replace('!&&&misc&&&!e', 'array_shift($misc[0])', $source);
- foreach ($tags as $tag) {
- $source = preg_replace("!&&&{$tag}&&&!e", 'array_shift(${$tag}[0])', $source);
- }
+ $source = preg_replace("!&&&tags&&&!e", 'array_shift($tagsmatches[0])', $source);
return $source;
}
// }}}
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker:
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
?>