MarkdownRenderer.php 1.8 KB

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