Core\View: Add code pre-insertion to template when compiling

Needed for a plugin system.
This commit is contained in:
Visman 2023-10-10 23:29:55 +07:00
parent e096fa6965
commit 5c39cdbddf
2 changed files with 43 additions and 8 deletions

View file

@ -23,6 +23,7 @@ use RuntimeException;
class View
{
protected string $ext = '.forkbb.php';
protected string $preFile = '';
protected ?Compiler $compilerObj;
protected string $compilerClass = Compiler::class;
@ -56,6 +57,10 @@ class View
if (! empty($config['compiler'])) {
$this->compilerClass = $config['compiler'];
}
if (! empty($config['preFile'])) {
$this->preFile = $config['preFile'];
}
} else {
// для rev. 68 и ниже
$this->cacheDir = $config;
@ -194,7 +199,7 @@ class View
! \file_exists($php)
|| \filemtime($tpl) > \filemtime($php)
) {
$this->create($php, $tpl);
$this->create($php, $tpl, $name);
}
return $php;
@ -209,7 +214,7 @@ class View
! \file_exists($php)
|| \filemtime($tpl) > \filemtime($php)
) {
$this->create($php, $tpl);
$this->create($php, $tpl, $name);
}
return $php;
@ -228,13 +233,13 @@ class View
/**
* Генерирует $php файл на основе шаблона $tpl
*/
protected function create(string $php, string $tpl): void
protected function create(string $php, string $tpl, string $name): void
{
if (empty($this->compilerObj)) {
$this->compilerObj = new $this->compilerClass();
$this->compilerObj = new $this->compilerClass($this->preFile);
}
$text = $this->compilerObj->create(\file_get_contents($tpl), \hash('fnv1a32', $tpl));
$text = $this->compilerObj->create($name, \file_get_contents($tpl), \hash('fnv1a32', $tpl));
if (false === \file_put_contents($php, $text, \LOCK_EX)) {
throw new RuntimeException("Failed to write {$php} file");

View file

@ -22,23 +22,33 @@ class Compiler
{
protected string $shortID;
protected int $loopsCounter = 0;
protected array $compilers = [
protected array $compilers = [
'PrePaste',
'Statements',
'Comments',
'Echos',
'Transformations',
];
protected array $preArray = [];
protected string $tplName;
public function __construct()
public function __construct(string $preFile)
{
if (
! empty($preFile)
&& \is_file($preFile)
) {
$this->preArray = include $preFile;
}
}
/**
* Генерирует php код на основе шаблона из $text
*/
public function create(string $text, string $hash): string
public function create(string $name, string $text, string $hash): string
{
$this->shortID = $hash;
$this->tplName = $name;
foreach ($this->compilers as $type) {
$text = $this->{'compile' . $type}($text);
@ -47,6 +57,26 @@ class Compiler
return $text;
}
/**
* Обрабатывает предварительную подстановку кода в шаблон
*/
protected function compilePrePaste(string $value): string
{
$pre = $this->preArray[$this->tplName] ?? null;
return \preg_replace_callback(
'%[ \t]*+<!-- PRE (\w+) -->[ \t]*\r?\n?%',
function($match) use ($pre) {
if (isset($pre[$match[1]])) {
return \rtrim($pre[$match[1]]) . "\n";
} else {
return '';
}
},
$value
);
}
/**
* Обрабатывает операторы начинающиеся с @
*/