PageRenderTime 64ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/projects/netbeans-7.3/php.editor/test/unit/data/testfiles/actions/testImportData/libs/nette.min.php

https://gitlab.com/essere.lab.public/qualitas.class-corpus
PHP | 2098 lines | 1566 code | 524 blank | 8 comment | 188 complexity | 5a44bf16e54023b9a252250d95d0d383 MD5 | raw file
  1. <?php //netteloader=Nette\Framework
  2. namespace {
  3. /**
  4. * Nette Framework (version 2.0-dev released on 2011-07-02, http://nette.org)
  5. *
  6. * Copyright (c) 2004, 2011 David Grudl (http://davidgrudl.com)
  7. *
  8. * For the full copyright and license information, please view
  9. * the file license.txt that was distributed with this source code.
  10. */
  11. error_reporting(E_ALL | E_STRICT);
  12. @set_magic_quotes_runtime(FALSE);
  13. iconv_set_encoding('internal_encoding', 'UTF-8');
  14. extension_loaded('mbstring') && mb_internal_encoding('UTF-8');
  15. @header('X-Powered-By: Nette Framework');
  16. @header('Content-Type: text/html; charset=utf-8');
  17. define('NETTE', TRUE);
  18. define('NETTE_DIR', __DIR__);
  19. define('NETTE_VERSION_ID', 20000);
  20. define('NETTE_PACKAGE', '5.3');
  21. }
  22. namespace Nette\Diagnostics {
  23. use Nette;
  24. interface IBarPanel
  25. {
  26. function getTab();
  27. function getPanel();
  28. }
  29. }
  30. namespace Nette\Application {
  31. use Nette;
  32. interface IPresenter
  33. {
  34. function run(Request $request);
  35. }
  36. interface IPresenterFactory
  37. {
  38. function getPresenterClass(& $name);
  39. function createPresenter($name);
  40. }
  41. interface IResponse
  42. {
  43. function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse);
  44. }
  45. interface IRouter
  46. {
  47. const ONE_WAY = 1;
  48. const SECURED = 2;
  49. function match(Nette\Http\IRequest $httpRequest);
  50. function constructUrl(Request $appRequest, Nette\Http\Url $refUrl);
  51. }
  52. }
  53. namespace Nette {
  54. use Nette;
  55. interface IFreezable
  56. {
  57. function freeze();
  58. function isFrozen();
  59. }
  60. }
  61. namespace Nette\ComponentModel {
  62. use Nette;
  63. interface IComponent
  64. {
  65. const NAME_SEPARATOR = '-';
  66. function getName();
  67. function getParent();
  68. function setParent(IContainer $parent = NULL, $name = NULL);
  69. }
  70. interface IContainer extends IComponent
  71. {
  72. function addComponent(IComponent $component, $name);
  73. function removeComponent(IComponent $component);
  74. function getComponent($name);
  75. function getComponents($deep = FALSE, $filterType = NULL);
  76. }
  77. }
  78. namespace Nette\Application\UI {
  79. use Nette;
  80. interface ISignalReceiver
  81. {
  82. function signalReceived($signal);
  83. }
  84. interface IStatePersistent
  85. {
  86. function loadState(array $params);
  87. function saveState(array & $params);
  88. }
  89. interface IPartiallyRenderable extends IRenderable
  90. {
  91. }
  92. interface IRenderable
  93. {
  94. function invalidateControl();
  95. function isControlInvalid();
  96. }
  97. }
  98. namespace Nette\Caching {
  99. use Nette;
  100. interface IStorage
  101. {
  102. function read($key);
  103. function write($key, $data, array $dependencies);
  104. function remove($key);
  105. function clean(array $conds);
  106. }
  107. }
  108. namespace Nette\Caching\Storages {
  109. use Nette;
  110. interface IJournal
  111. {
  112. function write($key, array $dependencies);
  113. function clean(array $conditions);
  114. }
  115. }
  116. namespace Nette\Config {
  117. use Nette;
  118. interface IAdapter
  119. {
  120. static function load($file);
  121. static function save($config, $file);
  122. }
  123. }
  124. namespace Nette\Database {
  125. use Nette;
  126. interface ISupplementalDriver
  127. {
  128. function delimite($name);
  129. function formatDateTime(\DateTime $value);
  130. function formatLike($value, $pos);
  131. function applyLimit(&$sql, $limit, $offset);
  132. function normalizeRow($row, $statement);
  133. }
  134. }
  135. namespace Nette\DI {
  136. use Nette;
  137. interface IContainer
  138. {
  139. function addService($name, $service);
  140. function getService($name);
  141. function removeService($name);
  142. function hasService($name);
  143. }
  144. interface IServiceBuilder
  145. {
  146. function createService(IContainer $container);
  147. }
  148. }
  149. namespace Nette\Forms {
  150. use Nette;
  151. interface IControl
  152. {
  153. function loadHttpData();
  154. function setValue($value);
  155. function getValue();
  156. function getRules();
  157. function getErrors();
  158. function isDisabled();
  159. function translate($s, $count = NULL);
  160. }
  161. interface ISubmitterControl extends IControl
  162. {
  163. function isSubmittedBy();
  164. function getValidationScope();
  165. }
  166. interface IFormRenderer
  167. {
  168. function render(Form $form);
  169. }
  170. }
  171. namespace Nette\Http {
  172. use Nette;
  173. interface IRequest
  174. {
  175. const
  176. GET = 'GET',
  177. POST = 'POST',
  178. HEAD = 'HEAD',
  179. PUT = 'PUT',
  180. DELETE = 'DELETE';
  181. function getUrl();
  182. function getQuery($key = NULL, $default = NULL);
  183. function getPost($key = NULL, $default = NULL);
  184. function getFile($key);
  185. function getFiles();
  186. function getCookie($key, $default = NULL);
  187. function getCookies();
  188. function getMethod();
  189. function isMethod($method);
  190. function getHeader($header, $default = NULL);
  191. function getHeaders();
  192. function isSecured();
  193. function isAjax();
  194. function getRemoteAddress();
  195. function getRemoteHost();
  196. }
  197. interface IResponse
  198. {
  199. const PERMANENT = 2116333333;
  200. const BROWSER = 0;
  201. const
  202. S200_OK = 200,
  203. S204_NO_CONTENT = 204,
  204. S300_MULTIPLE_CHOICES = 300,
  205. S301_MOVED_PERMANENTLY = 301,
  206. S302_FOUND = 302,
  207. S303_SEE_OTHER = 303,
  208. S303_POST_GET = 303,
  209. S304_NOT_MODIFIED = 304,
  210. S307_TEMPORARY_REDIRECT= 307,
  211. S400_BAD_REQUEST = 400,
  212. S401_UNAUTHORIZED = 401,
  213. S403_FORBIDDEN = 403,
  214. S404_NOT_FOUND = 404,
  215. S405_METHOD_NOT_ALLOWED = 405,
  216. S410_GONE = 410,
  217. S500_INTERNAL_SERVER_ERROR = 500,
  218. S501_NOT_IMPLEMENTED = 501,
  219. S503_SERVICE_UNAVAILABLE = 503;
  220. function setCode($code);
  221. function getCode();
  222. function setHeader($name, $value);
  223. function addHeader($name, $value);
  224. function setContentType($type, $charset = NULL);
  225. function redirect($url, $code = self::S302_FOUND);
  226. function setExpiration($seconds);
  227. function isSent();
  228. function getHeaders();
  229. function setCookie($name, $value, $expire, $path = NULL, $domain = NULL, $secure = NULL, $httpOnly = NULL);
  230. function deleteCookie($name, $path = NULL, $domain = NULL, $secure = NULL);
  231. }
  232. interface ISessionStorage
  233. {
  234. function open($savePath, $sessionName);
  235. function close();
  236. function read($id);
  237. function write($id, $data);
  238. function remove($id);
  239. function clean($maxlifetime);
  240. }
  241. interface IUser
  242. {
  243. function login();
  244. function logout($clearIdentity = FALSE);
  245. function isLoggedIn();
  246. function getIdentity();
  247. function setAuthenticator(Nette\Security\IAuthenticator $handler);
  248. function getAuthenticator();
  249. function setNamespace($namespace);
  250. function getNamespace();
  251. function getRoles();
  252. function isInRole($role);
  253. function isAllowed();
  254. function setAuthorizator(Nette\Security\IAuthorizator $handler);
  255. function getAuthorizator();
  256. }
  257. }
  258. namespace Nette\Latte {
  259. use Nette;
  260. interface IMacro
  261. {
  262. function initialize();
  263. function finalize();
  264. function nodeOpened(MacroNode $node);
  265. function nodeClosed(MacroNode $node);
  266. }
  267. }
  268. namespace Nette\Localization {
  269. use Nette;
  270. interface ITranslator
  271. {
  272. function translate($message, $count = NULL);
  273. }
  274. }
  275. namespace Nette\Mail {
  276. use Nette;
  277. interface IMailer
  278. {
  279. function send(Message $mail);
  280. }
  281. }
  282. namespace Nette\Reflection {
  283. use Nette;
  284. interface IAnnotation
  285. {
  286. function __construct(array $values);
  287. }
  288. }
  289. namespace Nette\Security {
  290. use Nette;
  291. interface IAuthenticator
  292. {
  293. const USERNAME = 0,
  294. PASSWORD = 1;
  295. const IDENTITY_NOT_FOUND = 1,
  296. INVALID_CREDENTIAL = 2,
  297. FAILURE = 3,
  298. NOT_APPROVED = 4;
  299. function authenticate(array $credentials);
  300. }
  301. interface IAuthorizator
  302. {
  303. const ALL = NULL;
  304. const ALLOW = TRUE;
  305. const DENY = FALSE;
  306. function isAllowed($role, $resource, $privilege);
  307. }
  308. interface IIdentity
  309. {
  310. function getId();
  311. function getRoles();
  312. }
  313. interface IResource
  314. {
  315. function getResourceId();
  316. }
  317. interface IRole
  318. {
  319. function getRoleId();
  320. }
  321. }
  322. namespace Nette\Templating {
  323. use Nette;
  324. interface ITemplate
  325. {
  326. function render();
  327. }
  328. interface IFileTemplate extends ITemplate
  329. {
  330. function setFile($file);
  331. function getFile();
  332. }
  333. }
  334. namespace Nette {
  335. use Nette;
  336. class ArgumentOutOfRangeException extends \InvalidArgumentException
  337. {
  338. }
  339. class InvalidStateException extends \RuntimeException
  340. {
  341. }
  342. class NotImplementedException extends \LogicException
  343. {
  344. }
  345. class NotSupportedException extends \LogicException
  346. {
  347. }
  348. class DeprecatedException extends NotSupportedException
  349. {
  350. }
  351. class MemberAccessException extends \LogicException
  352. {
  353. }
  354. class IOException extends \RuntimeException
  355. {
  356. }
  357. class FileNotFoundException extends IOException
  358. {
  359. }
  360. class DirectoryNotFoundException extends IOException
  361. {
  362. }
  363. class InvalidArgumentException extends \InvalidArgumentException
  364. {
  365. }
  366. class OutOfRangeException extends \OutOfRangeException
  367. {
  368. }
  369. class UnexpectedValueException extends \UnexpectedValueException
  370. {
  371. }
  372. class StaticClassException extends \LogicException
  373. {
  374. }
  375. class FatalErrorException extends \ErrorException
  376. {
  377. function __construct($message, $code, $severity, $file, $line, $context)
  378. {
  379. parent::__construct($message, $code, $severity, $file, $line);
  380. $this->context = $context;
  381. }
  382. }
  383. abstract class Object
  384. {
  385. static function getReflection()
  386. {
  387. return new Reflection\ClassType(get_called_class());
  388. }
  389. function __call($name, $args)
  390. {
  391. return ObjectMixin::call($this, $name, $args);
  392. }
  393. static function __callStatic($name, $args)
  394. {
  395. return ObjectMixin::callStatic(get_called_class(), $name, $args);
  396. }
  397. static function extensionMethod($name, $callback = NULL)
  398. {
  399. if (strpos($name, '::') === FALSE) {
  400. $class = get_called_class();
  401. } else {
  402. list($class, $name) = explode('::', $name);
  403. }
  404. $class = new Reflection\ClassType($class);
  405. if ($callback === NULL) {
  406. return $class->getExtensionMethod($name);
  407. } else {
  408. $class->setExtensionMethod($name, $callback);
  409. }
  410. }
  411. function &__get($name)
  412. {
  413. return ObjectMixin::get($this, $name);
  414. }
  415. function __set($name, $value)
  416. {
  417. return ObjectMixin::set($this, $name, $value);
  418. }
  419. function __isset($name)
  420. {
  421. return ObjectMixin::has($this, $name);
  422. }
  423. function __unset($name)
  424. {
  425. ObjectMixin::remove($this, $name);
  426. }
  427. }
  428. }
  429. namespace Nette\Utils {
  430. use Nette;
  431. final class LimitedScope
  432. {
  433. private static $vars;
  434. final function __construct()
  435. {
  436. throw new Nette\StaticClassException;
  437. }
  438. static function evaluate()
  439. {
  440. if (func_num_args() > 1) {
  441. self::$vars = func_get_arg(1);
  442. extract(self::$vars);
  443. }
  444. $res = eval('?>' . func_get_arg(0));
  445. if ($res === FALSE && ($error = error_get_last()) && $error['type'] === E_PARSE) {
  446. throw new Nette\FatalErrorException($error['message'], 0, $error['type'], $error['file'], $error['line'], NULL);
  447. }
  448. return $res;
  449. }
  450. static function load()
  451. {
  452. if (func_num_args() > 1) {
  453. self::$vars = func_get_arg(1);
  454. extract(self::$vars);
  455. }
  456. return include func_get_arg(0);
  457. }
  458. }
  459. }
  460. namespace Nette\Loaders {
  461. use Nette;
  462. abstract class AutoLoader extends Nette\Object
  463. {
  464. static private $loaders = array();
  465. public static $count = 0;
  466. final static function load($type)
  467. {
  468. foreach (func_get_args() as $type) {
  469. if (!class_exists($type)) {
  470. throw new Nette\InvalidStateException("Unable to load class or interface '$type'.");
  471. }
  472. }
  473. }
  474. final static function getLoaders()
  475. {
  476. return array_values(self::$loaders);
  477. }
  478. function register()
  479. {
  480. if (!function_exists('spl_autoload_register')) {
  481. throw new Nette\NotSupportedException('spl_autoload does not exist in this PHP installation.');
  482. }
  483. spl_autoload_register(array($this, 'tryLoad'));
  484. self::$loaders[spl_object_hash($this)] = $this;
  485. }
  486. function unregister()
  487. {
  488. unset(self::$loaders[spl_object_hash($this)]);
  489. return spl_autoload_unregister(array($this, 'tryLoad'));
  490. }
  491. abstract function tryLoad($type);
  492. }
  493. }
  494. namespace Nette\Diagnostics {
  495. use Nette;
  496. final class Helpers
  497. {
  498. static function editorLink($file, $line)
  499. {
  500. if (Debugger::$editor && is_file($file)) {
  501. $dir = dirname(strtr($file, '/', DIRECTORY_SEPARATOR));
  502. $base = isset($_SERVER['SCRIPT_FILENAME']) ? dirname(dirname(strtr($_SERVER['SCRIPT_FILENAME'], '/', DIRECTORY_SEPARATOR))) : dirname($dir);
  503. if (substr($dir, 0, strlen($base)) === $base) {
  504. $dir = '...' . substr($dir, strlen($base));
  505. }
  506. return Nette\Utils\Html::el('a')
  507. ->href(strtr(Debugger::$editor, array('%file' => rawurlencode($file), '%line' => $line)))
  508. ->title("$file:$line")
  509. ->setHtml(htmlSpecialChars(rtrim($dir, DIRECTORY_SEPARATOR)) . DIRECTORY_SEPARATOR . '<b>' . htmlSpecialChars(basename($file)) . '</b>');
  510. } else {
  511. return Nette\Utils\Html::el('span')->setText($file);
  512. }
  513. }
  514. static function htmlDump(&$var, $level = 0)
  515. {
  516. static $tableUtf, $tableBin, $reBinary = '#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{10FFFF}]#u';
  517. if ($tableUtf === NULL) {
  518. foreach (range("\x00", "\xFF") as $ch) {
  519. if (ord($ch) < 32 && strpos("\r\n\t", $ch) === FALSE) {
  520. $tableUtf[$ch] = $tableBin[$ch] = '\\x' . str_pad(dechex(ord($ch)), 2, '0', STR_PAD_LEFT);
  521. } elseif (ord($ch) < 127) {
  522. $tableUtf[$ch] = $tableBin[$ch] = $ch;
  523. } else {
  524. $tableUtf[$ch] = $ch; $tableBin[$ch] = '\\x' . dechex(ord($ch));
  525. }
  526. }
  527. $tableBin["\\"] = '\\\\';
  528. $tableBin["\r"] = '\\r';
  529. $tableBin["\n"] = '\\n';
  530. $tableBin["\t"] = '\\t';
  531. $tableUtf['\\x'] = $tableBin['\\x'] = '\\\\x';
  532. }
  533. if (is_bool($var)) {
  534. return '<span class="php-bool">' . ($var ? 'TRUE' : 'FALSE') . "</span>\n";
  535. } elseif ($var === NULL) {
  536. return "<span class=\"php-null\">NULL</span>\n";
  537. } elseif (is_int($var)) {
  538. return "<span class=\"php-int\">$var</span>\n";
  539. } elseif (is_float($var)) {
  540. $var = var_export($var, TRUE);
  541. if (strpos($var, '.') === FALSE) {
  542. $var .= '.0';
  543. }
  544. return "<span class=\"php-float\">$var</span>\n";
  545. } elseif (is_string($var)) {
  546. if (Debugger::$maxLen && strlen($var) > Debugger::$maxLen) {
  547. $s = htmlSpecialChars(substr($var, 0, Debugger::$maxLen), ENT_NOQUOTES) . ' ... ';
  548. } else {
  549. $s = htmlSpecialChars($var, ENT_NOQUOTES);
  550. }
  551. $s = strtr($s, preg_match($reBinary, $s) || preg_last_error() ? $tableBin : $tableUtf);
  552. $len = strlen($var);
  553. return "<span class=\"php-string\">\"$s\"</span>" . ($len > 1 ? " ($len)" : "") . "\n";
  554. } elseif (is_array($var)) {
  555. $s = '<span class="php-array">array</span>(' . count($var) . ") ";
  556. $space = str_repeat($space1 = ' ', $level);
  557. $brackets = range(0, count($var) - 1) === array_keys($var) ? "[]" : "{}";
  558. static $marker;
  559. if ($marker === NULL) {
  560. $marker = uniqid("\x00", TRUE);
  561. }
  562. if (empty($var)) {
  563. } elseif (isset($var[$marker])) {
  564. $brackets = $var[$marker];
  565. $s .= "$brackets[0] *RECURSION* $brackets[1]";
  566. } elseif ($level < Debugger::$maxDepth || !Debugger::$maxDepth) {
  567. $s .= "<code>$brackets[0]\n";
  568. $var[$marker] = $brackets;
  569. foreach ($var as $k => &$v) {
  570. if ($k === $marker) {
  571. continue;
  572. }
  573. $k = strtr($k, preg_match($reBinary, $k) || preg_last_error() ? $tableBin : $tableUtf);
  574. $k = htmlSpecialChars(preg_match('#^\w+$#', $k) ? $k : "\"$k\"");
  575. $s .= "$space$space1<span class=\"php-key\">$k</span> => " . self::htmlDump($v, $level + 1);
  576. }
  577. unset($var[$marker]);
  578. $s .= "$space$brackets[1]</code>";
  579. } else {
  580. $s .= "$brackets[0] ... $brackets[1]";
  581. }
  582. return $s . "\n";
  583. } elseif (is_object($var)) {
  584. if ($var instanceof \Closure) {
  585. $rc = new \ReflectionFunction($var);
  586. $arr = array();
  587. foreach ($rc->getParameters() as $param) {
  588. $arr[] = '$' . $param->getName();
  589. }
  590. $arr = array('file' => $rc->getFileName(), 'line' => $rc->getStartLine(), 'parameters' => implode(', ', $arr));
  591. } else {
  592. $arr = (array) $var;
  593. }
  594. $s = '<span class="php-object">' . get_class($var) . "</span>(" . count($arr) . ") ";
  595. $space = str_repeat($space1 = ' ', $level);
  596. static $list = array();
  597. if (empty($arr)) {
  598. } elseif (in_array($var, $list, TRUE)) {
  599. $s .= "{ *RECURSION* }";
  600. } elseif ($level < Debugger::$maxDepth || !Debugger::$maxDepth || $var instanceof \Closure) {
  601. $s .= "<code>{\n";
  602. $list[] = $var;
  603. foreach ($arr as $k => &$v) {
  604. $m = '';
  605. if ($k[0] === "\x00") {
  606. $m = ' <span class="php-visibility">' . ($k[1] === '*' ? 'protected' : 'private') . '</span>';
  607. $k = substr($k, strrpos($k, "\x00") + 1);
  608. }
  609. $k = strtr($k, preg_match($reBinary, $k) || preg_last_error() ? $tableBin : $tableUtf);
  610. $k = htmlSpecialChars(preg_match('#^\w+$#', $k) ? $k : "\"$k\"");
  611. $s .= "$space$space1<span class=\"php-key\">$k</span>$m => " . self::htmlDump($v, $level + 1);
  612. }
  613. array_pop($list);
  614. $s .= "$space}</code>";
  615. } else {
  616. $s .= "{ ... }";
  617. }
  618. return $s . "\n";
  619. } elseif (is_resource($var)) {
  620. return '<span class="php-resource">' . htmlSpecialChars(get_resource_type($var)) . " resource</span>\n";
  621. } else {
  622. return "<span>unknown type</span>\n";
  623. }
  624. }
  625. static function clickableDump($dump)
  626. {
  627. return '<pre class="nette-dump">' . preg_replace_callback(
  628. '#^( *)((?>[^(]{1,200}))\((\d+)\) <code>#m',
  629. function ($m) {
  630. return "$m[1]<a href='#' rel='next'>$m[2]($m[3]) "
  631. . (trim($m[1]) || $m[3] < 7
  632. ? '<abbr>&#x25bc;</abbr> </a><code>'
  633. : '<abbr>&#x25ba;</abbr> </a><code class="nette-collapsed">');
  634. },
  635. self::htmlDump($dump)
  636. ) . '</pre>';
  637. }
  638. }
  639. }
  640. namespace Nette\Utils {
  641. use Nette;
  642. class Html extends Nette\Object implements \ArrayAccess, \Countable, \IteratorAggregate
  643. {
  644. private $name;
  645. private $isEmpty;
  646. public $attrs = array();
  647. protected $children = array();
  648. public static $xhtml = TRUE;
  649. public static $emptyElements = array('img'=>1,'hr'=>1,'br'=>1,'input'=>1,'meta'=>1,'area'=>1,'embed'=>1,'keygen'=>1,
  650. 'source'=>1,'base'=>1,'col'=>1,'link'=>1,'param'=>1,'basefont'=>1,'frame'=>1,'isindex'=>1,'wbr'=>1,'command'=>1);
  651. static function el($name = NULL, $attrs = NULL)
  652. {
  653. $el = new static;
  654. $parts = explode(' ', $name, 2);
  655. $el->setName($parts[0]);
  656. if (is_array($attrs)) {
  657. $el->attrs = $attrs;
  658. } elseif ($attrs !== NULL) {
  659. $el->setText($attrs);
  660. }
  661. if (isset($parts[1])) {
  662. foreach (Strings::matchAll($parts[1] . ' ', '#([a-z0-9:-]+)(?:=(["\'])?(.*?)(?(2)\\2|\s))?#i') as $m) {
  663. $el->attrs[$m[1]] = isset($m[3]) ? $m[3] : TRUE;
  664. }
  665. }
  666. return $el;
  667. }
  668. final function setName($name, $isEmpty = NULL)
  669. {
  670. if ($name !== NULL && !is_string($name)) {
  671. throw new Nette\InvalidArgumentException("Name must be string or NULL, " . gettype($name) ." given.");
  672. }
  673. $this->name = $name;
  674. $this->isEmpty = $isEmpty === NULL ? isset(self::$emptyElements[$name]) : (bool) $isEmpty;
  675. return $this;
  676. }
  677. final function getName()
  678. {
  679. return $this->name;
  680. }
  681. final function isEmpty()
  682. {
  683. return $this->isEmpty;
  684. }
  685. function addAttributes(array $attrs)
  686. {
  687. $this->attrs = $attrs + $this->attrs;
  688. return $this;
  689. }
  690. final function __set($name, $value)
  691. {
  692. $this->attrs[$name] = $value;
  693. }
  694. final function &__get($name)
  695. {
  696. return $this->attrs[$name];
  697. }
  698. final function __unset($name)
  699. {
  700. unset($this->attrs[$name]);
  701. }
  702. final function __call($m, $args)
  703. {
  704. $p = substr($m, 0, 3);
  705. if ($p === 'get' || $p === 'set' || $p === 'add') {
  706. $m = substr($m, 3);
  707. $m[0] = $m[0] | "\x20";
  708. if ($p === 'get') {
  709. return isset($this->attrs[$m]) ? $this->attrs[$m] : NULL;
  710. } elseif ($p === 'add') {
  711. $args[] = TRUE;
  712. }
  713. }
  714. if (count($args) === 0) {
  715. } elseif (count($args) === 1) {
  716. $this->attrs[$m] = $args[0];
  717. } elseif ((string) $args[0] === '') {
  718. $tmp = & $this->attrs[$m];
  719. } elseif (!isset($this->attrs[$m]) || is_array($this->attrs[$m])) {
  720. $this->attrs[$m][$args[0]] = $args[1];
  721. } else {
  722. $this->attrs[$m] = array($this->attrs[$m], $args[0] => $args[1]);
  723. }
  724. return $this;
  725. }
  726. final function href($path, $query = NULL)
  727. {
  728. if ($query) {
  729. $query = http_build_query($query, NULL, '&');
  730. if ($query !== '') {
  731. $path .= '?' . $query;
  732. }
  733. }
  734. $this->attrs['href'] = $path;
  735. return $this;
  736. }
  737. final function setHtml($html)
  738. {
  739. if ($html === NULL) {
  740. $html = '';
  741. } elseif (is_array($html)) {
  742. throw new Nette\InvalidArgumentException("Textual content must be a scalar, " . gettype($html) ." given.");
  743. } else {
  744. $html = (string) $html;
  745. }
  746. $this->removeChildren();
  747. $this->children[] = $html;
  748. return $this;
  749. }
  750. final function getHtml()
  751. {
  752. $s = '';
  753. foreach ($this->children as $child) {
  754. if (is_object($child)) {
  755. $s .= $child->render();
  756. } else {
  757. $s .= $child;
  758. }
  759. }
  760. return $s;
  761. }
  762. final function setText($text)
  763. {
  764. if (!is_array($text)) {
  765. $text = htmlspecialchars((string) $text, ENT_NOQUOTES);
  766. }
  767. return $this->setHtml($text);
  768. }
  769. final function getText()
  770. {
  771. return html_entity_decode(strip_tags($this->getHtml()), ENT_QUOTES, 'UTF-8');
  772. }
  773. final function add($child)
  774. {
  775. return $this->insert(NULL, $child);
  776. }
  777. final function create($name, $attrs = NULL)
  778. {
  779. $this->insert(NULL, $child = static::el($name, $attrs));
  780. return $child;
  781. }
  782. function insert($index, $child, $replace = FALSE)
  783. {
  784. if ($child instanceof Html || is_scalar($child)) {
  785. if ($index === NULL) {
  786. $this->children[] = $child;
  787. } else {
  788. array_splice($this->children, (int) $index, $replace ? 1 : 0, array($child));
  789. }
  790. } else {
  791. throw new Nette\InvalidArgumentException("Child node must be scalar or Html object, " . (is_object($child) ? get_class($child) : gettype($child)) ." given.");
  792. }
  793. return $this;
  794. }
  795. final function offsetSet($index, $child)
  796. {
  797. $this->insert($index, $child, TRUE);
  798. }
  799. final function offsetGet($index)
  800. {
  801. return $this->children[$index];
  802. }
  803. final function offsetExists($index)
  804. {
  805. return isset($this->children[$index]);
  806. }
  807. function offsetUnset($index)
  808. {
  809. if (isset($this->children[$index])) {
  810. array_splice($this->children, (int) $index, 1);
  811. }
  812. }
  813. final function count()
  814. {
  815. return count($this->children);
  816. }
  817. function removeChildren()
  818. {
  819. $this->children = array();
  820. }
  821. final function getIterator($deep = FALSE)
  822. {
  823. if ($deep) {
  824. $deep = $deep > 0 ? \RecursiveIteratorIterator::SELF_FIRST : \RecursiveIteratorIterator::CHILD_FIRST;
  825. return new \RecursiveIteratorIterator(new Nette\Iterators\Recursor(new \ArrayIterator($this->children)), $deep);
  826. } else {
  827. return new Nette\Iterators\Recursor(new \ArrayIterator($this->children));
  828. }
  829. }
  830. final function getChildren()
  831. {
  832. return $this->children;
  833. }
  834. final function render($indent = NULL)
  835. {
  836. $s = $this->startTag();
  837. if (!$this->isEmpty) {
  838. if ($indent !== NULL) {
  839. $indent++;
  840. }
  841. foreach ($this->children as $child) {
  842. if (is_object($child)) {
  843. $s .= $child->render($indent);
  844. } else {
  845. $s .= $child;
  846. }
  847. }
  848. $s .= $this->endTag();
  849. }
  850. if ($indent !== NULL) {
  851. return "\n" . str_repeat("\t", $indent - 1) . $s . "\n" . str_repeat("\t", max(0, $indent - 2));
  852. }
  853. return $s;
  854. }
  855. final function __toString()
  856. {
  857. return $this->render();
  858. }
  859. final function startTag()
  860. {
  861. if ($this->name) {
  862. return '<' . $this->name . $this->attributes() . (self::$xhtml && $this->isEmpty ? ' />' : '>');
  863. } else {
  864. return '';
  865. }
  866. }
  867. final function endTag()
  868. {
  869. return $this->name && !$this->isEmpty ? '</' . $this->name . '>' : '';
  870. }
  871. final function attributes()
  872. {
  873. if (!is_array($this->attrs)) {
  874. return '';
  875. }
  876. $s = '';
  877. foreach ($this->attrs as $key => $value) {
  878. if ($value === NULL || $value === FALSE) {
  879. continue;
  880. } elseif ($value === TRUE) {
  881. if (self::$xhtml) {
  882. $s .= ' ' . $key . '="' . $key . '"';
  883. } else {
  884. $s .= ' ' . $key;
  885. }
  886. continue;
  887. } elseif (is_array($value)) {
  888. if ($key === 'data') {
  889. foreach ($value as $k => $v) {
  890. if ($v !== NULL && $v !== FALSE) {
  891. $s .= ' data-' . $k . '="' . htmlspecialchars((string) $v) . '"';
  892. }
  893. }
  894. continue;
  895. }
  896. $tmp = NULL;
  897. foreach ($value as $k => $v) {
  898. if ($v != NULL) {
  899. $tmp[] = $v === TRUE ? $k : (is_string($k) ? $k . ':' . $v : $v);
  900. }
  901. }
  902. if ($tmp === NULL) {
  903. continue;
  904. }
  905. $value = implode($key === 'style' || !strncmp($key, 'on', 2) ? ';' : ' ', $tmp);
  906. } else {
  907. $value = (string) $value;
  908. }
  909. $s .= ' ' . $key . '="' . htmlspecialchars($value) . '"';
  910. }
  911. $s = str_replace('@', '&#64;', $s);
  912. return $s;
  913. }
  914. function __clone()
  915. {
  916. foreach ($this->children as $key => $value) {
  917. if (is_object($value)) {
  918. $this->children[$key] = clone $value;
  919. }
  920. }
  921. }
  922. }
  923. }
  924. namespace Nette\Diagnostics {
  925. use Nette;
  926. final class Debugger
  927. {
  928. public static $productionMode;
  929. public static $consoleMode;
  930. public static $time;
  931. private static $ajaxDetected;
  932. public static $source;
  933. public static $editor = 'editor://open/?file=%file&line=%line';
  934. public static $maxDepth = 3;
  935. public static $maxLen = 150;
  936. public static $showLocation = FALSE;
  937. const DEVELOPMENT = FALSE,
  938. PRODUCTION = TRUE,
  939. DETECT = NULL;
  940. public static $blueScreen;
  941. public static $strictMode = FALSE;
  942. public static $scream = FALSE;
  943. public static $onFatalError = array();
  944. private static $enabled = FALSE;
  945. private static $lastError = FALSE;
  946. public static $logger;
  947. public static $fireLogger;
  948. public static $logDirectory;
  949. public static $email;
  950. public static $mailer;
  951. public static $emailSnooze;
  952. public static $bar;
  953. private static $errorPanel;
  954. private static $dumpPanel;
  955. const DEBUG = 'debug',
  956. INFO = 'info',
  957. WARNING = 'warning',
  958. ERROR = 'error',
  959. CRITICAL = 'critical';
  960. final function __construct()
  961. {
  962. throw new Nette\StaticClassException;
  963. }
  964. static function _init()
  965. {
  966. self::$time = microtime(TRUE);
  967. self::$consoleMode = PHP_SAPI === 'cli';
  968. self::$productionMode = self::DETECT;
  969. if (self::$consoleMode) {
  970. self::$source = empty($_SERVER['argv']) ? 'cli' : 'cli: ' . implode(' ', $_SERVER['argv']);
  971. } else {
  972. self::$ajaxDetected = isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
  973. if (isset($_SERVER['REQUEST_URI'])) {
  974. self::$source = (isset($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'off') ? 'https://' : 'http://')
  975. . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : ''))
  976. . $_SERVER['REQUEST_URI'];
  977. }
  978. }
  979. self::$logger = new Logger;
  980. self::$logDirectory = & self::$logger->directory;
  981. self::$email = & self::$logger->email;
  982. self::$mailer = & self::$logger->mailer;
  983. self::$emailSnooze = & Logger::$emailSnooze;
  984. self::$fireLogger = new FireLogger;
  985. self::$blueScreen = new BlueScreen;
  986. self::$blueScreen->addPanel(function($e) {
  987. if ($e instanceof Nette\Templating\FilterException) {
  988. return array(
  989. 'tab' => 'Template',
  990. 'panel' => '<p><b>File:</b> ' . Helpers::editorLink($e->sourceFile, $e->sourceLine)
  991. . '&nbsp; <b>Line:</b> ' . ($e->sourceLine ? $e->sourceLine : 'n/a') . '</p>'
  992. . ($e->sourceLine ? '<pre>' . BlueScreen::highlightFile($e->sourceFile, $e->sourceLine) . '</pre>' : '')
  993. );
  994. }
  995. });
  996. self::$bar = new Bar;
  997. self::$bar->addPanel(new DefaultBarPanel('time'));
  998. self::$bar->addPanel(new DefaultBarPanel('memory'));
  999. self::$bar->addPanel(self::$errorPanel = new DefaultBarPanel('errors'));
  1000. self::$bar->addPanel(self::$dumpPanel = new DefaultBarPanel('dumps'));
  1001. }
  1002. static function enable($mode = NULL, $logDirectory = NULL, $email = NULL)
  1003. {
  1004. error_reporting(E_ALL | E_STRICT);
  1005. if (is_bool($mode)) {
  1006. self::$productionMode = $mode;
  1007. } elseif (is_string($mode)) {
  1008. $mode = preg_split('#[,\s]+#', "$mode 127.0.0.1 ::1");
  1009. }
  1010. if (is_array($mode)) {
  1011. self::$productionMode = !isset($_SERVER['REMOTE_ADDR']) || !in_array($_SERVER['REMOTE_ADDR'], $mode, TRUE);
  1012. }
  1013. if (self::$productionMode === self::DETECT) {
  1014. if (isset($_SERVER['SERVER_ADDR']) || isset($_SERVER['LOCAL_ADDR'])) {
  1015. $addrs = array();
  1016. if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  1017. $addrs = preg_split('#,\s*#', $_SERVER['HTTP_X_FORWARDED_FOR']);
  1018. }
  1019. if (isset($_SERVER['REMOTE_ADDR'])) {
  1020. $addrs[] = $_SERVER['REMOTE_ADDR'];
  1021. }
  1022. $addrs[] = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : $_SERVER['LOCAL_ADDR'];
  1023. self::$productionMode = FALSE;
  1024. foreach ($addrs as $addr) {
  1025. $oct = explode('.', $addr);
  1026. if ($addr !== '::1' && (count($oct) !== 4 || ($oct[0] !== '10' && $oct[0] !== '127' && ($oct[0] !== '172' || $oct[1] < 16 || $oct[1] > 31)
  1027. && ($oct[0] !== '169' || $oct[1] !== '254') && ($oct[0] !== '192' || $oct[1] !== '168')))
  1028. ) {
  1029. self::$productionMode = TRUE;
  1030. break;
  1031. }
  1032. }
  1033. } else {
  1034. self::$productionMode = !self::$consoleMode;
  1035. }
  1036. }
  1037. if (is_string($logDirectory)) {
  1038. self::$logDirectory = realpath($logDirectory);
  1039. if (self::$logDirectory === FALSE) {
  1040. throw new Nette\DirectoryNotFoundException("Directory '$logDirectory' is not found.");
  1041. }
  1042. } elseif ($logDirectory === FALSE) {
  1043. self::$logDirectory = FALSE;
  1044. } elseif (self::$logDirectory === NULL) {
  1045. self::$logDirectory = defined('APP_DIR') ? APP_DIR . '/../log' : getcwd() . '/log';
  1046. }
  1047. if (self::$logDirectory) {
  1048. ini_set('error_log', self::$logDirectory . '/php_error.log');
  1049. }
  1050. if (function_exists('ini_set')) {
  1051. ini_set('display_errors', !self::$productionMode);
  1052. ini_set('html_errors', FALSE);
  1053. ini_set('log_errors', FALSE);
  1054. } elseif (ini_get('display_errors') != !self::$productionMode && ini_get('display_errors') !== (self::$productionMode ? 'stderr' : 'stdout')) {
  1055. throw new Nette\NotSupportedException('Function ini_set() must be enabled.');
  1056. }
  1057. if ($email) {
  1058. if (!is_string($email)) {
  1059. throw new Nette\InvalidArgumentException('Email address must be a string.');
  1060. }
  1061. self::$email = $email;
  1062. }
  1063. if (!defined('E_DEPRECATED')) {
  1064. define('E_DEPRECATED', 8192);
  1065. }
  1066. if (!defined('E_USER_DEPRECATED')) {
  1067. define('E_USER_DEPRECATED', 16384);
  1068. }
  1069. if (!self::$enabled) {
  1070. register_shutdown_function(array(__CLASS__, '_shutdownHandler'));
  1071. set_exception_handler(array(__CLASS__, '_exceptionHandler'));
  1072. set_error_handler(array(__CLASS__, '_errorHandler'));
  1073. self::$enabled = TRUE;
  1074. }
  1075. }
  1076. static function isEnabled()
  1077. {
  1078. return self::$enabled;
  1079. }
  1080. static function log($message, $priority = self::INFO)
  1081. {
  1082. if (self::$logDirectory === FALSE) {
  1083. return;
  1084. } elseif (!self::$logDirectory) {
  1085. throw new Nette\InvalidStateException('Logging directory is not specified in Nette\Diagnostics\Debugger::$logDirectory.');
  1086. }
  1087. if ($message instanceof \Exception) {
  1088. $exception = $message;
  1089. $message = "PHP Fatal error: "
  1090. . ($message instanceof Nette\FatalErrorException
  1091. ? $exception->getMessage()
  1092. : "Uncaught exception " . get_class($exception) . " with message '" . $exception->getMessage() . "'")
  1093. . " in " . $exception->getFile() . ":" . $exception->getLine();
  1094. $hash = md5($exception );
  1095. $exceptionFilename = "exception " . @date('Y-m-d H-i-s') . " $hash.html";
  1096. foreach (new \DirectoryIterator(self::$logDirectory) as $entry) {
  1097. if (strpos($entry, $hash)) {
  1098. $exceptionFilename = NULL; break;
  1099. }
  1100. }
  1101. }
  1102. self::$logger->log(array(
  1103. @date('[Y-m-d H-i-s]'),
  1104. $message,
  1105. self::$source ? ' @ ' . self::$source : NULL,
  1106. !empty($exceptionFilename) ? ' @@ ' . $exceptionFilename : NULL
  1107. ), $priority);
  1108. if (!empty($exceptionFilename) && $logHandle = @fopen(self::$logDirectory . '/'. $exceptionFilename, 'w')) {
  1109. ob_start();
  1110. ob_start(function($buffer) use($logHandle) { fwrite($logHandle, $buffer); }, 1);
  1111. self::$blueScreen->render($exception);
  1112. ob_end_flush();
  1113. ob_end_clean();
  1114. fclose($logHandle);
  1115. }
  1116. }
  1117. static function _shutdownHandler()
  1118. {
  1119. if (!self::$enabled) {
  1120. return;
  1121. }
  1122. static $types = array(
  1123. E_ERROR => 1,
  1124. E_CORE_ERROR => 1,
  1125. E_COMPILE_ERROR => 1,
  1126. E_PARSE => 1,
  1127. );
  1128. $error = error_get_last();
  1129. if (isset($types[$error['type']])) {
  1130. self::_exceptionHandler(new Nette\FatalErrorException($error['message'], 0, $error['type'], $error['file'], $error['line'], NULL));
  1131. }
  1132. if (self::$bar && !self::$productionMode && self::isHtmlMode()) {
  1133. self::$bar->render();
  1134. }
  1135. }
  1136. static function _exceptionHandler(\Exception $exception)
  1137. {
  1138. if (!headers_sent()) {
  1139. header('HTTP/1.1 500 Internal Server Error');
  1140. }
  1141. try {
  1142. if (self::$productionMode) {
  1143. self::log($exception, self::ERROR);
  1144. if (self::$consoleMode) {
  1145. echo "ERROR: the server encountered an internal error and was unable to complete your request.\n";
  1146. } elseif (self::isHtmlMode()) {
  1147. ?>
  1148. <!DOCTYPE html>
  1149. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  1150. <meta name=robots content=noindex><meta name=generator content="Nette Framework">
  1151. <style>body{color:#333;background:white;width:500px;margin:100px auto}h1{font:bold 47px/1.5 sans-serif;margin:.6em 0}p{font:21px/1.5 Georgia,serif;margin:1.5em 0}small{font-size:70%;color:gray}</style>
  1152. <title>Server Error</title>
  1153. <h1>Server Error</h1>
  1154. <p>We're sorry! The server encountered an internal error and was unable to complete your request. Please try again later.</p>
  1155. <p><small>error 500</small></p>
  1156. <?php
  1157. }
  1158. } else {
  1159. if (self::$consoleMode) {
  1160. echo "$exception\n";
  1161. } elseif (self::isHtmlMode()) {
  1162. self::$blueScreen->render($exception);
  1163. if (self::$bar) {
  1164. self::$bar->render();
  1165. }
  1166. } elseif (!self::fireLog($exception, self::ERROR)) {
  1167. self::log($exception);
  1168. }
  1169. }
  1170. foreach (self::$onFatalError as $handler) {
  1171. call_user_func($handler, $exception);
  1172. }
  1173. } catch (\Exception $e) {
  1174. echo "\nNette\\Debug FATAL ERROR: thrown ", get_class($e), ': ', $e->getMessage(),
  1175. "\nwhile processing ", get_class($exception), ': ', $exception->getMessage(), "\n";
  1176. }
  1177. self::$enabled = FALSE;
  1178. exit(255);
  1179. }
  1180. static function _errorHandler($severity, $message, $file, $line, $context)
  1181. {
  1182. if (self::$scream) {
  1183. error_reporting(E_ALL | E_STRICT);
  1184. }
  1185. if (self::$lastError !== FALSE && ($severity & error_reporting()) === $severity) {
  1186. self::$lastError = new \ErrorException($message, 0, $severity, $file, $line);
  1187. return NULL;
  1188. }
  1189. if ($severity === E_RECOVERABLE_ERROR || $severity === E_USER_ERROR) {
  1190. throw new Nette\FatalErrorException($message, 0, $severity, $file, $line, $context);
  1191. } elseif (($severity & error_reporting()) !== $severity) {
  1192. return FALSE;
  1193. } elseif (self::$strictMode && !self::$productionMode) {
  1194. self::_exceptionHandler(new Nette\FatalErrorException($message, 0, $severity, $file, $line, $context));
  1195. }
  1196. static $types = array(
  1197. E_WARNING => 'Warning',
  1198. E_COMPILE_WARNING => 'Warning',
  1199. E_USER_WARNING => 'Warning',
  1200. E_NOTICE => 'Notice',
  1201. E_USER_NOTICE => 'Notice',
  1202. E_STRICT => 'Strict standards',
  1203. E_DEPRECATED => 'Deprecated',
  1204. E_USER_DEPRECATED => 'Deprecated',
  1205. );
  1206. $message = 'PHP ' . (isset($types[$severity]) ? $types[$severity] : 'Unknown error') . ": $message";
  1207. $count = & self::$errorPanel->data["$message|$file|$line"];
  1208. if ($count++) {
  1209. return NULL;
  1210. } elseif (self::$productionMode) {
  1211. self::log("$message in $file:$line", self::ERROR);
  1212. return NULL;
  1213. } else {
  1214. $ok = self::fireLog(new \ErrorException($message, 0, $severity, $file, $line), self::WARNING);
  1215. return !self::isHtmlMode() || (!self::$bar && !$ok) ? FALSE : NULL;
  1216. }
  1217. return FALSE;
  1218. }
  1219. static function toStringException(\Exception $exception)
  1220. {
  1221. if (self::$enabled) {
  1222. self::_exceptionHandler($exception);
  1223. } else {
  1224. trigger_error($exception->getMessage(), E_USER_ERROR);
  1225. }
  1226. }
  1227. static function tryError()
  1228. {
  1229. if (!self::$enabled && self::$lastError === FALSE) {
  1230. set_error_handler(array(__CLASS__, '_errorHandler'));
  1231. }
  1232. self::$lastError = NULL;
  1233. }
  1234. static function catchError(& $error)
  1235. {
  1236. if (!self::$enabled && self::$lastError !== FALSE) {
  1237. restore_error_handler();
  1238. }
  1239. $error = self::$lastError;
  1240. self::$lastError = FALSE;
  1241. return (bool) $error;
  1242. }
  1243. static function dump($var, $return = FALSE)
  1244. {
  1245. if (!$return && self::$productionMode) {
  1246. return $var;
  1247. }
  1248. $output = "<pre class=\"nette-dump\">" . Helpers::htmlDump($var) . "</pre>\n";
  1249. if (!$return) {
  1250. $trace = debug_backtrace();
  1251. $i = !isset($trace[1]['class']) && isset($trace[1]['function']) && $trace[1]['function'] === 'dump' ? 1 : 0;
  1252. if (isset($trace[$i]['file'], $trace[$i]['line']) && is_file($trace[$i]['file'])) {
  1253. $lines = file($trace[$i]['file']);
  1254. preg_match('#dump\((.*)\)#', $lines[$trace[$i]['line'] - 1], $m);
  1255. $output = substr_replace(
  1256. $output,
  1257. ' title="' . htmlspecialchars((isset($m[0]) ? "$m[0] \n" : '') . "in file {$trace[$i]['file']} on line {$trace[$i]['line']}") . '"',
  1258. 4, 0);
  1259. if (self::$showLocation) {
  1260. $output = substr_replace(
  1261. $output,
  1262. ' <small>in ' . Helpers::editorLink($trace[$i]['file'], $trace[$i]['line']) . ":{$trace[$i]['line']}</small>",
  1263. -8, 0);
  1264. }
  1265. }
  1266. }
  1267. if (self::$consoleMode) {
  1268. $output = htmlspecialchars_decode(strip_tags($output), ENT_NOQUOTES);
  1269. }
  1270. if ($return) {
  1271. return $output;
  1272. } else {
  1273. echo $output;
  1274. return $var;
  1275. }
  1276. }
  1277. static function timer($name = NULL)
  1278. {
  1279. static $time = array();
  1280. $now = microtime(TRUE);
  1281. $delta = isset($time[$name]) ? $now - $time[$name] : 0;
  1282. $time[$name] = $now;
  1283. return $delta;
  1284. }
  1285. static function barDump($var, $title = NULL)
  1286. {
  1287. if (!self::$productionMode) {
  1288. $dump = array();
  1289. foreach ((is_array($var) ? $var : array('' => $var)) as $key => $val) {
  1290. $dump[$key] = Helpers::clickableDump($val);
  1291. }
  1292. self::$dumpPanel->data[] = array('title' => $title, 'dump' => $dump);
  1293. }
  1294. return $var;
  1295. }
  1296. static function fireLog($message)
  1297. {
  1298. if (!self::$productionMode) {
  1299. return self::$fireLogger->log($message);
  1300. }
  1301. }
  1302. private static function isHtmlMode()
  1303. {
  1304. return !self::$ajaxDetected && !self::$consoleMode
  1305. && !preg_match('#^Content-Type: (?!text/html)#im', implode("\n", headers_list()));
  1306. }
  1307. static function addPanel(IBarPanel $panel, $id = NULL)
  1308. {
  1309. self::$bar->addPanel($panel, $id);
  1310. }
  1311. }
  1312. class Logger extends Nette\Object
  1313. {
  1314. const DEBUG = 'debug',
  1315. INFO = 'info',
  1316. WARNING = 'warning',
  1317. ERROR = 'error',
  1318. CRITICAL = 'critical';
  1319. public static $emailSnooze = 172800;
  1320. public $mailer = array(__CLASS__, 'defaultMailer');
  1321. public $directory;
  1322. public $email;
  1323. function log($message, $priority = self::INFO)
  1324. {
  1325. if (!is_dir($this->directory)) {
  1326. throw new Nette\DirectoryNotFoundException("Directory '$this->directory' is not found or is not directory.");
  1327. }
  1328. if (is_array($message)) {
  1329. $message = implode(' ', $message);
  1330. }
  1331. $res = error_log(trim($message) . PHP_EOL, 3, $this->directory . '/' . strtolower($priority) . '.log');
  1332. if (($priority === self::ERROR || $priority === self::CRITICAL) && $this->email && $this->mailer
  1333. && @filemtime($this->directory . '/email-sent') + self::$emailSnooze < time()
  1334. && @file_put_contents($this->directory . '/email-sent', 'sent')
  1335. ) {
  1336. call_user_func($this->mailer, $message, $this->email);
  1337. }
  1338. return $res;
  1339. }
  1340. private static function defaultMailer($message, $email)
  1341. {
  1342. $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] :
  1343. (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '');
  1344. $parts = str_replace(
  1345. array("\r\n", "\n"),
  1346. array("\n", PHP_EOL),
  1347. array(
  1348. 'headers' => "From: noreply@$host\nX-Mailer: Nette Framework\n",
  1349. 'subject' => "PHP: An error occurred on the server $host",
  1350. 'body' => "[" . @date('Y-m-d H:i:s') . "] $message",
  1351. )
  1352. );
  1353. mail($email, $parts['subject'], $parts['body'], $parts['headers']);
  1354. }
  1355. }
  1356. class FireLogger extends Nette\Object
  1357. {
  1358. const DEBUG = 'debug',
  1359. INFO = 'info',
  1360. WARNING = 'warning',
  1361. ERROR = 'error',
  1362. CRITICAL = 'critical';
  1363. private static $payload = array('logs' => array());
  1364. static function log($message, $priority = self::DEBUG)
  1365. {
  1366. if (!isset($_SERVER['HTTP_X_FIRELOGGER']) || headers_sent()) {
  1367. return FALSE;
  1368. }
  1369. $item = array(
  1370. 'name' => 'PHP',
  1371. 'level' => $priority,
  1372. 'order' => count(self::$payload['logs']),
  1373. 'time' => str_pad(number_format((microtime(TRUE) - Debugger::$time) * 1000, 1, '.', ' '), 8, '0', STR_PAD_LEFT) . ' ms',
  1374. 'template' => '',
  1375. 'message' => '',
  1376. 'style' => 'background:#767ab6',
  1377. );
  1378. $args = func_get_args();
  1379. if (isset($args[0]) && is_string($args[0])) {
  1380. $item['template'] = array_shift($args);
  1381. }
  1382. if (isset($args[0]) && $args[0] instanceof \Exception) {
  1383. $e = array_shift($args);
  1384. $trace = $e->getTrace();
  1385. if (isset($trace[0]['class']) && $trace[0]['class'] === 'Nette\Diagnostics\Debugger'
  1386. && ($trace[0]['function'] === '_shutdownHandler' || $trace[0]['function'] === '_errorHandler')
  1387. ) {
  1388. unset($trace[0]);
  1389. }
  1390. $file = str_replace(dirname(dirname(dirname($e->getFile()))), "\xE2\x80\xA6", $e->getFile());
  1391. $item['template'] = ($e instanceof \ErrorException ? '' : get_class($e) . ': ')
  1392. . $e->getMessage() . ($e->getCode() ? ' #' . $e->getCode() : '') . ' in ' . $file . ':' . $e->getLine();
  1393. $item['pathname'] = $e->getFile();
  1394. $item['lineno'] = $e->getLine();
  1395. } else {
  1396. $trace = debug_backtrace();
  1397. if (isset($trace[1]['class']) && $trace[1]['class'] === 'Nette\Diagnostics\Debugger'
  1398. && ($trace[1]['function'] === 'fireLog')
  1399. ) {
  1400. unset($trace[0]);
  1401. }
  1402. foreach ($trace as $frame) {
  1403. if (isset($frame['file']) && is_file($frame['file'])) {
  1404. $item['pathname'] = $frame['file'];
  1405. $item['lineno'] = $frame['line'];
  1406. break;
  1407. }
  1408. }
  1409. }
  1410. $item['exc_info'] = array('', '', array());
  1411. $item['exc_frames'] = array();
  1412. foreach ($trace as $frame) {
  1413. $frame += array('file' => NULL, 'line' => NULL, 'class' => NULL, 'type' => NULL, 'function' => NULL, 'object' => NULL, 'args' => NULL);
  1414. $item['exc_info'][2][] = array($frame['file'], $frame['line'], "$frame[class]$frame[type]$frame[function]", $frame['object']);
  1415. $item['exc_frames'][] = $frame['args'];
  1416. }
  1417. if (isset($args[0]) && in_array($args[0], array(self::DEBUG, self::INFO, self::WARNING, self::ERROR, self::CRITICAL), TRUE)) {
  1418. $item['level'] = array_shift($args);
  1419. }
  1420. $item['args'] = $args;
  1421. self::$payload['logs'][] = self::jsonDump($item, -1);
  1422. foreach (str_split(base64_encode(@json_encode(self::$payload)), 4990) as $k => $v) {
  1423. header("FireLogger-de11e-$k:$v");
  1424. }
  1425. return TRUE;
  1426. }
  1427. private static function jsonDump(&$var, $level = 0)
  1428. {
  1429. if (is_bool($var) || is_null($var) || is_int($var) || is_float($var)) {
  1430. return $var;
  1431. } elseif (is_string($var)) {
  1432. if (Debugger::$maxLen && strlen($var) > Debugger::$maxLen) {
  1433. $var = substr($var, 0, Debugger::$maxLen) . " \xE2\x80\xA6 ";
  1434. }
  1435. return Nette\Utils\Strings::fixEncoding($var);
  1436. } elseif (is_array($var)) {
  1437. static $marker;
  1438. if ($marker === NULL) {
  1439. $marker = uniqid("\x00", TRUE);
  1440. }
  1441. if (isset($var[$marker])) {
  1442. return "\xE2\x80\xA6RECURSION\xE2\x80\xA6";
  1443. } elseif ($level < Debugger::$maxDepth || !Debugger::$maxDepth) {
  1444. $var[$marker] = TRUE;
  1445. $res = array();
  1446. foreach ($var as $k => &$v) {
  1447. if ($k !== $marker) {
  1448. $res[self::jsonDump($k)] = self::jsonDump($v, $level + 1);
  1449. }
  1450. }
  1451. unset($var[$marker]);
  1452. return $res;
  1453. } else {
  1454. return " \xE2\x80\xA6 ";
  1455. }
  1456. } elseif (is_object($var)) {
  1457. $arr = (array) $var;
  1458. static $list = array();
  1459. if (in_array($var, $list, TRUE)) {
  1460. return "\xE2\x80\xA6RECURSION\xE2\x80\xA6";
  1461. } elseif ($level < Debugger::$maxDepth || !Debugger::$maxDepth) {
  1462. $list[] = $var;
  1463. $res = array("\x00" => '(object) ' . get_class($var));
  1464. foreach ($arr as $k => &$v) {
  1465. if ($k[0] === "\x00") {
  1466. $k = substr($k, strrpos($k, "\x00") + 1);
  1467. }
  1468. $res[self::jsonDump($k)] = self::jsonDump($v, $level + 1);
  1469. }
  1470. array_pop($list);
  1471. return $res;
  1472. } else {
  1473. return " \xE2\x80\xA6 ";
  1474. }
  1475. } elseif (is_resource($var)) {
  1476. return "resource " . get_resource_type($var);
  1477. } else {
  1478. return "unknown type";
  1479. }
  1480. }
  1481. }
  1482. class BlueScreen extends Nette\Object
  1483. {
  1484. private $panels = array();
  1485. function addPanel($panel, $id = NULL)
  1486. {
  1487. if ($id === NULL) {
  1488. $this->panels[] = $panel;
  1489. } else {
  1490. $this->panels[$id] = $panel;
  1491. }
  1492. }
  1493. function render(\Exception $exception)
  1494. {
  1495. $panels = $this->panels;
  1496. static $errorTypes = array(
  1497. E_ERROR => 'Fatal Error',
  1498. E_USER_ERROR => 'User Error',
  1499. E_RECOVERABLE_ERROR => 'Recoverable Error',
  1500. E_CORE_ERROR => 'Core Error',
  1501. E_COMPILE_ERROR => 'Compile Error',
  1502. E_PARSE => 'Parse Error',
  1503. E_WARNING => 'Warning',
  1504. E_CORE_WARNING => 'Core Warning',
  1505. E_COMPILE_WARNING => 'Compile Warning',
  1506. E_USER_WARNING => 'User Warning',
  1507. E_NOTICE => 'Notice',
  1508. E_USER_NOTICE => 'User Notice',
  1509. E_STRICT => 'Strict',
  1510. E_DEPRECATED => 'Deprecated',
  1511. E_USER_DEPRECATED => 'User Deprecated',
  1512. );
  1513. $title = ($exception instanceof Nette\FatalErrorException && isset($errorTypes[$exception->getSeverity()])) ? $errorTypes[$exception->getSeverity()] : get_class($exception);
  1514. $expandPath = NETTE_DIR . DIRECTORY_SEPARATOR;
  1515. $counter = 0;
  1516. ?><!-- "' --></script></style></pre></xmp></table>
  1517. <!DOCTYPE html>
  1518. <html>
  1519. <head>
  1520. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  1521. <meta name="robots" content="noindex,noarchive">
  1522. <meta name="generator" content="Nette Framework">
  1523. <title><?php echo htmlspecialchars($title) ?></title><!-- <?php
  1524. $ex = $exception; echo $ex->getMessage(), ($ex->getCode() ? ' #' . $ex->getCode() : '');
  1525. while ((method_exists($ex, 'getPrevious') && $ex = $ex->getPrevious()) || (isset($ex->previous) && $ex = $ex->previous)) echo '; caused by ', get_class($ex), ' ', $ex->getMessage(), ($ex->getCode() ? ' #' . $ex->getCode() : '');
  1526. ?> -->
  1527. <style type="text/css" class="nette">html{overflow-y:scroll}body{margin:0 0 2em;padding:0}#netteBluescreen{font:9pt/1.5 Verdana,sans-serif;background:white;color:#333;position:absolute;left:0;top:0;width:100%;z-index:23178;text-align:left}#netteBluescreen *{font:inherit;color:inherit;background:transparent;border:none;margin:0;padding:0;text-align:inherit;text-indent:0}#netteBluescreen b{font-weight:bold}#netteBluescreen i{font-style:italic}#netteBluescreen a{text-decoration:none;color:#328ADC;padding:2px 4px;margin:-2px -4px}#netteBluescreen a:hover,#netteBluescreen a:active,#netteBluescreen a:focus{color:#085AA3}#netteBluescreen a abbr{font-family:sans-serif;color:#BBB}#netteBluescreenIcon{position:absolute;right:.5em;top:.5em;z-index:23179;text-decoration:none;background:#CD1818;padding:3px}#netteBluescreenError{background:#CD1818;color:white;font:13pt/1.5 Verdana,sans-serif!important;display:block}#netteBluescreenError #netteBsSearch{color:#CD1818;font-size:.7em}#netteBluescreenError:hover #netteBsSearch{color:#ED8383}#netteBluescreen h1{font-size:18pt;font-weight:normal;text-shadow:1px 1px 0 rgba(0,0,0,.4);margin:.7em 0}#netteBluescreen h2{font:14pt/1.5 sans-serif!important;color:#888;margin:.6em 0}#netteBluescreen h3{font:bold 10pt/1.5 Verdana,sans-serif!important;margin:1em 0;padding:0}#netteBluescreen p,#netteBluescreen pre{margin:.8em 0}#netteBluescreen pre,#netteBluescreen code,#netteBluescreen table{font:9pt/1.5 Consolas,monospace!important}#netteBluescreen pre,#netteBluescreen table{background:#FDF5CE;padding:.4em .7em;border:1px dotted silver;overflow:auto}#netteBluescreen table pre{padding:0;margin:0;border:none}#netteBluescreen pre .php-array,#netteBluescreen pre .php-object{color:#C22}#netteBluescreen pre .php-string{color:#080}#netteBluescreen pre .php-int,#netteBluescreen pre .php-float,#netteBluescreen pre .php-null,#netteBluescreen pre .php-bool{color:#328ADC}#netteBluescreen pre .php-visibility{font-size:85%;color:#998}#netteBluescreen pre.nette-dump a{color:#333}#netteBluescreen div.panel{padding:1px 25px}#netteBluescreen div.inner{background:#F4F3F1;padding:.1em 1em 1em;border-radius:8px;-moz-border-radius:8px;-webkit-border-radius:8px}#netteBluescreen table{border-collapse:collapse;width:100%}#netteBluescreen .outer{overflow:auto}#netteBluescreen td,#netteBluescreen th{vertical-align:top;text-align:left;padding:2px 6px;border:1px solid #e6dfbf}#netteBluescreen th{width:10%;font-weight:bold}#netteBluescreen tr:nth-child(2n),#netteBluescreen tr:nth-child(2n) pre{background-color:#F7F0CB}#netteBluescreen ol{margin:1em 0;padding-left:2.5em}#netteBluescreen ul{font:7pt/1.5 Verdana,sans-serif!important;padding:2em 4em;margin:1em 0 0;color:#777;background:#F6F5F3 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFEAAAAjCAMAAADbuxbOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRF/fz24d7Y7Onj5uLd9vPu3drUzMvG09LN39zW8e7o2NbQ3NnT29jS0M7J1tXQAAAApvmsFgAAABB0Uk5T////////////////////AOAjXRkAAAKlSURBVHja7FbbsqQgDAwENEgc//9vN+SCWDtbtXPmZR/Wc6o02mlC58LA9ckFAOszvMV8xNgyUjyXhojfMVKvRL0ZHavxXYy5JrmchMdzou8YlTClxajtK8ZGGpWRoBr1+gFjKfHkJPbizabLgzE3pH7Iu4K980xgFvlrVzMZoVBWhtvouCDdcTDmTgMCJdVxJ9MKO6XxnliM7hxi5lbj2ZVM4l8DqYyKoNLYcfqBB1/LpHYxEcfVG6ZpMDgyFUVWY/Q1sSYPpIdSAKWqLWL0XqWiMWc4hpH0OQOMOAgdycY4N9Sb7wWANQs3rsDSdLAYiuxi5siVfOhBWIrtH0G3kNaF/8Q4kCPE1kMucG/ZMUBUCOgiKJkPuWWTLGVgLGpwns1DraUayCtoBqERyaYtVsm85NActRooezvSLO/sKZP/nq8n4+xcyjNsRu8zW6KWpdb7wjiQd4WrtFZYFiKHENSmWp6xshh96c2RQ+c7Lt+qbijyEjHWUJ/pZsy8MGIUuzNiPySK2Gqoh6ZTRF6ko6q3nVTkaA//itIrDpW6l3SLo8juOmqMXkYknu5FdQxWbhCfKHEGDhxxyTVaXJF3ZjSl3jMksjSOOKmne9pI+mcG5QvaUJhI9HpkmRo2NpCrDJvsktRhRE2MM6F2n7dt4OaMUq8bCctk0+PoMRzL+1l5PZ2eyM/Owr86gf8z/tOM53lom5+nVcFuB+eJVzlXwAYy9TZ9s537tfqcsJWbEU4nBngZo6FfO9T9CdhfBtmk2dLiAy8uS4zwOpMx2HqYbTC+amNeAYTpsP4SIgvWfUBWXxn3CMHW3ffd7k3+YIkx7w0t/CVGvcPejoeOlzOWzeGbawOHqXQGUTMZRcfj4XPCgW9y/fuvVn8zD9P1QHzv80uAAQA0i3Jer7Jr7gAAAABJRU5ErkJggg==') 99% 10px no-repeat;border-top:1px solid #DDD}#netteBluescreen .highlight{background:#CD1818;color:white;font-weight:bold;font-style:normal;display:block;padding:0 .4em;margin:0 -.4em}#netteBluescreen .line{color:#9F9C7F;font-weight:normal;font-style:normal}#netteBluescreen a[href^=editor\:]{color:inherit;border-bottom:1px dotted #C1D2E1}</style>
  1528. </head>
  1529. <body>
  1530. <div id="netteBluescreen">
  1531. <a id="netteBluescreenIcon" href="#" rel="next"><abbr>&#x25bc;</abbr></a
  1532. ><div>
  1533. <div id="netteBluescreenError" class="panel">
  1534. <h1><?php echo htmlspecialchars($title), ($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1>
  1535. <p><?php echo htmlspecialchars($exception->getMessage()) ?> <a href="http://www.google.cz/search?sourceid=nette&amp;q=<?php echo urlencode($title . ' ' . preg_replace('#\'.*\'|".*"#Us', '', $exception->getMessage())) ?>" id="netteBsSearch">search&#x25ba;</a></p>
  1536. </div>
  1537. <?php $ex = $exception; $level = 0; ?>
  1538. <?php do { ?>
  1539. <?php if ($level++): ?>
  1540. <div class="panel">
  1541. <h2><a href="#" rel="netteBsPnl<?php echo ++$counter ?>">Caused by <abbr><?php echo ($collapsed = $level > 2) ? '&#x25ba;' : '&#x25bc;' ?></abbr></a></h2>
  1542. <div id="netteBsPnl<?php echo $