1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-05-08 08:35:31 +02:00

[ticket/11435] Create new template filter option (cleanup)

This allows us to only run cleanup on the last run of template compilation
and not cleanup during event parsing

PHPBB3-11435
This commit is contained in:
Nathan Guse 2013-05-20 11:45:32 -05:00
parent f26257dc51
commit c84fc97e90
2 changed files with 78 additions and 30 deletions

View File

@ -32,6 +32,13 @@ class phpbb_template_compile
*/
private $filter_params;
/**
* Array of default parameters
*
* @var array
*/
private $default_filter_params;
/**
* Constructor.
*
@ -44,17 +51,39 @@ class phpbb_template_compile
*/
public function __construct($allow_php, $style_names, $locator, $phpbb_root_path, $extension_manager = null, $user = null)
{
$this->filter_params = array(
'allow_php' => $allow_php,
'style_names' => $style_names,
'locator' => $locator,
$this->filter_params = $this->default_filter_params = array(
'allow_php' => $allow_php,
'style_names' => $style_names,
'locator' => $locator,
'phpbb_root_path' => $phpbb_root_path,
'extension_manager' => $extension_manager,
'user' => $user,
'user' => $user,
'template_compile' => $this,
'cleanup' => true,
);
}
/**
* Set filter parameters
*
* @param array $params Array of parameters (will be merged onto $this->filter_params)
*/
public function set_filter_params($params)
{
$this->filter_params = array_merge(
$this->filter_params,
$params
);
}
/**
* Reset filter parameters to their default settings
*/
public function reset_filter_params()
{
$this->filter_params = $this->default_filter_params;
}
/**
* Compiles template in $source_file and writes compiled template to
* cache directory

View File

@ -75,6 +75,14 @@ class phpbb_template_filter extends php_user_filter
*/
private $allow_php;
/**
* Whether cleanup will be performed on resulting code, see compile()
* (Preserve whitespace)
*
* @var bool
*/
private $cleanup = true;
/**
* Resource locator.
*
@ -183,6 +191,7 @@ class phpbb_template_filter extends php_user_filter
$this->phpbb_root_path = $this->params['phpbb_root_path'];
$this->style_names = $this->params['style_names'];
$this->extension_manager = $this->params['extension_manager'];
$this->cleanup = $this->params['cleanup'];
if (isset($this->params['user']))
{
$this->user = $this->params['user'];
@ -223,41 +232,45 @@ class phpbb_template_filter extends php_user_filter
$data = preg_replace('~<!-- ENDPHP -->.*?$~', '', $data);
}
/*
if ($this->cleanup)
{
/*
Preserve whitespace.
PHP removes a newline after the closing tag (if it's there).
This is by design:
Preserve whitespace.
PHP removes a newline after the closing tag (if it's there).
This is by design:
http://www.php.net/manual/en/language.basic-syntax.phpmode.php
http://www.php.net/manual/en/language.basic-syntax.instruction-separation.php
http://www.php.net/manual/en/language.basic-syntax.phpmode.php
http://www.php.net/manual/en/language.basic-syntax.instruction-separation.php
Consider the following template:
Consider the following template:
<!-- IF condition -->
some content
<!-- ENDIF -->
<!-- IF condition -->
some content
<!-- ENDIF -->
If we were to simply preserve all whitespace, we could simply
replace all "?>" tags with "?>\n".
Doing that, would add additional newlines to the compiled
template in place of the IF and ENDIF statements. These
newlines are unwanted (and one is conditional). The IF and
ENDIF are usually on their own line for ease of reading.
If we were to simply preserve all whitespace, we could simply
replace all "?>" tags with "?>\n".
Doing that, would add additional newlines to the compiled
template in place of the IF and ENDIF statements. These
newlines are unwanted (and one is conditional). The IF and
ENDIF are usually on their own line for ease of reading.
This replacement preserves newlines only for statements that
are not the only statement on a line. It will NOT preserve
newlines at the end of statements in the above example.
It will preserve newlines in situations like:
This replacement preserves newlines only for statements that
are not the only statement on a line. It will NOT preserve
newlines at the end of statements in the above example.
It will preserve newlines in situations like:
<!-- IF condition -->inline content<!-- ENDIF -->
<!-- IF condition -->inline content<!-- ENDIF -->
*/
*/
$data = preg_replace('~(?<!^)(<\?php.+(?<!/\*\*/)\?>)$~m', "$1\n", $data);
$data = str_replace('/**/?>', "?>\n", $data);
$data = str_replace('?><?php', '', $data);
}
$data = preg_replace('~(?<!^)(<\?php.+(?<!/\*\*/)\?>)$~m', "$1\n", $data);
$data = str_replace('/**/?>', "?>\n", $data);
$data = str_replace('?><?php', '', $data);
return $data;
}
@ -995,8 +1008,14 @@ class phpbb_template_filter extends php_user_filter
$all_compiled = '';
foreach ($files as $file)
{
$this->template_compile->set_filter_params(array(
'cleanup' => false,
));
$compiled = $this->template_compile->compile_file($file);
$this->template_compile->reset_filter_params();
if ($compiled === false)
{
if ($this->user)