MarkdownRenderer.php 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <?php
  2. namespace App\Services\Template\Renderers;
  3. use App\Services\Template\Contracts\RendererInterface;
  4. use App\Services\Template\ParsedDocument;
  5. use App\Services\Template\ContentNode;
  6. use App\Services\Template\TextNode;
  7. use App\Services\Template\MarkdownNode;
  8. use App\Services\Template\TemplateNode;
  9. // ================== Markdown 渲染器 ==================
  10. class MarkdownRenderer implements RendererInterface
  11. {
  12. public function render(ParsedDocument $document): string
  13. {
  14. $markdown = '';
  15. foreach ($document->content as $node) {
  16. $markdown .= $this->renderNode($node);
  17. }
  18. return $markdown;
  19. }
  20. private function renderNode(ContentNode $node): string
  21. {
  22. switch ($node->type) {
  23. case 'text':
  24. return $this->renderText($node);
  25. case 'markdown':
  26. return $node->content;
  27. case 'template':
  28. return $this->renderTemplate($node);
  29. default:
  30. return '';
  31. }
  32. }
  33. public function renderText(TextNode $text): string
  34. {
  35. return $text->content;
  36. }
  37. public function renderTemplate(TemplateNode $template): string
  38. {
  39. // 将模板转换回 Markdown 格式
  40. $params = [];
  41. foreach ($template->parameters as $key => $value) {
  42. if (is_array($value)) {
  43. // 嵌套内容,递归渲染
  44. $nestedMarkdown = '';
  45. foreach ($value as $childNode) {
  46. $nestedMarkdown .= $this->renderNode($childNode);
  47. }
  48. $params[] = "$key=$nestedMarkdown";
  49. } else {
  50. $params[] = is_numeric($key) ? $value : "$key=$value";
  51. }
  52. }
  53. $paramString = implode('|', $params);
  54. return "{{" . $template->name . ($paramString ? "|$paramString" : "") . "}}";
  55. }
  56. }