{%- 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 }}
$this->storeEnv = $storeEnv;
break;
case Type::T_DEBUG:
list(, $value) = $child;
$fname = $this->sourceNames[$this->sourceIndex];
$line = $this->sourceLine;
$value = $this->compileValue($this->reduce($value, true));
fwrite($this->stderr, “File $fname on line $line DEBUG: $valuen”);
break;
case Type::T_WARN:
list(, $value) = $child;
$fname = $this->sourceNames[$this->sourceIndex];
$line = $this->sourceLine;
$value = $this->compileValue($this->reduce($value, true));
fwrite($this->stderr, “File $fname on line $line WARN: $valuen”);
break;
case Type::T_ERROR:
list(, $value) = $child;
$fname = $this->sourceNames[$this->sourceIndex];
$line = $this->sourceLine;
$value = $this->compileValue($this->reduce($value, true));
$this->throwError(“File $fname on line $line ERROR: $valuen”);
break;
case Type::T_CONTROL:
$this->throwError(‘@break/@continue not permitted in this scope’);
break;
default:
$this->throwError(“unknown child type: $child[0]”);
}
}
$this->storeEnv = $storeEnv;
break;
case Type::T_DEBUG:
list(, $value) = $child;
$fname = $this->sourceNames[$this->sourceIndex];
$line = $this->sourceLine;
$value = $this->compileValue($this->reduce($value, true));
fwrite($this->stderr, “File $fname on line $line DEBUG: $valuen”);
break;
case Type::T_WARN:
list(, $value) = $child;
$fname = $this->sourceNames[$this->sourceIndex];
$line = $this->sourceLine;
$value = $this->compileValue($this->reduce($value, true));
fwrite($this->stderr, “File $fname on line $line WARN: $valuen”);
break;
case Type::T_ERROR:
list(, $value) = $child;
$fname = $this->sourceNames[$this->sourceIndex];
$line = $this->sourceLine;
$value = $this->compileValue($this->reduce($value, true));
$this->throwError(“File $fname on line $line ERROR: $valuen”);
break;
case Type::T_CONTROL:
$this->throwError(‘@break/@continue not permitted in this scope’);
break;
default:
$this->throwError(“unknown child type: $child[0]”);
}
}
protected function popCallStack()
{
array_pop($this->callStack);
}
/**
* Compile children and return result
*
* @param array $stms
* @param LeafoScssPhpFormatterOutputBlock $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 LeafoScssPhpFormatterOutputBlock $out
* @param LeafoScssPhpBlock $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 LeafoScssPhpFormatterOutputBlock $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 LeafoScssPhpFormatterOutputBlock $out
* @param LeafoScssPhpBlock $selfParent
* @param string $traceName
*
* @throws Exception
}
$this->pushEnv();
$storeEnv = $this->storeEnv;
$this->storeEnv = $this->env;
// set the args
if (isset($func->args)) {
$this->applyArguments($func->args, $argValues);
}
// throw away lines and children
$tmp = new OutputBlock;
$tmp->lines = [];
$tmp->children = [];
$this->env->marker = ‘function’;
$ret = $this->compileChildren($func->children, $tmp, $this->env->marker . ” ” . $name);
$this->storeEnv = $storeEnv;
$this->popEnv();
$returnValue = ! isset($ret) ? static::$defaultValue : $ret;
return true;
}
/**
* Call built-in and registered (PHP) functions
*
* @param string $name
* @param array $args
* @param array $returnValue
*
* @return boolean Returns true if returnValue is set; otherwise, false
*/
protected function callNativeFunction($name, $args, &$returnValue)
$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)
{
// 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]];
}
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];
* @param LeafoScssPhpBlock $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
*/
$this->handleImportLoop($realPath);
$tree = $this->importCache[$realPath];
} else {
$code = file_get_contents($realPath);
// Work around a bug in the compiler.
if (strpos($realPath, ‘/_bourbon-deprecate.scss’) !== false) {
$code = preg_replace(‘/@content;/u’, ”, $code);
}
$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 LeafoScssPhpFormatterOutputBlock $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 LeafoScssPhpBlock $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
*/
$this->handleImportLoop($realPath);
$tree = $this->importCache[$realPath];
} else {
$code = file_get_contents($realPath);
// Work around a bug in the compiler.
if (strpos($realPath, ‘/_bourbon-deprecate.scss’) !== false) {
$code = preg_replace(‘/@content;/u’, ”, $code);
}
$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 LeafoScssPhpFormatterOutputBlock $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 LeafoScssPhpBlock $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
*/
$this->handleImportLoop($realPath);
$tree = $this->importCache[$realPath];
} else {
$code = file_get_contents($realPath);
// Work around a bug in the compiler.
if (strpos($realPath, ‘/_bourbon-deprecate.scss’) !== false) {
$code = preg_replace(‘/@content;/u’, ”, $code);
}
$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 LeafoScssPhpFormatterOutputBlock $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 LeafoScssPhpBlock $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
*/
$this->handleImportLoop($realPath);
$tree = $this->importCache[$realPath];
} else {
$code = file_get_contents($realPath);
// Work around a bug in the compiler.
if (strpos($realPath, ‘/_bourbon-deprecate.scss’) !== false) {
$code = preg_replace(‘/@content;/u’, ”, $code);
}
$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 LeafoScssPhpFormatterOutputBlock $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 LeafoScssPhpBlock $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 LeafoScssPhpBlock $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) {
$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.
$compiler = $this->getLegacyCompiler();
$compiler->setBasePath($path);
$compiler->setImportPaths([[$this, ‘findLegacyImport’]]);
// Run the compiler.
$compiler->setVariables($this->getVariables());
$scss = ‘@import “‘ . $in . ‘.scss”‘;
try {
$css = $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’);
$compiler = $this->getCompiler();
$compiler->setLogger($logger);
// Set the lookup paths.
$this->functions->setBasePath($path);
$compiler->setImportPaths([[$this, ‘findImport’]]);
// Run the compiler.
$compiler->addVariables($this->getVariables(true));
$scss = ‘$output-bourbon-deprecation-warnings: false;’ . “n” . ‘@import “‘ . $in . ‘.scss”‘;
try {
$this->result = $compiler->compileString($scss);
$css = $this->result->getCss();
} catch (CompilerException $e) {
if (version_compare(static::$options[‘compatibility’], ‘5.5’, ‘<‘)) {
static::$options[‘legacy’][$in] = true;
$this->warnings[‘__TITLE__’] = ‘Please update your theme!’;
$this->warnings[$in] = [‘WARNING: ‘ . $e->getMessage()];
return $this->compileLegacyFile($in);
}
throw new RuntimeException(“ERROR: CSS Compilation on file ‘{$in}.scss’ failed on error: {$e->getMessage()}”, 500, $e);
} catch (Exception $e) {
throw new RuntimeException(“ERROR: CSS Compilation on file ‘{$in}.scss’ failed on fatal error: {$e->getMessage()}”, 500, $e);
}
if (strpos($css, $scss) === 0) {
$css = ‘/* ‘ . $scss . ‘ */’;
}
// Extract map from css and save it as separate file.
$pos = strrpos($css, ‘/*# sourceMappingURL=’);
if ($pos !== false) {
$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, false, -1);
/**
* 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’])) {
if (GANTRY_DEBUGGER) {
Debugger::startTimer(“css-{$name}”, “Compiling CSS: {$name}”);
Debugger::addMessage(“Compiling CSS: {$name}”);
}
$compiler->compileFile($name);
if (GANTRY_DEBUGGER) {
Debugger::stopTimer(“css-{$name}”);
}
}
$this->cssCache[$name] = $compiler->getCssUrl($name);
}
return $this->cssCache[$name];
}
/**
* @return array
*/
public function getCssVariables()
{
if ($this->preset) {
$variables = $this->presets()->flatten($this->preset . ‘.styles’, ‘-‘);
} else {
$styles = $this->getAssetsInLocation(‘styles’, $location);
if (!$styles) {
return [];
}
$gantry = Gantry::instance();
/** @var Theme|null $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);
static $error = false;
if (isset($new)) {
$error = (bool) $new;
}
return $error;
}
protected static function registerStyles()
{
if (static::errorPage()) {
return;
}
/** @var CMSApplication $application */
$application = Factory::getApplication();
$doc = $application->getDocument();
$styles = static::$stack[0]->getStyles();
foreach ($styles as $style) {
switch ($style[‘:type’]) {
case ‘file’:
$attribs = array_replace([‘type’ => $style[‘type’], ‘media’ => $style[‘media’]], $style[‘element’]);
$attribs = array_filter($attribs, static function($arg) { return null !== $arg; });
$doc->addStyleSheet($style[‘href’], [], $attribs);
break;
case ‘inline’:
$doc->addStyleDeclaration($style[‘content’], $style[‘type’]);
break;
}
}
}
protected static function registerScripts()
{
if (static::errorPage()) {
return;
}
if (
$framework === ‘bootstrap’
|| ($framework === ‘bootstrap.2’ && JVersion::MAJOR_VERSION === 3)
|| ($framework === ‘bootstrap.5’ && JVersion::MAJOR_VERSION >= 4)
) {
/** @var Theme $theme */
$theme = Gantry::instance()[‘theme’];
$theme->joomla = true;
}
return true;
}
/**
*
*/
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 = Uri::root(false);
$relative = Uri::root(true);
return substr($absolute, 0, -strlen($relative));
}
{
return null;
}
/**
* @param string $text
* @return string
*/
public function filter($text)
{
return $text;
}
public function finalize()
{
$gantry = Gantry::instance();
/** @var Document $document */
$document = $gantry[‘document’];
$document::registerAssets();
}
/**
* @return mixed|null
*/
public function call()
{
$args = func_get_args();
$callable = array_shift($args);
return is_callable($callable) ? call_user_func_array($callable, $args) : null;
}
/**
* @param string $action
* @param int|string|null $id
* @return bool
*/
public function authorize($action, $id = null)
{
return true;
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(‘TwigExtensionSandboxExtension’)) {
$this->env->getExtension(‘TwigExtensionSandboxExtension’)->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 TwigTemplate instance.’);
}
if (null !== $template) {
try {
$template->$block($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($template->getSourceContext());
}
// this is mostly useful for TwigErrorLoaderError exceptions
// see TwigErrorLoaderError
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 TwigTemplate instance.’);
}
if (null !== $template) {
try {
$template->$block($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($template->getSourceContext());
}
// this is mostly useful for TwigErrorLoaderError exceptions
// see TwigErrorLoaderError
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(‘GantryComponentTwigTwigExtension’)->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 TwigErrorLoaderError exceptions
// see TwigErrorLoaderError
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 TwigErrorLoaderError exceptions
// see TwigErrorLoaderError
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 TwigErrorLoaderError exceptions
// see TwigErrorLoaderError
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);
}
* @author RocketTheme http://www.rockettheme.com
* @copyright Copyright (C) 2007 – 2020 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 GantryFrameworkTheme $theme */
$theme = $gantry[‘theme’];
// All the custom twig variables can be defined in here:
$context = array();
// Render the page.
echo $theme->render(‘index.html.twig’, $context);
* @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);
// Unset invalid system variables
foreach ($invalidInputVariables as $systemVariable)
{
$input->set($systemVariable, null);
}
// Abort when there are invalid variables
if ($invalidInputVariables)
{
throw new RuntimeException(‘Invalid input, aborting application.’);
}
// 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 gzip compression is enabled in configuration and the server is compliant, compress the output.
if ($this->get(‘gzip’) && !ini_get(‘zlib.output_compression’) && ini_get(‘output_handler’) !== ‘ob_gzhandler’)
{
$this->compress();
// Trigger the onAfterCompress event.
$this->triggerEvent(‘onAfterCompress’);
}
// Send the application response.
$this->respond();
// Trigger the onAfterRespond event.
$this->triggerEvent(‘onAfterRespond’);
}
/**
* Check if the user is required to reset their password.
{
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();