Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
8 / 8
CRAP
100.00% covered (success)
100.00%
1 / 1
Markdown
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
8 / 8
9
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 __toString
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 body
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 compile
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toHtml
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toArray
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 fromFile
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 render
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace Hyde\Markdown\Models;
6
7use Hyde\Framework\Services\MarkdownService;
8use Hyde\Markdown\MarkdownConverter;
9use Illuminate\Contracts\Support\Arrayable;
10use Illuminate\Contracts\Support\Htmlable;
11use Illuminate\Support\HtmlString;
12use Stringable;
13
14/**
15 * A simple object representation of a Markdown file, with helpful methods to interact with it.
16 */
17class Markdown implements Arrayable, Stringable, Htmlable
18{
19    public string $body;
20
21    /**
22     * Create a new Markdown object from a string.
23     */
24    public function __construct(string $body = '')
25    {
26        $this->body = str_replace("\r\n", "\n", rtrim($body));
27    }
28
29    /**
30     * Get the source Markdown body.
31     */
32    public function __toString(): string
33    {
34        return $this->body;
35    }
36
37    /**
38     * Get the source Markdown body.
39     */
40    public function body(): string
41    {
42        return $this->body;
43    }
44
45    /**
46     * Compile the Markdown body to a string of HTML.
47     *
48     * If the Markdown being compiled is from a page model, supply
49     * model's class name here so the dynamic parser can be used.
50     *
51     * @param  class-string<\Hyde\Pages\Concerns\HydePage>|null  $pageClass
52     */
53    public function compile(?string $pageClass = null): string
54    {
55        return static::render($this->body, $pageClass);
56    }
57
58    /**
59     * Same as Markdown::compile(), but returns an HtmlString object.
60     */
61    public function toHtml(?string $pageClass = null): HtmlString
62    {
63        return new HtmlString($this->compile($pageClass));
64    }
65
66    /**
67     * Get the Markdown document body as an array of lines.
68     *
69     * @return string[]
70     */
71    public function toArray(): array
72    {
73        return explode("\n", $this->body);
74    }
75
76    /**
77     * Parse a Markdown file into a new Markdown object.
78     */
79    public static function fromFile(string $path): static
80    {
81        return MarkdownDocument::parse($path)->markdown();
82    }
83
84    /**
85     * Render a Markdown string into HTML.
86     *
87     * If a source model is provided, the Markdown will be converted using the dynamic MarkdownService,
88     * otherwise, the pre-configured singleton from the service container will be used instead.
89     *
90     * @return string $html
91     */
92    public static function render(string $markdown, ?string $pageClass = null): string
93    {
94        if ($pageClass !== null) {
95            return (new MarkdownService($markdown, $pageClass))->parse();
96        } else {
97            /** @var MarkdownConverter $converter */
98            $converter = app(MarkdownConverter::class);
99
100            return (string) $converter->convert($markdown);
101        }
102    }
103}