public function escape($s) { switch ($this->compiler->getContentType()) { case Compiler::CONTENT_XHTML: case Compiler::CONTENT_HTML: $context = $this->compiler->getContext(); switch ($context[0]) { case Compiler::CONTEXT_SINGLE_QUOTED: case Compiler::CONTEXT_DOUBLE_QUOTED: if ($context[1] === Compiler::CONTENT_JS) { $s = "Nette\\Templating\\Helpers::escapeJs({$s})"; } elseif ($context[1] === Compiler::CONTENT_CSS) { $s = "Nette\\Templating\\Helpers::escapeCss({$s})"; } $quote = $context[0] === Compiler::CONTEXT_DOUBLE_QUOTED ? '' : ', ENT_QUOTES'; return "htmlSpecialChars({$s}{$quote})"; case Compiler::CONTEXT_COMMENT: return "Nette\\Templating\\Helpers::escapeHtmlComment({$s})"; case Compiler::CONTENT_JS: case Compiler::CONTENT_CSS: return 'Nette\\Templating\\Helpers::escape' . ucfirst($context[0]) . "({$s})"; default: return "Nette\\Templating\\Helpers::escapeHtml({$s}, ENT_NOQUOTES)"; } case Compiler::CONTENT_XML: case Compiler::CONTENT_JS: case Compiler::CONTENT_CSS: case Compiler::CONTENT_ICAL: return 'Nette\\Templating\\Helpers::escape' . ucfirst($this->compiler->getContentType()) . "({$s})"; case Compiler::CONTENT_TEXT: return $s; default: return "\$template->escape({$s})"; } }
/** * New node is found. * @return bool */ public function nodeOpened(MacroNode $node) { list($begin, $end, $attr) = $this->macros[$node->name]; $node->isEmpty = !$end; if ($attr && $node->prefix === $node::PREFIX_NONE) { $node->isEmpty = TRUE; $this->compiler->setContext(Latte\Compiler::CONTEXT_DOUBLE_QUOTED_ATTR); $res = $this->compile($node, $attr); if ($res === FALSE) { return FALSE; } elseif (!$node->attrCode) { $node->attrCode = "<?php {$res} ?>"; } $this->compiler->setContext(NULL); } elseif ($begin) { $res = $this->compile($node, $begin); if ($res === FALSE) { return FALSE; } elseif (!$node->openingCode) { $node->openingCode = "<?php {$res} ?>"; } } elseif (!$end) { return FALSE; } }
/** * New node is found. * @return bool */ public function nodeOpened(MacroNode $node) { if ($this->macros[$node->name][2] && $node->htmlNode) { $node->isEmpty = TRUE; $this->compiler->setContext(Latte\Compiler::CONTEXT_DOUBLE_QUOTED); $res = $this->compile($node, $this->macros[$node->name][2]); $this->compiler->setContext(NULL); if (!$node->attrCode) { $node->attrCode = "<?php {$res} ?>"; } } else { $node->isEmpty = !isset($this->macros[$node->name][1]); $res = $this->compile($node, $this->macros[$node->name][0]); if (!$node->openingCode) { $node->openingCode = "<?php {$res} ?>"; } } return $res !== FALSE; }
/** * Escapes expression in tokens. * @return MacroTokens */ public function escapeFilter(MacroTokens $tokens) { $tokens = clone $tokens; switch ($this->compiler->getContentType()) { case Compiler::CONTENT_XHTML: case Compiler::CONTENT_HTML: $context = $this->compiler->getContext(); switch ($context[0]) { case Compiler::CONTEXT_SINGLE_QUOTED_ATTR: case Compiler::CONTEXT_DOUBLE_QUOTED_ATTR: case Compiler::CONTEXT_UNQUOTED_ATTR: if ($context[1] === Compiler::CONTENT_JS) { $tokens->prepend('Nette\\Templating\\Helpers::escapeJs(')->append(')'); } elseif ($context[1] === Compiler::CONTENT_CSS) { $tokens->prepend('Nette\\Templating\\Helpers::escapeCss(')->append(')'); } $tokens->prepend('htmlSpecialChars(')->append($context[0] === Compiler::CONTEXT_SINGLE_QUOTED_ATTR ? ', ENT_QUOTES)' : ')'); if ($context[0] === Compiler::CONTEXT_UNQUOTED_ATTR) { $tokens->prepend("'\"' . ")->append(" . '\"'"); } return $tokens; case Compiler::CONTEXT_COMMENT: return $tokens->prepend('Nette\\Templating\\Helpers::escapeHtmlComment(')->append(')'); case Compiler::CONTENT_JS: case Compiler::CONTENT_CSS: return $tokens->prepend('Nette\\Templating\\Helpers::escape' . ucfirst($context[0]) . '(')->append(')'); default: return $tokens->prepend('Nette\\Templating\\Helpers::escapeHtml(')->append(', ENT_NOQUOTES)'); } case Compiler::CONTENT_XML: $context = $this->compiler->getContext(); switch ($context[0]) { case Compiler::CONTEXT_COMMENT: return $tokens->prepend('Nette\\Templating\\Helpers::escapeHtmlComment(')->append(')'); default: $tokens->prepend('Nette\\Templating\\Helpers::escapeXml(')->append(')'); if ($context[0] === Compiler::CONTEXT_UNQUOTED_ATTR) { $tokens->prepend("'\"' . ")->append(" . '\"'"); } return $tokens; } case Compiler::CONTENT_JS: case Compiler::CONTENT_CSS: case Compiler::CONTENT_ICAL: return $tokens->prepend('Nette\\Templating\\Helpers::escape' . ucfirst($this->compiler->getContentType()) . '(')->append(')'); case Compiler::CONTENT_TEXT: return $tokens; default: return $tokens->prepend('$template->escape(')->append(')'); } }
/** * Invokes filter. * * @param string * * @return string */ public function __invoke($s) { return $this->compiler->compile($this->parser->parse($s)); }