xref: /plugin/combo/ComboStrap/MarkupFileSystem.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace ComboStrap;
4*04fd306cSNickeau
5*04fd306cSNickeauuse DateTime;
6*04fd306cSNickeau
7*04fd306cSNickeauclass MarkupFileSystem implements FileSystem
8*04fd306cSNickeau{
9*04fd306cSNickeau
10*04fd306cSNickeau    const SCHEME = "markup";
11*04fd306cSNickeau    const CANONICAL = "markup-file-system";
12*04fd306cSNickeau
13*04fd306cSNickeau    private static MarkupFileSystem $pageFileSystem;
14*04fd306cSNickeau
15*04fd306cSNickeau    public static function getOrCreate(): MarkupFileSystem
16*04fd306cSNickeau    {
17*04fd306cSNickeau        if (!isset(self::$pageFileSystem)) {
18*04fd306cSNickeau            self::$pageFileSystem = new MarkupFileSystem();
19*04fd306cSNickeau        }
20*04fd306cSNickeau        return self::$pageFileSystem;
21*04fd306cSNickeau    }
22*04fd306cSNickeau
23*04fd306cSNickeau
24*04fd306cSNickeau    /**
25*04fd306cSNickeau     * @param MarkupPath $path
26*04fd306cSNickeau     * @return bool
27*04fd306cSNickeau     */
28*04fd306cSNickeau    function exists(Path $path): bool
29*04fd306cSNickeau    {
30*04fd306cSNickeau        return FileSystems::exists($path->getPathObject());
31*04fd306cSNickeau    }
32*04fd306cSNickeau
33*04fd306cSNickeau    /**
34*04fd306cSNickeau     * @param MarkupPath $path
35*04fd306cSNickeau     * @throws ExceptionNotFound
36*04fd306cSNickeau     */
37*04fd306cSNickeau    function getContent(Path $path): string
38*04fd306cSNickeau    {
39*04fd306cSNickeau        return FileSystems::getContent($path->getPathObject());
40*04fd306cSNickeau    }
41*04fd306cSNickeau
42*04fd306cSNickeau    /**
43*04fd306cSNickeau     * @param MarkupPath $path
44*04fd306cSNickeau     * @throws ExceptionNotFound
45*04fd306cSNickeau     */
46*04fd306cSNickeau    function getModifiedTime(Path $path): DateTime
47*04fd306cSNickeau    {
48*04fd306cSNickeau        return FileSystems::getModifiedTime($path->getPathObject());
49*04fd306cSNickeau    }
50*04fd306cSNickeau
51*04fd306cSNickeau    /**
52*04fd306cSNickeau     * @param MarkupPath $path
53*04fd306cSNickeau     * @param string|null $type
54*04fd306cSNickeau     * @return MarkupPath[]
55*04fd306cSNickeau     */
56*04fd306cSNickeau    public function getChildren(Path $path, string $type = null): array
57*04fd306cSNickeau    {
58*04fd306cSNickeau        /**
59*04fd306cSNickeau         * A page is never a directory
60*04fd306cSNickeau         * We get the parent directory, iterate over it and returns the children page
61*04fd306cSNickeau         */
62*04fd306cSNickeau        $pathObject = $path->getPathObject();
63*04fd306cSNickeau        try {
64*04fd306cSNickeau            $parent = $pathObject->getParent();
65*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
66*04fd306cSNickeau            return [];
67*04fd306cSNickeau        }
68*04fd306cSNickeau        $childrenPage = [];
69*04fd306cSNickeau        $childrenPath = FileSystems::getChildren($parent, $type);
70*04fd306cSNickeau        foreach ($childrenPath as $child) {
71*04fd306cSNickeau            if ($child->toUriString() === $pathObject->toUriString()) {
72*04fd306cSNickeau                continue;
73*04fd306cSNickeau            }
74*04fd306cSNickeau            $childrenPage[] = MarkupPath::createPageFromPathObject($child);
75*04fd306cSNickeau        }
76*04fd306cSNickeau        return $childrenPage;
77*04fd306cSNickeau    }
78*04fd306cSNickeau
79*04fd306cSNickeau    public function setContent(Path $path, string $content)
80*04fd306cSNickeau    {
81*04fd306cSNickeau        try {
82*04fd306cSNickeau            FileSystems::setContent($path->toLocalPath(), $content);
83*04fd306cSNickeau        } catch (ExceptionCast $e) {
84*04fd306cSNickeau            throw new ExceptionRuntimeInternal("The path could not be cast to a local path", self::CANONICAL, 1, $e);
85*04fd306cSNickeau        }
86*04fd306cSNickeau    }
87*04fd306cSNickeau
88*04fd306cSNickeau    public function delete(Path $path)
89*04fd306cSNickeau    {
90*04fd306cSNickeau
91*04fd306cSNickeau        try {
92*04fd306cSNickeau            FileSystems::delete($path->toLocalPath());
93*04fd306cSNickeau        } catch (ExceptionCast|ExceptionFileSystem $e) {
94*04fd306cSNickeau            throw new ExceptionRuntimeInternal("The path could not be deleted", self::CANONICAL, 1, $e);
95*04fd306cSNickeau        }
96*04fd306cSNickeau
97*04fd306cSNickeau    }
98*04fd306cSNickeau}
99