%PDF- %PDF-
Direktori : /www/varak.net/losik.varak.net/vendor/nette/caching/src/Bridges/CacheLatte/Nodes/ |
Current File : /www/varak.net/losik.varak.net/vendor/nette/caching/src/Bridges/CacheLatte/Nodes/CacheNode.php |
<?php /** * This file is part of the Latte (https://latte.nette.org) * Copyright (c) 2008 David Grudl (https://davidgrudl.com) */ declare(strict_types=1); namespace Nette\Bridges\CacheLatte\Nodes; use Latte; use Latte\Compiler\Nodes\AreaNode; use Latte\Compiler\Nodes\Php\Expression\ArrayNode; use Latte\Compiler\Nodes\StatementNode; use Latte\Compiler\Position; use Latte\Compiler\PrintContext; use Latte\Compiler\Tag; use Nette; use Nette\Caching\Cache; /** * {cache} ... {/cache} */ class CacheNode extends StatementNode { public ArrayNode $args; public AreaNode $content; public ?Position $endLine; /** @return \Generator<int, ?array, array{AreaNode, ?Tag}, static> */ public static function create(Tag $tag): \Generator { $node = new static; $node->args = $tag->parser->parseArguments(); [$node->content, $endTag] = yield; $node->endLine = $endTag?->position; return $node; } public function print(PrintContext $context): string { return $context->format( <<<'XX' if (Nette\Bridges\CacheLatte\Nodes\CacheNode::createCache($this->global->cacheStorage, %dump, $this->global->cacheStack, %node?)) %line try { %node Nette\Bridges\CacheLatte\Nodes\CacheNode::endCache($this->global->cacheStack) %line; } catch (\Throwable $ʟ_e) { Nette\Bridges\CacheLatte\Nodes\CacheNode::rollback($this->global->cacheStack); throw $ʟ_e; } XX, Nette\Utils\Random::generate(), $this->args, $this->position, $this->content, $this->endLine, ); } public function &getIterator(): \Generator { yield $this->args; yield $this->content; } /********************* run-time helpers ****************d*g**/ public static function initRuntime(Latte\Runtime\Template $template): void { if (!empty($template->global->cacheStack)) { $file = (new \ReflectionClass($template))->getFileName(); if (@is_file($file)) { // @ - may trigger error end($template->global->cacheStack)->dependencies[Cache::Files][] = $file; } } } /** * Starts the output cache. Returns Nette\Caching\OutputHelper object if buffering was started. * @return Nette\Caching\OutputHelper|\stdClass */ public static function createCache( Nette\Caching\Storage $cacheStorage, string $key, ?array &$parents, ?array $args = null, ) { if ($args) { if (array_key_exists('if', $args) && !$args['if']) { return $parents[] = new \stdClass; } $key = array_merge([$key], array_intersect_key($args, range(0, count($args)))); } if ($parents) { end($parents)->dependencies[Cache::Items][] = $key; } $cache = new Cache($cacheStorage, 'Nette.Templating.Cache'); if ($helper = $cache->capture($key)) { $parents[] = $helper; if (isset($args['dependencies'])) { $args += $args['dependencies'](); } $helper->dependencies[Cache::Tags] = $args['tags'] ?? null; $helper->dependencies[Cache::Expire] = $args['expiration'] ?? $args['expire'] ?? '+ 7 days'; } return $helper; } /** * Ends the output cache. * @param Nette\Caching\OutputHelper[] $parents */ public static function endCache(array &$parents): void { $helper = array_pop($parents); if ($helper instanceof Nette\Caching\OutputHelper) { $helper->end(); } } /** * @param Nette\Caching\OutputHelper[] $parents */ public static function rollback(array &$parents): void { $helper = array_pop($parents); if ($helper instanceof Nette\Caching\OutputHelper) { $helper->rollback(); } } }