partial}} * - Simple string-based rendering (no external dependencies) */ class SimpleTemplate { private $data; /** * Render template with data * * @param string $template Template content with placeholders * @param array $data Data to populate template * @return string Rendered template */ public static function render($template, $data) { $instance = new self(); $instance->data = $data; return $instance->renderTemplate($template); } /** * Process template and replace placeholders * * @param string $template Template content * @return string Processed template */ private function renderTemplate($template) { // Handle partial includes first ({{>partial}}) $template = preg_replace_callback('/{{>([^}]+)}}/', [$this, 'replacePartial'], $template); // Handle conditional blocks foreach ($this->data as $key => $value) { if (is_array($value) || (is_string($value) && !empty($value))) { // Handle {{#key}}...{{/key}} blocks $pattern = '/{{#' . preg_quote($key, '/') . '}}(.*?){{\/' . preg_quote($key, '/') . '}}/s'; if (preg_match($pattern, $template, $matches)) { $replacement = $matches[1]; $template = preg_replace($pattern, $replacement, $template); } // Handle {{^key}}...{{/key}} blocks (negative condition) $pattern = '/{{\^' . preg_quote($key, '/') . '}}(.*?){{\/' . preg_quote($key, '/') . '}}/s'; $template = preg_replace($pattern, '', $template); } else { // Handle empty blocks $pattern = '/{{#' . preg_quote($key, '/') . '}}.*?{{\/' . preg_quote($key, '/') . '}}/s'; $template = preg_replace($pattern, '', $template); // Handle {{^key}}...{{/key}} blocks (show when empty) $pattern = '/{{\^' . preg_quote($key, '/') . '}}(.*?){{\/' . preg_quote($key, '/') . '}}/s'; if (preg_match_all($pattern, $template, $matches)) { foreach ($matches[1] as $match) { $template = preg_replace('/{{\^' . preg_quote($key, '/') . '}}.*?{{\/' . preg_quote($key, '/') . '}}/s', $match, $template, 1); } } } } // Handle variable replacements foreach ($this->data as $key => $value) { // Handle triple braces for unescaped HTML content if (strpos($template, '{{{' . $key . '}}}') !== false) { $template = str_replace('{{{' . $key . '}}}', $value, $template); } // Handle double braces for escaped content elseif (strpos($template, '{{' . $key . '}}') !== false) { $template = str_replace('{{' . $key . '}}', htmlspecialchars($value, ENT_QUOTES, 'UTF-8'), $template); } } return $template; } /** * Replace partial includes with data values * * @param array $matches Regex matches from preg_replace_callback * @return string Replacement content */ private function replacePartial($matches) { $partialName = $matches[1]; return isset($this->data[$partialName]) ? $this->data[$partialName] : $matches[0]; } }