| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- <?php
- namespace App\Services\Template\Renderers;
- use App\Services\Template\Contracts\RendererInterface;
- use App\Services\Template\ParsedDocument;
- use App\Services\Template\ContentNode;
- use App\Services\Template\TextNode;
- use App\Services\Template\MarkdownNode;
- use App\Services\Template\TemplateNode;
- // ================== 纯文本渲染器 ==================
- class TextRenderer implements RendererInterface
- {
- private array $templateTexts = [];
- public function __construct()
- {
- $this->initializeTemplateTexts();
- }
- private function initializeTemplateTexts(): void
- {
- $this->templateTexts = [
- 'note' => function ($params) {
- $type = $params['type'] ?? 'info';
- $text = $params['text'] ?? '';
- $title = $params['title'] ?? '';
- $prefix = match ($type) {
- 'warning' => '[警告]',
- 'error' => '[错误]',
- 'success' => '[成功]',
- default => '[信息]'
- };
- return $prefix . ($title ? " $title: " : ' ') . $text;
- },
- 'info' => function ($params) {
- $content = $params['content'] ?? '';
- $title = $params['title'] ?? '';
- return '[信息]' . ($title ? " $title: " : ' ') . $content;
- },
- 'warning' => function ($params) {
- $message = $params['message'] ?? '';
- $title = $params['title'] ?? '';
- return '[警告]' . ($title ? " $title: " : ' ') . $message;
- }
- ];
- }
- public function render(ParsedDocument $document): string
- {
- $text = '';
- foreach ($document->content as $node) {
- $text .= $this->renderNode($node);
- }
- return $text;
- }
- private function renderNode(ContentNode $node): string
- {
- switch ($node->type) {
- case 'text':
- return $this->renderText($node);
- case 'markdown':
- return $this->renderMarkdownAsText($node);
- case 'template':
- return $this->renderTemplate($node);
- default:
- return '';
- }
- }
- public function renderText(TextNode $text): string
- {
- return $text->content;
- }
- private function renderMarkdownAsText(MarkdownNode $markdown): string
- {
- // 移除 Markdown 标记,返回纯文本
- $text = $markdown->content;
- // 移除粗体和斜体标记
- $text = preg_replace('/\*\*(.*?)\*\*/', '$1', $text);
- $text = preg_replace('/\*(.*?)\*/', '$1', $text);
- // 移除链接标记,保留链接文本
- $text = preg_replace('/\[([^\]]+)\]\([^)]+\)/', '$1', $text);
- return $text;
- }
- public function renderTemplate(TemplateNode $template): string
- {
- if (!isset($this->templateTexts[$template->name])) {
- // 未知模板,返回简化的文本表示
- $text = $template->name;
- if (!empty($template->parameters)) {
- $paramTexts = [];
- foreach ($template->parameters as $key => $value) {
- if (is_array($value)) {
- $nestedText = '';
- foreach ($value as $childNode) {
- $nestedText .= $this->renderNode($childNode);
- }
- $paramTexts[] = is_numeric($key) ? $nestedText : "$key: $nestedText";
- } else {
- $paramTexts[] = is_numeric($key) ? $value : "$key: $value";
- }
- }
- $text .= '(' . implode(', ', $paramTexts) . ')';
- }
- return $text;
- }
- $renderer = $this->templateTexts[$template->name];
- // 处理参数中的嵌套内容
- $processedParams = [];
- foreach ($template->parameters as $key => $value) {
- if (is_array($value)) {
- $nestedText = '';
- foreach ($value as $childNode) {
- $nestedText .= $this->renderNode($childNode);
- }
- $processedParams[$key] = $nestedText;
- } else {
- $processedParams[$key] = $value;
- }
- }
- return $renderer($processedParams);
- }
- public function registerTemplate(string $name, callable $renderer): void
- {
- $this->templateTexts[$name] = $renderer;
- }
- }
|