{%- set body_bottom %}
{% block body_bottom %}
{% endblock %}
{{ gantry.document.getHtml('body_bottom')|join("\n ")|raw }}
{% endset -%}
{%- do gantry.document.addScript(url('gantry-assets://js/main.js'), 11, 'footer') -%}
{# Head and footer needs to come last because of any of the above blocks may have CSS or JavaScript in them #}
{%- set page_head %}
{% block page_head -%}
{% include 'partials/page_head.html.twig' %}
{%- endblock %}
{% endset -%}
{%- set page_footer %}
{% block page_footer %}
{% do gantry.platform.finalize() -%}
{{ gantry.scripts('footer')|join("\n ")|raw -}}
{% endblock %}
{{ gantry.debugger.render()|raw }}
{% endset -%}
{%- block page -%}
<!DOCTYPE {{ gantry.config.page.doctype|default('html')|raw }}>
<html{{ gantry.page.htmlAttributes|raw }}>
{{ page_head|raw }}
{% block page_body -%}
<body{{ gantry.page.bodyAttributes({'class': [offcanvas_position, gantry.page.preset, 'g-style-' ~ gantry.theme.preset]})|raw }}>
{{ gantry.config.page.body.body_top|raw }}
{{ body_top|raw }}
{{ page_offcanvas|raw }}
<div id="g-page-surround">
{% if page_offcanvas|trim -%}
<div class="g-offcanvas-hide g-offcanvas-toggle" role="navigation" data-offcanvas-toggle aria-controls="g-offcanvas" aria-expanded="false"><i class="fa fa-fw fa-bars"></i></div>
{%- endif %}
{{ page_top|raw }}
case Type::T_VARIABLE:
case Type::T_FUNCTION_CALL:
return true;
}
return false;
}
/**
* Reduce value
*
* @param array $value
* @param boolean $inExp
*
* @return array|\Leafo\ScssPhp\Node\Number
*/
protected function reduce($value, $inExp = false)
{
switch ($value[0]) {
case Type::T_EXPRESSION:
list(, $op, $left, $right, $inParens) = $value;
$opName = isset(static::$operatorNames[$op]) ? static::$operatorNames[$op] : $op;
$inExp = $inExp || $this->shouldEval($left) || $this->shouldEval($right);
$left = $this->reduce($left, true);
if ($op !== 'and' && $op !== 'or') {
$right = $this->reduce($right, true);
}
// special case: looks like css shorthand
if ($opName == 'div' && ! $inParens && ! $inExp && isset($right[2])
&& (($right[0] !== Type::T_NUMBER && $right[2] != '')
|| ($right[0] === Type::T_NUMBER && ! $right->unitless()))
) {
return $this->expToString($value);
}
case Type::T_VARIABLE:
case Type::T_FUNCTION_CALL:
return true;
}
return false;
}
/**
* Reduce value
*
* @param array $value
* @param boolean $inExp
*
* @return array|\Leafo\ScssPhp\Node\Number
*/
protected function reduce($value, $inExp = false)
{
switch ($value[0]) {
case Type::T_EXPRESSION:
list(, $op, $left, $right, $inParens) = $value;
$opName = isset(static::$operatorNames[$op]) ? static::$operatorNames[$op] : $op;
$inExp = $inExp || $this->shouldEval($left) || $this->shouldEval($right);
$left = $this->reduce($left, true);
if ($op !== 'and' && $op !== 'or') {
$right = $this->reduce($right, true);
}
// special case: looks like css shorthand
if ($opName == 'div' && ! $inParens && ! $inExp && isset($right[2])
&& (($right[0] !== Type::T_NUMBER && $right[2] != '')
|| ($right[0] === Type::T_NUMBER && ! $right->unitless()))
) {
return $this->expToString($value);
}
protected function callNativeFunction($name, $args, &$returnValue)
{
// try a lib function
$name = $this->normalizeName($name);
if (isset($this->userFunctions[$name])) {
// see if we can find a user function
list($f, $prototype) = $this->userFunctions[$name];
} elseif (($f = $this->getBuiltinFunction($name)) && is_callable($f)) {
$libName = $f[1];
$prototype = isset(static::$$libName) ? static::$$libName : null;
} else {
return false;
}
@list($sorted, $kwargs) = $this->sortArgs($prototype, $args);
if ($name !== 'if' && $name !== 'call') {
foreach ($sorted as &$val) {
$val = $this->reduce($val, true);
}
}
$returnValue = call_user_func($f, $sorted, $kwargs);
if (! isset($returnValue)) {
return false;
}
$returnValue = $this->coerceValue($returnValue);
return true;
}
/**
* Get built-in function
*
* @param string $name Normalized name
*
* @return array
}
}
/**
* Function caller
*
* @param string $name
* @param array $argValues
*
* @return array|null
*/
protected function fncall($name, $argValues)
{
// SCSS @function
if ($this->callScssFunction($name, $argValues, $returnValue)) {
return $returnValue;
}
// native PHP functions
if ($this->callNativeFunction($name, $argValues, $returnValue)) {
return $returnValue;
}
// for CSS functions, simply flatten the arguments into a list
$listArgs = [];
foreach ((array) $argValues as $arg) {
if (empty($arg[0])) {
$listArgs[] = $this->reduce($arg[1]);
}
}
return [Type::T_FUNCTION, $name, [Type::T_LIST, ',', $listArgs]];
}
/**
* Normalize name
*
* @param string $name
*
case Type::T_STRING:
foreach ($value[2] as &$item) {
if (is_array($item) || $item instanceof \ArrayAccess) {
$item = $this->reduce($item);
}
}
return $value;
case Type::T_INTERPOLATE:
$value[1] = $this->reduce($value[1]);
if ($inExp) {
return $value[1];
}
return $value;
case Type::T_FUNCTION_CALL:
return $this->fncall($value[1], $value[2]);
case Type::T_SELF:
$selfSelector = $this->multiplySelectors($this->env);
$selfSelector = $this->collapseSelectors($selfSelector, true);
return $selfSelector;
default:
return $value;
}
}
/**
* Function caller
*
* @param string $name
* @param array $argValues
*
* @return array|null
*/
protected function fncall($name, $argValues)
case Type::T_ASSIGN:
list(, $name, $value) = $child;
if ($name[0] === Type::T_VARIABLE) {
$flags = isset($child[3]) ? $child[3] : [];
$isDefault = in_array('!default', $flags);
$isGlobal = in_array('!global', $flags);
if ($isGlobal) {
$this->set($name[1], $this->reduce($value), false, $this->rootEnv, $value);
break;
}
$shouldSet = $isDefault &&
(($result = $this->get($name[1], false)) === null
|| $result === static::$null);
if (! $isDefault || $shouldSet) {
$this->set($name[1], $this->reduce($value), true, null, $value);
}
break;
}
$compiledName = $this->compileValue($name);
// handle shorthand syntax: size / line-height
if ($compiledName === 'font' || $compiledName === 'grid-row' || $compiledName === 'grid-column') {
if ($value[0] === Type::T_VARIABLE) {
// if the font value comes from variable, the content is already reduced
// (i.e., formulas were already calculated), so we need the original unreduced value
$value = $this->get($value[1], true, null, true);
}
$fontValue=&$value;
if ($value[0] === Type::T_LIST && $value[1]==',') {
// this is the case if more than one font is given: example: "font: 400 1em/1.3 arial,helvetica"
// we need to handle the first list element
$fontValue=&$value[2][0];
protected function popCallStack()
{
array_pop($this->callStack);
}
/**
* Compile children and return result
*
* @param array $stms
* @param \Leafo\ScssPhp\Formatter\OutputBlock $out
* @param string $traceName
*
* @return array|null
*/
protected function compileChildren($stms, OutputBlock $out, $traceName = '')
{
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
$ret = $this->compileChild($stm, $out);
if (isset($ret)) {
return $ret;
}
}
$this->popCallStack();
return null;
}
/**
* Compile children and throw exception if unexpected @return
*
* @param array $stms
* @param \Leafo\ScssPhp\Formatter\OutputBlock $out
* @param \Leafo\ScssPhp\Block $selfParent
* @param string $traceName
*
* @throws \Exception
case Type::T_EACH:
list(, $each) = $child;
$list = $this->coerceList($this->reduce($each->list));
$this->pushEnv();
foreach ($list[2] as $item) {
if (count($each->vars) === 1) {
$this->set($each->vars[0], $item, true);
} else {
list(,, $values) = $this->coerceList($item);
foreach ($each->vars as $i => $var) {
$this->set($var, isset($values[$i]) ? $values[$i] : static::$null, true);
}
}
$ret = $this->compileChildren($each->children, $out);
if ($ret) {
if ($ret[0] !== Type::T_CONTROL) {
$this->popEnv();
return $ret;
}
if ($ret[1]) {
break;
}
}
}
$this->popEnv();
break;
case Type::T_WHILE:
list(, $while) = $child;
protected function popCallStack()
{
array_pop($this->callStack);
}
/**
* Compile children and return result
*
* @param array $stms
* @param \Leafo\ScssPhp\Formatter\OutputBlock $out
* @param string $traceName
*
* @return array|null
*/
protected function compileChildren($stms, OutputBlock $out, $traceName = '')
{
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
$ret = $this->compileChild($stm, $out);
if (isset($ret)) {
return $ret;
}
}
$this->popCallStack();
return null;
}
/**
* Compile children and throw exception if unexpected @return
*
* @param array $stms
* @param \Leafo\ScssPhp\Formatter\OutputBlock $out
* @param \Leafo\ScssPhp\Block $selfParent
* @param string $traceName
*
* @throws \Exception
break;
case Type::T_EXTEND:
foreach ($child[1] as $sel) {
$results = $this->evalSelectors([$sel]);
foreach ($results as $result) {
// only use the first one
$result = current($result);
$this->pushExtends($result, $out->selectors, $child);
}
}
break;
case Type::T_IF:
list(, $if) = $child;
if ($this->isTruthy($this->reduce($if->cond, true))) {
return $this->compileChildren($if->children, $out);
}
foreach ($if->cases as $case) {
if ($case->type === Type::T_ELSE ||
$case->type === Type::T_ELSEIF && $this->isTruthy($this->reduce($case->cond))
) {
return $this->compileChildren($case->children, $out);
}
}
break;
case Type::T_EACH:
list(, $each) = $child;
$list = $this->coerceList($this->reduce($each->list));
$this->pushEnv();
foreach ($list[2] as $item) {
if (count($each->vars) === 1) {
protected function popCallStack()
{
array_pop($this->callStack);
}
/**
* Compile children and return result
*
* @param array $stms
* @param \Leafo\ScssPhp\Formatter\OutputBlock $out
* @param string $traceName
*
* @return array|null
*/
protected function compileChildren($stms, OutputBlock $out, $traceName = '')
{
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
$ret = $this->compileChild($stm, $out);
if (isset($ret)) {
return $ret;
}
}
$this->popCallStack();
return null;
}
/**
* Compile children and throw exception if unexpected @return
*
* @param array $stms
* @param \Leafo\ScssPhp\Formatter\OutputBlock $out
* @param \Leafo\ScssPhp\Block $selfParent
* @param string $traceName
*
* @throws \Exception
case Type::T_EACH:
list(, $each) = $child;
$list = $this->coerceList($this->reduce($each->list));
$this->pushEnv();
foreach ($list[2] as $item) {
if (count($each->vars) === 1) {
$this->set($each->vars[0], $item, true);
} else {
list(,, $values) = $this->coerceList($item);
foreach ($each->vars as $i => $var) {
$this->set($var, isset($values[$i]) ? $values[$i] : static::$null, true);
}
}
$ret = $this->compileChildren($each->children, $out);
if ($ret) {
if ($ret[0] !== Type::T_CONTROL) {
$this->popEnv();
return $ret;
}
if ($ret[1]) {
break;
}
}
}
$this->popEnv();
break;
case Type::T_WHILE:
list(, $while) = $child;
* @param \Leafo\ScssPhp\Block $selfParent
* @param string $traceName
*
* @throws \Exception
*/
protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '')
{
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
if ($selfParent && isset($stm[1]) && is_object($stm[1]) && $stm[1] instanceof Block) {
$stm[1]->selfParent = $selfParent;
$ret = $this->compileChild($stm, $out);
$stm[1]->selfParent = null;
} elseif ($selfParent && $stm[0] === TYPE::T_INCLUDE) {
$stm['selfParent'] = $selfParent;
$ret = $this->compileChild($stm, $out);
unset($stm['selfParent']);
} else {
$ret = $this->compileChild($stm, $out);
}
if (isset($ret)) {
$this->throwError('@return may only be used within a function');
return;
}
}
$this->popCallStack();
}
/**
* evaluate media query : compile internal value keeping the structure inchanged
*
* @param array $queryList
*
* @return array
*/
}
}
}
// clone the stored content to not have its scope spoiled by a further call to the same mixin
// i.e., recursive @include of the same mixin
if (isset($content)) {
$copyContent = clone $content;
$copyContent->scope = $callingScope;
$this->setRaw(static::$namespaces['special'] . 'content', $copyContent, $this->env);
}
if (isset($mixin->args)) {
$this->applyArguments($mixin->args, $argValues);
}
$this->env->marker = 'mixin';
$this->compileChildrenNoReturn($mixin->children, $out, $selfParent, $this->env->marker . " " . $name);
$this->storeEnv = $storeEnv;
$this->popEnv();
break;
case Type::T_MIXIN_CONTENT:
$env = isset($this->storeEnv) ? $this->storeEnv : $this->env;
$content = $this->get(static::$namespaces['special'] . 'content', false, $env);
if (! $content) {
$content = new \stdClass();
$content->scope = new \stdClass();
$content->children = $this->storeEnv->parent->block->children;
break;
}
$storeEnv = $this->storeEnv;
$this->storeEnv = $content->scope;
$this->compileChildrenNoReturn($content->children, $out);
* @param \Leafo\ScssPhp\Block $selfParent
* @param string $traceName
*
* @throws \Exception
*/
protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '')
{
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
if ($selfParent && isset($stm[1]) && is_object($stm[1]) && $stm[1] instanceof Block) {
$stm[1]->selfParent = $selfParent;
$ret = $this->compileChild($stm, $out);
$stm[1]->selfParent = null;
} elseif ($selfParent && $stm[0] === TYPE::T_INCLUDE) {
$stm['selfParent'] = $selfParent;
$ret = $this->compileChild($stm, $out);
unset($stm['selfParent']);
} else {
$ret = $this->compileChild($stm, $out);
}
if (isset($ret)) {
$this->throwError('@return may only be used within a function');
return;
}
}
$this->popCallStack();
}
/**
* evaluate media query : compile internal value keeping the structure inchanged
*
* @param array $queryList
*
* @return array
*/
break;
}
$this->scope->children[] = $annotation;
}
$this->scope->children[] = $out;
if (count($block->children)) {
$out->selectors = $this->multiplySelectors($env, $block->selfParent);
// propagate selfParent to the children where they still can be useful
$selfParentSelectors = null;
if (isset($block->selfParent->selectors)) {
$selfParentSelectors = $block->selfParent->selectors;
$block->selfParent->selectors = $out->selectors;
}
$this->compileChildrenNoReturn($block->children, $out, $block->selfParent);
// and revert for the following childs of the same block
if ($selfParentSelectors) {
$block->selfParent->selectors = $selfParentSelectors;
}
}
$this->formatter->stripSemicolon($out->lines);
$this->popEnv();
}
/**
* Compile root level comment
*
* @param array $block
*/
protected function compileComment($block)
{
$out = $this->makeOutputBlock(Type::T_COMMENT);
if (! $this->compileImport($rawPath, $out)) {
$out->lines[] = '@import ' . $this->compileValue($rawPath) . ';';
}
break;
case Type::T_DIRECTIVE:
$this->compileDirective($child[1]);
break;
case Type::T_AT_ROOT:
$this->compileAtRoot($child[1]);
break;
case Type::T_MEDIA:
$this->compileMedia($child[1]);
break;
case Type::T_BLOCK:
$this->compileBlock($child[1]);
break;
case Type::T_CHARSET:
if (! $this->charsetSeen) {
$this->charsetSeen = true;
$out->lines[] = '@charset ' . $this->compileValue($child[1]) . ';';
}
break;
case Type::T_ASSIGN:
list(, $name, $value) = $child;
if ($name[0] === Type::T_VARIABLE) {
$flags = isset($child[3]) ? $child[3] : [];
$isDefault = in_array('!default', $flags);
$isGlobal = in_array('!global', $flags);
if ($isGlobal) {
$this->set($name[1], $this->reduce($value), false, $this->rootEnv, $value);
* @param \Leafo\ScssPhp\Block $selfParent
* @param string $traceName
*
* @throws \Exception
*/
protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '')
{
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
if ($selfParent && isset($stm[1]) && is_object($stm[1]) && $stm[1] instanceof Block) {
$stm[1]->selfParent = $selfParent;
$ret = $this->compileChild($stm, $out);
$stm[1]->selfParent = null;
} elseif ($selfParent && $stm[0] === TYPE::T_INCLUDE) {
$stm['selfParent'] = $selfParent;
$ret = $this->compileChild($stm, $out);
unset($stm['selfParent']);
} else {
$ret = $this->compileChild($stm, $out);
}
if (isset($ret)) {
$this->throwError('@return may only be used within a function');
return;
}
}
$this->popCallStack();
}
/**
* evaluate media query : compile internal value keeping the structure inchanged
*
* @param array $queryList
*
* @return array
*/
break;
}
$this->scope->children[] = $annotation;
}
$this->scope->children[] = $out;
if (count($block->children)) {
$out->selectors = $this->multiplySelectors($env, $block->selfParent);
// propagate selfParent to the children where they still can be useful
$selfParentSelectors = null;
if (isset($block->selfParent->selectors)) {
$selfParentSelectors = $block->selfParent->selectors;
$block->selfParent->selectors = $out->selectors;
}
$this->compileChildrenNoReturn($block->children, $out, $block->selfParent);
// and revert for the following childs of the same block
if ($selfParentSelectors) {
$block->selfParent->selectors = $selfParentSelectors;
}
}
$this->formatter->stripSemicolon($out->lines);
$this->popEnv();
}
/**
* Compile root level comment
*
* @param array $block
*/
protected function compileComment($block)
{
$out = $this->makeOutputBlock(Type::T_COMMENT);
if (! $this->compileImport($rawPath, $out)) {
$out->lines[] = '@import ' . $this->compileValue($rawPath) . ';';
}
break;
case Type::T_DIRECTIVE:
$this->compileDirective($child[1]);
break;
case Type::T_AT_ROOT:
$this->compileAtRoot($child[1]);
break;
case Type::T_MEDIA:
$this->compileMedia($child[1]);
break;
case Type::T_BLOCK:
$this->compileBlock($child[1]);
break;
case Type::T_CHARSET:
if (! $this->charsetSeen) {
$this->charsetSeen = true;
$out->lines[] = '@charset ' . $this->compileValue($child[1]) . ';';
}
break;
case Type::T_ASSIGN:
list(, $name, $value) = $child;
if ($name[0] === Type::T_VARIABLE) {
$flags = isset($child[3]) ? $child[3] : [];
$isDefault = in_array('!default', $flags);
$isGlobal = in_array('!global', $flags);
if ($isGlobal) {
$this->set($name[1], $this->reduce($value), false, $this->rootEnv, $value);
* @param \Leafo\ScssPhp\Block $selfParent
* @param string $traceName
*
* @throws \Exception
*/
protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '')
{
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
if ($selfParent && isset($stm[1]) && is_object($stm[1]) && $stm[1] instanceof Block) {
$stm[1]->selfParent = $selfParent;
$ret = $this->compileChild($stm, $out);
$stm[1]->selfParent = null;
} elseif ($selfParent && $stm[0] === TYPE::T_INCLUDE) {
$stm['selfParent'] = $selfParent;
$ret = $this->compileChild($stm, $out);
unset($stm['selfParent']);
} else {
$ret = $this->compileChild($stm, $out);
}
if (isset($ret)) {
$this->throwError('@return may only be used within a function');
return;
}
}
$this->popCallStack();
}
/**
* evaluate media query : compile internal value keeping the structure inchanged
*
* @param array $queryList
*
* @return array
*/
break;
}
$this->scope->children[] = $annotation;
}
$this->scope->children[] = $out;
if (count($block->children)) {
$out->selectors = $this->multiplySelectors($env, $block->selfParent);
// propagate selfParent to the children where they still can be useful
$selfParentSelectors = null;
if (isset($block->selfParent->selectors)) {
$selfParentSelectors = $block->selfParent->selectors;
$block->selfParent->selectors = $out->selectors;
}
$this->compileChildrenNoReturn($block->children, $out, $block->selfParent);
// and revert for the following childs of the same block
if ($selfParentSelectors) {
$block->selfParent->selectors = $selfParentSelectors;
}
}
$this->formatter->stripSemicolon($out->lines);
$this->popEnv();
}
/**
* Compile root level comment
*
* @param array $block
*/
protected function compileComment($block)
{
$out = $this->makeOutputBlock(Type::T_COMMENT);
if (! $this->compileImport($rawPath, $out)) {
$out->lines[] = '@import ' . $this->compileValue($rawPath) . ';';
}
break;
case Type::T_DIRECTIVE:
$this->compileDirective($child[1]);
break;
case Type::T_AT_ROOT:
$this->compileAtRoot($child[1]);
break;
case Type::T_MEDIA:
$this->compileMedia($child[1]);
break;
case Type::T_BLOCK:
$this->compileBlock($child[1]);
break;
case Type::T_CHARSET:
if (! $this->charsetSeen) {
$this->charsetSeen = true;
$out->lines[] = '@charset ' . $this->compileValue($child[1]) . ';';
}
break;
case Type::T_ASSIGN:
list(, $name, $value) = $child;
if ($name[0] === Type::T_VARIABLE) {
$flags = isset($child[3]) ? $child[3] : [];
$isDefault = in_array('!default', $flags);
$isGlobal = in_array('!global', $flags);
if ($isGlobal) {
$this->set($name[1], $this->reduce($value), false, $this->rootEnv, $value);
* @param \Leafo\ScssPhp\Block $selfParent
* @param string $traceName
*
* @throws \Exception
*/
protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '')
{
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
if ($selfParent && isset($stm[1]) && is_object($stm[1]) && $stm[1] instanceof Block) {
$stm[1]->selfParent = $selfParent;
$ret = $this->compileChild($stm, $out);
$stm[1]->selfParent = null;
} elseif ($selfParent && $stm[0] === TYPE::T_INCLUDE) {
$stm['selfParent'] = $selfParent;
$ret = $this->compileChild($stm, $out);
unset($stm['selfParent']);
} else {
$ret = $this->compileChild($stm, $out);
}
if (isset($ret)) {
$this->throwError('@return may only be used within a function');
return;
}
}
$this->popCallStack();
}
/**
* evaluate media query : compile internal value keeping the structure inchanged
*
* @param array $queryList
*
* @return array
*/
$locator = Gantry::instance()['locator'];
// see if tree is cached
$realPath = $locator($path);
if (isset($this->importCache[$realPath])) {
$this->handleImportLoop($realPath);
$tree = $this->importCache[$realPath];
} else {
$code = file_get_contents($realPath);
$parser = $this->parserFactory($path);
$tree = $parser->parse($code);
$this->importCache[$realPath] = $tree;
}
$dirname = dirname($path);
array_unshift($this->importPaths, $dirname);
$this->compileChildrenNoReturn($tree->children, $out);
array_shift($this->importPaths);
}
}
return [empty($m1)? $m2 : $m1, $t1];
}
/**
* Compile import; returns true if the value was something that could be imported
*
* @param array $rawPath
* @param \Leafo\ScssPhp\Formatter\OutputBlock $out
* @param boolean $once
*
* @return boolean
*/
protected function compileImport($rawPath, OutputBlock $out, $once = false)
{
if ($rawPath[0] === Type::T_STRING) {
$path = $this->compileStringContent($rawPath);
if ($path = $this->findImport($path)) {
if (! $once || ! in_array($path, $this->importedFiles)) {
$this->importFile($path, $out);
$this->importedFiles[] = $path;
}
return true;
}
return false;
}
if ($rawPath[0] === Type::T_LIST) {
// handle a list of strings
if (count($rawPath[2]) === 0) {
return false;
}
foreach ($rawPath[2] as $path) {
if ($path[0] !== Type::T_STRING) {
return false;
}
}
$this->sourceIndex = array_search($out->sourceName, $this->sourceNames);
if ($this->sourceIndex === false) {
$this->sourceIndex = null;
}
}
switch ($child[0]) {
case Type::T_SCSSPHP_IMPORT_ONCE:
$rawPath = $this->reduce($child[1]);
if (! $this->compileImport($rawPath, $out, true)) {
$out->lines[] = '@import ' . $this->compileValue($rawPath) . ';';
}
break;
case Type::T_IMPORT:
$rawPath = $this->reduce($child[1]);
if (! $this->compileImport($rawPath, $out)) {
$out->lines[] = '@import ' . $this->compileValue($rawPath) . ';';
}
break;
case Type::T_DIRECTIVE:
$this->compileDirective($child[1]);
break;
case Type::T_AT_ROOT:
$this->compileAtRoot($child[1]);
break;
case Type::T_MEDIA:
$this->compileMedia($child[1]);
break;
case Type::T_BLOCK:
$this->compileBlock($child[1]);
break;
* @param \Leafo\ScssPhp\Block $selfParent
* @param string $traceName
*
* @throws \Exception
*/
protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '')
{
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
if ($selfParent && isset($stm[1]) && is_object($stm[1]) && $stm[1] instanceof Block) {
$stm[1]->selfParent = $selfParent;
$ret = $this->compileChild($stm, $out);
$stm[1]->selfParent = null;
} elseif ($selfParent && $stm[0] === TYPE::T_INCLUDE) {
$stm['selfParent'] = $selfParent;
$ret = $this->compileChild($stm, $out);
unset($stm['selfParent']);
} else {
$ret = $this->compileChild($stm, $out);
}
if (isset($ret)) {
$this->throwError('@return may only be used within a function');
return;
}
}
$this->popCallStack();
}
/**
* evaluate media query : compile internal value keeping the structure inchanged
*
* @param array $queryList
*
* @return array
*/
$locator = Gantry::instance()['locator'];
// see if tree is cached
$realPath = $locator($path);
if (isset($this->importCache[$realPath])) {
$this->handleImportLoop($realPath);
$tree = $this->importCache[$realPath];
} else {
$code = file_get_contents($realPath);
$parser = $this->parserFactory($path);
$tree = $parser->parse($code);
$this->importCache[$realPath] = $tree;
}
$dirname = dirname($path);
array_unshift($this->importPaths, $dirname);
$this->compileChildrenNoReturn($tree->children, $out);
array_shift($this->importPaths);
}
}
return [empty($m1)? $m2 : $m1, $t1];
}
/**
* Compile import; returns true if the value was something that could be imported
*
* @param array $rawPath
* @param \Leafo\ScssPhp\Formatter\OutputBlock $out
* @param boolean $once
*
* @return boolean
*/
protected function compileImport($rawPath, OutputBlock $out, $once = false)
{
if ($rawPath[0] === Type::T_STRING) {
$path = $this->compileStringContent($rawPath);
if ($path = $this->findImport($path)) {
if (! $once || ! in_array($path, $this->importedFiles)) {
$this->importFile($path, $out);
$this->importedFiles[] = $path;
}
return true;
}
return false;
}
if ($rawPath[0] === Type::T_LIST) {
// handle a list of strings
if (count($rawPath[2]) === 0) {
return false;
}
foreach ($rawPath[2] as $path) {
if ($path[0] !== Type::T_STRING) {
return false;
}
}
$this->sourceIndex = array_search($out->sourceName, $this->sourceNames);
if ($this->sourceIndex === false) {
$this->sourceIndex = null;
}
}
switch ($child[0]) {
case Type::T_SCSSPHP_IMPORT_ONCE:
$rawPath = $this->reduce($child[1]);
if (! $this->compileImport($rawPath, $out, true)) {
$out->lines[] = '@import ' . $this->compileValue($rawPath) . ';';
}
break;
case Type::T_IMPORT:
$rawPath = $this->reduce($child[1]);
if (! $this->compileImport($rawPath, $out)) {
$out->lines[] = '@import ' . $this->compileValue($rawPath) . ';';
}
break;
case Type::T_DIRECTIVE:
$this->compileDirective($child[1]);
break;
case Type::T_AT_ROOT:
$this->compileAtRoot($child[1]);
break;
case Type::T_MEDIA:
$this->compileMedia($child[1]);
break;
case Type::T_BLOCK:
$this->compileBlock($child[1]);
break;
* @param \Leafo\ScssPhp\Block $selfParent
* @param string $traceName
*
* @throws \Exception
*/
protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '')
{
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
if ($selfParent && isset($stm[1]) && is_object($stm[1]) && $stm[1] instanceof Block) {
$stm[1]->selfParent = $selfParent;
$ret = $this->compileChild($stm, $out);
$stm[1]->selfParent = null;
} elseif ($selfParent && $stm[0] === TYPE::T_INCLUDE) {
$stm['selfParent'] = $selfParent;
$ret = $this->compileChild($stm, $out);
unset($stm['selfParent']);
} else {
$ret = $this->compileChild($stm, $out);
}
if (isset($ret)) {
$this->throwError('@return may only be used within a function');
return;
}
}
$this->popCallStack();
}
/**
* evaluate media query : compile internal value keeping the structure inchanged
*
* @param array $queryList
*
* @return array
*/
$out->sourceColumn = $this->env->block->sourceColumn;
} else {
$out->sourceName = null;
$out->sourceLine = null;
$out->sourceColumn = null;
}
return $out;
}
/**
* Compile root
*
* @param \Leafo\ScssPhp\Block $rootBlock
*/
protected function compileRoot(Block $rootBlock)
{
$this->rootBlock = $this->scope = $this->makeOutputBlock(Type::T_ROOT);
$this->compileChildrenNoReturn($rootBlock->children, $this->scope);
$this->flattenSelectors($this->scope);
$this->missingSelectors();
}
/**
* Report missing selectors
*/
protected function missingSelectors()
{
foreach ($this->extends as $extend) {
if (isset($extend[3])) {
continue;
}
list($target, $origin, $block) = $extend;
// ignore if !optional
if ($block[2]) {
continue;
}
$this->sourceIndex = null;
$this->sourceLine = null;
$this->sourceColumn = null;
$this->env = null;
$this->scope = null;
$this->storeEnv = null;
$this->charsetSeen = null;
$this->shouldEvaluate = null;
$this->stderr = fopen('php://stderr', 'w');
$this->parser = $this->parserFactory($path);
$tree = $this->parser->parse($code);
$this->parser = null;
$this->formatter = new $this->formatter();
$this->rootBlock = null;
$this->rootEnv = $this->pushEnv($tree);
$this->injectVariables($this->registeredVars);
$this->compileRoot($tree);
$this->popEnv();
$sourceMapGenerator = null;
if ($this->sourceMap) {
if (is_object($this->sourceMap) && $this->sourceMap instanceof SourceMapGenerator) {
$sourceMapGenerator = $this->sourceMap;
$this->sourceMap = self::SOURCE_MAP_FILE;
} elseif ($this->sourceMap !== self::SOURCE_MAP_NONE) {
$sourceMapGenerator = new SourceMapGenerator($this->sourceMapOptions);
}
}
$out = $this->formatter->format($this->scope, $sourceMapGenerator);
if (! empty($out) && $this->sourceMap && $this->sourceMap !== self::SOURCE_MAP_NONE) {
$sourceMap = $sourceMapGenerator->generateJson();
$sourceMapUrl = null;
switch ($this->sourceMap) {
try {
$file->lock(false);
} catch (\Exception $e) {
// Another process has locked the file; we will check this in a bit.
}
if ($file->locked() === false) {
// File was already locked by another process, lets avoid compiling the same file twice.
return false;
}
// Set the lookup paths.
$this->compiler->setBasePath($path);
$this->compiler->setImportPaths([[$this, 'findImport']]);
// Run the compiler.
$this->compiler->setVariables($this->getVariables());
$scss = '@import "' . $in . '.scss"';
try {
$css = $this->compiler->compile($scss);
} catch (CompilerException $e) {
throw new \RuntimeException("CSS Compilation on file '{$in}.scss' failed on error: {$e->getMessage()}", 500, $e);
}
if (strpos($css, $scss) === 0) {
$css = '/* ' . $scss . ' */';
}
// Extract map from css and save it as separate file.
if ($pos = strrpos($css, '/*# sourceMappingURL=')) {
$map = json_decode(urldecode(substr($css, $pos + 43, -3)), true);
/** @var Document $document */
$document = $gantry['document'];
foreach ($map['sources'] as &$source) {
$source = $document->url($source, null, -1);
}
unset($source);
$mapFile = JsonFile::instance($path . '.map');
return $this->compiler->reset();
}
/**
* Returns URL to CSS file.
*
* If file does not exist, it will be created by using CSS compiler.
*
* @param string $name
* @return string
*/
public function css($name)
{
if (!isset($this->cssCache[$name])) {
$compiler = $this->compiler();
if ($compiler->needsCompile($name, [$this, 'getCssVariables'])) {
GANTRY_DEBUGGER && \Gantry\Debugger::startTimer("css-{$name}", "Compiling CSS: {$name}") && \Gantry\Debugger::addMessage("Compiling CSS: {$name}");
$compiler->compileFile($name);
GANTRY_DEBUGGER && \Gantry\Debugger::stopTimer("css-{$name}");
}
$this->cssCache[$name] = $compiler->getCssUrl($name);
}
return $this->cssCache[$name];
}
public function getCssVariables()
{
if ($this->preset) {
$variables = $this->presets()->flatten($this->preset . '.styles', '-');
} else {
$gantry = self::gantry();
$variables = $gantry['config']->flatten('styles', '-');
}
return $variables;
$styles = $this->getAssetsInLocation('styles', $location);
if (!$styles) {
return [];
}
$gantry = Gantry::instance();
/** @var Theme $theme */
$theme = isset($gantry['theme']) ? $gantry['theme'] : null;
/** @var Document $document */
$document = $gantry['document'];
foreach ($styles as $key => $style) {
if (isset($style['href'])) {
$url = $style['href'];
if ($theme && preg_match('|\.scss$|', $url)) {
// Compile SCSS files.
$url = $theme->css(basename($url, '.scss'));
}
// Deal with streams and relative paths.
$url = $document->url($url, false, null, false);
$styles[$key]['href'] = $url;
}
}
return $styles;
}
/**
* @param string $location
* @return array
* @since 5.4.3
*/
public function getScripts($location = 'head')
{
$scripts = $this->getAssetsInLocation('scripts', $location);
public static function errorPage($new = null)
{
static $error = false;
if (isset($new)) {
$error = (bool) $new;
}
return $error;
}
protected static function registerStyles()
{
if (static::errorPage()) {
return;
}
$doc = \JFactory::getDocument();
$styles = static::$stack[0]->getStyles();
foreach ($styles as $style) {
switch ($style[':type']) {
case 'file':
$doc->addStyleSheet($style['href'], $style['type'], $style['media'], $style['element']);
break;
case 'inline':
$doc->addStyleDeclaration($style['content'], $style['type']);
break;
}
}
}
protected static function registerScripts()
{
if (static::errorPage()) {
return;
}
$doc = \JFactory::getDocument();
class Document extends HtmlDocument
{
protected static $availableFrameworks = [
'jquery' => 'registerJquery',
'jquery.framework' => 'registerJquery',
'jquery.ui.core' => 'registerJqueryUiCore',
'jquery.ui.sortable' => 'registerJqueryUiSortable',
'bootstrap.2' => 'registerBootstrap2',
'mootools' => 'registerMootools',
'mootools.framework' => 'registerMootools',
'mootools.core' => 'registerMootools',
'mootools.more' => 'registerMootoolsMore',
'lightcase' => 'registerLightcase',
'lightcase.init' => 'registerLightcaseInit',
];
public static function registerAssets()
{
static::registerFrameworks();
static::registerStyles();
static::registerScripts();
}
/**
* NOTE: In PHP this function can be called either from Gantry DI container or statically.
*
* @param bool $addDomain
* @return string
*/
public static function domain($addDomain = false)
{
if (!$addDomain) {
return '';
}
$absolute = \JUri::root(false);
$relative = \JUri::root(true);
return substr($absolute, 0, -strlen($relative));
}
public function getName()
{
return $this->name;
}
public function getEditor($name, $content = '', $width = null, $height = null)
{
return null;
}
public function filter($text)
{
return $text;
}
public function finalize()
{
$gantry = Gantry::instance();
$gantry['document']->registerAssets();
}
public function call()
{
$args = func_get_args();
$callable = array_shift($args);
return is_callable($callable) ? call_user_func_array($callable, $args) : null;
}
public function authorize($action)
{
return true;
}
/**
* @param array|string $dependencies
* @return bool|null
* @since 5.4.3
*/
public function checkDependencies($dependencies)
if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
return;
}
throw new RuntimeError(sprintf('Neither the property "%1$s" nor one of the methods "%1$s()", "get%1$s()"/"is%1$s()" or "__call()" exist and have public access in class "%2$s".', $item, $class), -1, $this->getSourceContext());
}
if ($isDefinedTest) {
return true;
}
if ($this->env->hasExtension('\Twig\Extension\SandboxExtension')) {
$this->env->getExtension('\Twig\Extension\SandboxExtension')->checkMethodAllowed($object, $method);
}
// Some objects throw exceptions when they have __call, and the method we try
// to call is not supported. If ignoreStrictCheck is true, we should return null.
try {
if (!$arguments) {
$ret = $object->$method();
} else {
$ret = \call_user_func_array([$object, $method], $arguments);
}
} catch (\BadMethodCallException $e) {
if ($call && ($ignoreStrictCheck || !$this->env->isStrictVariables())) {
return;
}
throw $e;
}
// @deprecated in 1.28
if ($object instanceof \Twig_TemplateInterface) {
$self = $object->getTemplateName() === $this->getTemplateName();
$message = sprintf('Calling "%s" on template "%s" from template "%s" is deprecated since version 1.28 and won\'t be supported anymore in 2.0.', $item, $object->getTemplateName(), $this->getTemplateName());
if ('renderBlock' === $method || 'displayBlock' === $method) {
$message .= sprintf(' Use block("%s"%s) instead).', $arguments[0], $self ? '' : ', template');
} elseif ('hasBlock' === $method) {
$message .= sprintf(' Use "block("%s"%s) is defined" instead).', $arguments[0], $self ? '' : ', template');
} elseif ('render' === $method || 'display' === $method) {
$message .= sprintf(' Use include("%s") instead).', $object->getTemplateName());
// line 56
public function block_body_bottom($context, array $blocks = [])
{
// line 57
echo " ";
}
// line 66
public function block_page_head($context, array $blocks = [])
{
// line 67
$this->loadTemplate("partials/page_head.html.twig", "@nucleus/page.html.twig", 67)->display($context);
}
// line 72
public function block_page_footer($context, array $blocks = [])
{
// line 73
echo " ";
$this->getAttribute($this->getAttribute(($context["gantry"] ?? null), "platform", []), "finalize", [], "method");
// line 74
echo twig_join_filter($this->getAttribute(($context["gantry"] ?? null), "scripts", [0 => "footer"], "method"), "
");
}
// line 80
public function block_page($context, array $blocks = [])
{
// line 81
echo "<!DOCTYPE ";
echo (($this->getAttribute($this->getAttribute($this->getAttribute(($context["gantry"] ?? null), "config", [], "any", false, true), "page", [], "any", false, true), "doctype", [], "any", true, true)) ? (_twig_default_filter($this->getAttribute($this->getAttribute($this->getAttribute(($context["gantry"] ?? null), "config", [], "any", false, true), "page", [], "any", false, true), "doctype", []), "html")) : ("html"));
echo ">
<html";
// line 82
echo $this->getAttribute($this->getAttribute(($context["gantry"] ?? null), "page", []), "htmlAttributes", []);
echo ">
";
// line 83
echo ($context["page_head"] ?? null);
echo "
if ($useBlocks && isset($blocks[$name])) {
$template = $blocks[$name][0];
$block = $blocks[$name][1];
} elseif (isset($this->blocks[$name])) {
$template = $this->blocks[$name][0];
$block = $this->blocks[$name][1];
} else {
$template = null;
$block = null;
}
// avoid RCEs when sandbox is enabled
if (null !== $template && !$template instanceof self) {
throw new \LogicException('A block must be a method on a \Twig\Template instance.');
}
if (null !== $template) {
try {
$template->$block($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($template->getSourceContext());
}
// this is mostly useful for \Twig\Error\LoaderError exceptions
// see \Twig\Error\LoaderError
if (-1 === $e->getTemplateLine()) {
$e->guess();
}
throw $e;
} catch (\Exception $e) {
$e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $template->getSourceContext(), $e);
$e->guess();
throw $e;
}
} elseif (false !== $parent = $this->getParent($context)) {
$parent->displayBlock($name, $context, array_merge($this->blocks, $blocks), false);
}
/**
* Displays a parent block.
*
* This method is for internal use only and should never be called
* directly.
*
* @param string $name The block name to display from the parent
* @param array $context The context
* @param array $blocks The current set of blocks
*/
public function displayParentBlock($name, array $context, array $blocks = [])
{
$name = (string) $name;
if (isset($this->traits[$name])) {
$this->traits[$name][0]->displayBlock($name, $context, $blocks, false);
} elseif (false !== $parent = $this->getParent($context)) {
$parent->displayBlock($name, $context, $blocks, false);
} else {
throw new RuntimeError(sprintf('The template has no parent and no traits defining the "%s" block.', $name), -1, $this->getSourceContext());
}
}
/**
* Displays a block.
*
* This method is for internal use only and should never be called
* directly.
*
* @param string $name The block name to display
* @param array $context The context
* @param array $blocks The current set of blocks
* @param bool $useBlocks Whether to use the current set of blocks
*/
public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true)
{
$name = (string) $name;
}
protected function doGetParent(array $context)
{
// line 1
return "@nucleus/page.html.twig";
}
protected function doDisplay(array $context, array $blocks = [])
{
$this->parent = $this->loadTemplate("@nucleus/page.html.twig", "partials/page.html.twig", 1);
$this->parent->display($context, array_merge($this->blocks, $blocks));
}
// line 3
public function block_page_footer($context, array $blocks = [])
{
// line 4
echo " ";
$this->displayParentBlock("page_footer", $context, $blocks);
echo "
<jdoc:include type=\"modules\" name=\"debug\" />
";
}
public function getTemplateName()
{
return "partials/page.html.twig";
}
public function isTraitable()
{
return false;
}
public function getDebugInfo()
{
return array ( 42 => 4, 39 => 3, 29 => 1,);
}
if ($useBlocks && isset($blocks[$name])) {
$template = $blocks[$name][0];
$block = $blocks[$name][1];
} elseif (isset($this->blocks[$name])) {
$template = $this->blocks[$name][0];
$block = $this->blocks[$name][1];
} else {
$template = null;
$block = null;
}
// avoid RCEs when sandbox is enabled
if (null !== $template && !$template instanceof self) {
throw new \LogicException('A block must be a method on a \Twig\Template instance.');
}
if (null !== $template) {
try {
$template->$block($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($template->getSourceContext());
}
// this is mostly useful for \Twig\Error\LoaderError exceptions
// see \Twig\Error\LoaderError
if (-1 === $e->getTemplateLine()) {
$e->guess();
}
throw $e;
} catch (\Exception $e) {
$e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $template->getSourceContext(), $e);
$e->guess();
throw $e;
}
} elseif (false !== $parent = $this->getParent($context)) {
$parent->displayBlock($name, $context, array_merge($this->blocks, $blocks), false);
// line 58
echo " ";
echo twig_join_filter($this->getAttribute($this->getAttribute(($context["gantry"] ?? null), "document", []), "getHtml", [0 => "body_bottom"], "method"), "
");
echo "
";
$context["body_bottom"] = ('' === $tmp = ob_get_clean()) ? '' : new Markup($tmp, $this->env->getCharset());
// line 61
$this->getAttribute($this->getAttribute(($context["gantry"] ?? null), "document", []), "addScript", [0 => $this->env->getExtension('Gantry\Component\Twig\TwigExtension')->urlFunc("gantry-assets://js/main.js"), 1 => 11, 2 => "footer"], "method");
// line 65
ob_start(function () { return ''; });
// line 66
echo " ";
$this->displayBlock('page_head', $context, $blocks);
$context["page_head"] = ('' === $tmp = ob_get_clean()) ? '' : new Markup($tmp, $this->env->getCharset());
// line 71
ob_start(function () { return ''; });
// line 72
echo " ";
$this->displayBlock('page_footer', $context, $blocks);
// line 76
echo "
";
// line 77
echo $this->getAttribute($this->getAttribute(($context["gantry"] ?? null), "debugger", []), "render", [], "method");
echo "
";
$context["page_footer"] = ('' === $tmp = ob_get_clean()) ? '' : new Markup($tmp, $this->env->getCharset());
// line 80
$this->displayBlock('page', $context, $blocks);
}
// line 8
public function block_content($context, array $blocks = [])
{
// line 9
echo " ";
}
// line 19
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
} catch (\Throwable $e) {
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
}
return ob_get_clean();
}
protected function displayWithErrorHandling(array $context, array $blocks = [])
{
try {
$this->doDisplay($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($this->getSourceContext());
}
// this is mostly useful for \Twig\Error\LoaderError exceptions
// see \Twig\Error\LoaderError
if (-1 === $e->getTemplateLine()) {
$e->guess();
}
throw $e;
} catch (\Exception $e) {
$e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getSourceContext(), $e);
$e->guess();
throw $e;
}
}
{
return $this;
}
/**
* Returns all blocks.
*
* This method is for internal use only and should never be called
* directly.
*
* @return array An array of blocks
*/
public function getBlocks()
{
return $this->blocks;
}
public function display(array $context, array $blocks = [])
{
$this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
}
public function render(array $context)
{
$level = ob_get_level();
if ($this->env->isDebug()) {
ob_start();
} else {
ob_start(function () { return ''; });
}
try {
$this->display($context);
} catch (\Exception $e) {
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
} catch (\Throwable $e) {
while (ob_get_level() > $level) {
{
public function __construct(Environment $env)
{
parent::__construct($env);
$this->blocks = [
'page_footer' => [$this, 'block_page_footer'],
];
}
protected function doGetParent(array $context)
{
// line 1
return "@nucleus/page.html.twig";
}
protected function doDisplay(array $context, array $blocks = [])
{
$this->parent = $this->loadTemplate("@nucleus/page.html.twig", "partials/page.html.twig", 1);
$this->parent->display($context, array_merge($this->blocks, $blocks));
}
// line 3
public function block_page_footer($context, array $blocks = [])
{
// line 4
echo " ";
$this->displayParentBlock("page_footer", $context, $blocks);
echo "
<jdoc:include type=\"modules\" name=\"debug\" />
";
}
public function getTemplateName()
{
return "partials/page.html.twig";
}
public function isTraitable()
{
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
} catch (\Throwable $e) {
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
}
return ob_get_clean();
}
protected function displayWithErrorHandling(array $context, array $blocks = [])
{
try {
$this->doDisplay($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($this->getSourceContext());
}
// this is mostly useful for \Twig\Error\LoaderError exceptions
// see \Twig\Error\LoaderError
if (-1 === $e->getTemplateLine()) {
$e->guess();
}
throw $e;
} catch (\Exception $e) {
$e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getSourceContext(), $e);
$e->guess();
throw $e;
}
}
{
return $this;
}
/**
* Returns all blocks.
*
* This method is for internal use only and should never be called
* directly.
*
* @return array An array of blocks
*/
public function getBlocks()
{
return $this->blocks;
}
public function display(array $context, array $blocks = [])
{
$this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
}
public function render(array $context)
{
$level = ob_get_level();
if ($this->env->isDebug()) {
ob_start();
} else {
ob_start(function () { return ''; });
}
try {
$this->display($context);
} catch (\Exception $e) {
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
} catch (\Throwable $e) {
while (ob_get_level() > $level) {
{
public function __construct(Environment $env)
{
parent::__construct($env);
$this->blocks = [
'content' => [$this, 'block_content'],
];
}
protected function doGetParent(array $context)
{
// line 1
return "partials/page.html.twig";
}
protected function doDisplay(array $context, array $blocks = [])
{
$this->parent = $this->loadTemplate("partials/page.html.twig", "index.html.twig", 1);
$this->parent->display($context, array_merge($this->blocks, $blocks));
}
// line 3
public function block_content($context, array $blocks = [])
{
// line 4
echo " ";
echo $this->getAttribute($this->getAttribute(($context["gantry"] ?? null), "platform", []), "displayContent", [0 => ($context["content"] ?? null)], "method");
echo "
";
}
public function getTemplateName()
{
return "index.html.twig";
}
public function isTraitable()
{
return false;
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
} catch (\Throwable $e) {
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
}
return ob_get_clean();
}
protected function displayWithErrorHandling(array $context, array $blocks = [])
{
try {
$this->doDisplay($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($this->getSourceContext());
}
// this is mostly useful for \Twig\Error\LoaderError exceptions
// see \Twig\Error\LoaderError
if (-1 === $e->getTemplateLine()) {
$e->guess();
}
throw $e;
} catch (\Exception $e) {
$e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getSourceContext(), $e);
$e->guess();
throw $e;
}
}
{
return $this;
}
/**
* Returns all blocks.
*
* This method is for internal use only and should never be called
* directly.
*
* @return array An array of blocks
*/
public function getBlocks()
{
return $this->blocks;
}
public function display(array $context, array $blocks = [])
{
$this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
}
public function render(array $context)
{
$level = ob_get_level();
if ($this->env->isDebug()) {
ob_start();
} else {
ob_start(function () { return ''; });
}
try {
$this->display($context);
} catch (\Exception $e) {
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
} catch (\Throwable $e) {
while (ob_get_level() > $level) {
public function getBlocks()
{
return $this->blocks;
}
public function display(array $context, array $blocks = [])
{
$this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
}
public function render(array $context)
{
$level = ob_get_level();
if ($this->env->isDebug()) {
ob_start();
} else {
ob_start(function () { return ''; });
}
try {
$this->display($context);
} catch (\Exception $e) {
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
} catch (\Throwable $e) {
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
}
return ob_get_clean();
}
protected function displayWithErrorHandling(array $context, array $blocks = [])
{
try {
* @internal
*/
public function __construct(Environment $env, Template $template)
{
$this->env = $env;
$this->template = $template;
}
/**
* Renders the template.
*
* @param array $context An array of parameters to pass to the template
*
* @return string The rendered template
*/
public function render($context = [])
{
// using func_get_args() allows to not expose the blocks argument
// as it should only be used by internal code
return $this->template->render($context, \func_num_args() > 1 ? func_get_arg(1) : []);
}
/**
* Displays the template.
*
* @param array $context An array of parameters to pass to the template
*/
public function display($context = [])
{
// using func_get_args() allows to not expose the blocks argument
// as it should only be used by internal code
$this->template->display($context, \func_num_args() > 1 ? func_get_arg(1) : []);
}
/**
* Checks if a block is defined.
*
* @param string $name The block name
* @param array $context An array of parameters to pass to the template
*
@trigger_error(sprintf('The %s method is deprecated since version 1.22 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
return $this->templateClassPrefix;
}
/**
* Renders a template.
*
* @param string|TemplateWrapper $name The template name
* @param array $context An array of parameters to pass to the template
*
* @return string The rendered template
*
* @throws LoaderError When the template cannot be found
* @throws SyntaxError When an error occurred during compilation
* @throws RuntimeError When an error occurred during rendering
*/
public function render($name, array $context = [])
{
return $this->load($name)->render($context);
}
/**
* Displays a template.
*
* @param string|TemplateWrapper $name The template name
* @param array $context An array of parameters to pass to the template
*
* @throws LoaderError When the template cannot be found
* @throws SyntaxError When an error occurred during compilation
* @throws RuntimeError When an error occurred during rendering
*/
public function display($name, array $context = [])
{
$this->load($name)->display($context);
}
/**
* Loads a template.
*
$this->renderer = $this->extendTwig($twig, $loader);
}
return $this->renderer;
}
/**
* Render a template file by using given context.
*
* @param string $file
* @param array $context
* @return string
*/
public function render($file, array $context = [])
{
// Include Gantry specific things to the context.
$context = $this->getContext($context);
return $this->renderer()->render($file, $context);
}
/**
* Compile and render twig string.
*
* @param string $string
* @param array $context
* @return string
*/
public function compile($string, array $context = [])
{
$renderer = $this->renderer();
$template = $renderer->createTemplate($string);
// Include Gantry specific things to the context.
$context = $this->getContext($context);
return $template->render($context);
}
* @copyright Copyright (C) 2007 - 2015 RocketTheme, LLC
* @license GNU/GPLv2 and later
*
* http://www.gnu.org/licenses/gpl-2.0.html
*/
defined('_JEXEC') or die;
// Bootstrap Gantry framework or fail gracefully (inside included file).
$gantry = include __DIR__ . '/includes/gantry.php';
/** @var \Gantry\Framework\Theme $theme */
$theme = $gantry['theme'];
/** @var \Gantry\Framework\Configurations $configurations */
$configurations = $gantry['configurations'];
// Render the page.
echo $theme
->render('index.html.twig');
* @param string $directory The name of the template
* @param string $filename The actual filename
*
* @return string The contents of the template
*
* @since 1.7.0
*/
protected function _loadTemplate($directory, $filename)
{
$contents = '';
// Check to see if we have a valid template file
if (file_exists($directory . '/' . $filename))
{
// Store the file path
$this->_file = $directory . '/' . $filename;
// Get the file content
ob_start();
require $directory . '/' . $filename;
$contents = ob_get_contents();
ob_end_clean();
}
// Try to find a favicon by checking the template and root folder
$icon = '/favicon.ico';
foreach (array($directory, JPATH_BASE) as $dir)
{
if (file_exists($dir . $icon))
{
$path = str_replace(JPATH_BASE, '', $dir);
$path = str_replace('\\', '/', $path);
$this->addFavicon(Uri::base(true) . $path . $icon);
break;
}
}
return $contents;
}
if (!file_exists($directory . '/' . $template . '/' . $file))
{
$file = 'index.php';
}
// Load the language file for the template
$lang = \JFactory::getLanguage();
// 1.5 or core then 1.6
$lang->load('tpl_' . $template, JPATH_BASE, null, false, true)
|| $lang->load('tpl_' . $template, $directory . '/' . $template, null, false, true);
// Assign the variables
$this->template = $template;
$this->baseurl = Uri::base(true);
$this->params = isset($params['params']) ? $params['params'] : new Registry;
// Load
$this->_template = $this->_loadTemplate($directory . '/' . $template, $file);
return $this;
}
/**
* Parse a document template
*
* @return HtmlDocument instance of $this to allow chaining
*
* @since 1.7.0
*/
protected function _parseTemplate()
{
$matches = array();
if (preg_match_all('#<jdoc:include\ type="([^"]+)"(.*)\/>#iU', $this->_template, $matches))
{
$template_tags_first = array();
$template_tags_last = array();
$options['title'] = (isset($args[3])) ? $args[3] : null;
}
parent::$_buffer[$options['type']][$options['name']][$options['title']] = $content;
return $this;
}
/**
* Parses the template and populates the buffer
*
* @param array $params Parameters for fetching the template
*
* @return HtmlDocument instance of $this to allow chaining
*
* @since 1.7.0
*/
public function parse($params = array())
{
return $this->_fetchTemplate($params)->_parseTemplate();
}
/**
* Outputs the template to the browser.
*
* @param boolean $caching If true, cache the output
* @param array $params Associative array of attributes
*
* @return string The rendered data
*
* @since 1.7.0
*/
public function render($caching = false, $params = array())
{
$this->_caching = $caching;
if (empty($this->_template))
{
$this->parse($params);
}
*/
protected function render()
{
// Setup the document options.
$this->docOptions['template'] = $this->get('theme');
$this->docOptions['file'] = $this->get('themeFile', 'index.php');
$this->docOptions['params'] = $this->get('themeParams');
if ($this->get('themes.base'))
{
$this->docOptions['directory'] = $this->get('themes.base');
}
// Fall back to constants.
else
{
$this->docOptions['directory'] = defined('JPATH_THEMES') ? JPATH_THEMES : (defined('JPATH_BASE') ? JPATH_BASE : __DIR__) . '/themes';
}
// Parse the document.
$this->document->parse($this->docOptions);
// Trigger the onBeforeRender event.
\JPluginHelper::importPlugin('system');
$this->triggerEvent('onBeforeRender');
$caching = false;
if ($this->isClient('site') && $this->get('caching') && $this->get('caching', 2) == 2 && !\JFactory::getUser()->get('id'))
{
$caching = true;
}
// Render the document.
$data = $this->document->render($caching, $this->docOptions);
// Set the application output data.
$this->setBody($data);
// Trigger the onAfterRender event.
$this->triggerEvent('onAfterRender');
$this->setUserState('users.login.form.data', array('return' => \JUri::getInstance()->toString()));
$this->set('themeFile', 'offline.php');
$this->setHeader('Status', '503 Service Temporarily Unavailable', 'true');
}
if (!is_dir(JPATH_THEMES . '/' . $template->template) && !$this->get('offline'))
{
$this->set('themeFile', 'component.php');
}
// Ensure themeFile is set by now
if ($this->get('themeFile') == '')
{
$this->set('themeFile', $file . '.php');
}
break;
}
parent::render();
}
/**
* Route the application.
*
* Routing is the process of examining the request environment to determine which
* component should receive the request. The component optional parameters
* are then set in the request object to be processed when the application is being
* dispatched.
*
* @return void
*
* @since 3.2
*/
protected function route()
{
// Execute the parent method
parent::route();
$Itemid = $this->input->getInt('Itemid', null);
}
}
/**
* Execute the application.
*
* @return void
*
* @since 3.2
*/
public function execute()
{
// Perform application routines.
$this->doExecute();
// If we have an application document object, render it.
if ($this->document instanceof \JDocument)
{
// Render the application output.
$this->render();
}
if ($this->get('block_floc', 1))
{
$headers = $this->getHeaders();
$notPresent = true;
foreach ($headers as $header)
{
if (strtolower($header['name']) === 'permissions-policy')
{
// Append interest-cohort if the Permissions-Policy is not set
if (strpos($header['value'], 'interest-cohort') === false)
{
$this->setHeader('Permissions-Policy', $header['value'] . ', interest-cohort=()', true);
}
$notPresent = false;
{
include_once __DIR__ . '/defines.php';
}
if (!defined('_JDEFINES'))
{
define('JPATH_BASE', __DIR__);
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';
// Set profiler start time and memory usage and mark afterLoad in the profiler.
JDEBUG ? JProfiler::getInstance('Application')->setStart($startTime, $startMem)->mark('afterLoad') : null;
// Instantiate the application.
$app = JFactory::getApplication('site');
// Execute the application.
$app->execute();