From c84fc97e9059792d244d49d0d379d627227b12ab Mon Sep 17 00:00:00 2001 From: Nathan Guse Date: Mon, 20 May 2013 11:45:32 -0500 Subject: [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 --- phpBB/includes/template/compile.php | 39 ++++++++++++++++++--- phpBB/includes/template/filter.php | 69 +++++++++++++++++++++++-------------- 2 files changed, 78 insertions(+), 30 deletions(-) (limited to 'phpBB/includes/template') diff --git a/phpBB/includes/template/compile.php b/phpBB/includes/template/compile.php index fcdaf7abda..76cb3011df 100644 --- a/phpBB/includes/template/compile.php +++ b/phpBB/includes/template/compile.php @@ -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 diff --git a/phpBB/includes/template/filter.php b/phpBB/includes/template/filter.php index ea7990da53..f2bd442010 100644 --- a/phpBB/includes/template/filter.php +++ b/phpBB/includes/template/filter.php @@ -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('~.*?$~', '', $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: - - some content - + + some content + - 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: - inline content + inline content - */ + */ + + $data = preg_replace('~(?)$~m', "$1\n", $data); + $data = str_replace('/**/?>', "?>\n", $data); + $data = str_replace('?>)$~m', "$1\n", $data); - $data = str_replace('/**/?>', "?>\n", $data); - $data = str_replace('?>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) -- cgit v1.2.1