xref: /plugin/combo/ComboStrap/LocalPath.php (revision e4026cd1b0c4088a2208afc8f3dd143c48923c0a)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeau
4c3437056SNickeaunamespace ComboStrap;
5c3437056SNickeau
6c3437056SNickeau/**
7c3437056SNickeau * Class LocalPath
8c3437056SNickeau * @package ComboStrap
9c3437056SNickeau * A local file system path
10c3437056SNickeau */
11c3437056SNickeauclass LocalPath extends PathAbs
12c3437056SNickeau{
13c3437056SNickeau
14c3437056SNickeau    private const FILE_SYSTEM_DIRECTORY_SEPARATOR = DIRECTORY_SEPARATOR;
15c3437056SNickeau
16*e4026cd1Sgerardnico    /**
17*e4026cd1Sgerardnico     * The characters that cannot be in the path for windows
18*e4026cd1Sgerardnico     * @var string[]
19*e4026cd1Sgerardnico     */
20*e4026cd1Sgerardnico    public const RESERVED_WINDOWS_CHARACTERS = ["\\", "/", ":", "*", "?", "\"", "<", ">", "|"];
21*e4026cd1Sgerardnico
22c3437056SNickeau    private $path;
23c3437056SNickeau
24c3437056SNickeau    /**
25c3437056SNickeau     * LocalPath constructor.
26c3437056SNickeau     * @param $path
27c3437056SNickeau     */
28c3437056SNickeau    public function __construct($path)
29c3437056SNickeau    {
30c3437056SNickeau        $this->path = $path;
31c3437056SNickeau    }
32c3437056SNickeau
33c3437056SNickeau
34c3437056SNickeau    public static function create(string $filePath): LocalPath
35c3437056SNickeau    {
36c3437056SNickeau        return new LocalPath($filePath);
37c3437056SNickeau    }
38c3437056SNickeau
39c3437056SNickeau    public static function createFromPath(string $string): LocalPath
40c3437056SNickeau    {
41c3437056SNickeau        return new LocalPath($string);
42c3437056SNickeau    }
43c3437056SNickeau
44c3437056SNickeau    function getScheme(): string
45c3437056SNickeau    {
46c3437056SNickeau        return LocalFs::SCHEME;
47c3437056SNickeau    }
48c3437056SNickeau
49c3437056SNickeau    function getLastName()
50c3437056SNickeau    {
51c3437056SNickeau        $names = $this->getNames();
52c3437056SNickeau        $sizeof = sizeof($names);
53c3437056SNickeau        if ($sizeof === 0) {
54c3437056SNickeau            return null;
55c3437056SNickeau        }
56c3437056SNickeau        return $names[$sizeof - 1];
57c3437056SNickeau
58c3437056SNickeau    }
59c3437056SNickeau
60c3437056SNickeau    public function getExtension()
61c3437056SNickeau    {
62c3437056SNickeau        return pathinfo($this->path, PATHINFO_EXTENSION);
63c3437056SNickeau    }
64c3437056SNickeau
65c3437056SNickeau    function getNames()
66c3437056SNickeau    {
67c3437056SNickeau        $directorySeparator = $this->getDirectorySeparator();
68c3437056SNickeau        return explode($directorySeparator, $this->path);
69c3437056SNickeau    }
70c3437056SNickeau
71c3437056SNickeau    function getDokuwikiId()
72c3437056SNickeau    {
73c3437056SNickeau        throw new ExceptionComboRuntime("Not implemented");
74c3437056SNickeau    }
75c3437056SNickeau
76c3437056SNickeau
77c3437056SNickeau    function toString()
78c3437056SNickeau    {
79c3437056SNickeau        return $this->path;
80c3437056SNickeau    }
81c3437056SNickeau
82c3437056SNickeau    public function getParent(): ?Path
83c3437056SNickeau    {
84c3437056SNickeau        $absolutePath = pathinfo($this->path, PATHINFO_DIRNAME);
85c3437056SNickeau        if (empty($absolutePath)) {
86c3437056SNickeau            return null;
87c3437056SNickeau        }
88c3437056SNickeau        return new LocalPath($absolutePath);
89c3437056SNickeau    }
90c3437056SNickeau
91c3437056SNickeau    function toAbsolutePath(): Path
92c3437056SNickeau    {
93c3437056SNickeau        $path = realpath($this->path);
94c3437056SNickeau        if ($path !== false) {
95c3437056SNickeau            // Path return false when the file does not exist
96c3437056SNickeau            return new LocalPath($path);
97c3437056SNickeau        }
98c3437056SNickeau        return $this;
99c3437056SNickeau
100c3437056SNickeau    }
101c3437056SNickeau
102c3437056SNickeau    /**
103c3437056SNickeau     * @return string
104c3437056SNickeau     */
105c3437056SNickeau    private function getDirectorySeparator(): string
106c3437056SNickeau    {
107c3437056SNickeau        $directorySeparator = self::FILE_SYSTEM_DIRECTORY_SEPARATOR;
108c3437056SNickeau        if (
109c3437056SNickeau            $directorySeparator === '\\'
110c3437056SNickeau            &&
111c3437056SNickeau            strpos($this->path, "/") !== false
112c3437056SNickeau        ) {
113c3437056SNickeau            $directorySeparator = "/";
114c3437056SNickeau        }
115c3437056SNickeau        return $directorySeparator;
116c3437056SNickeau    }
117c3437056SNickeau
118c3437056SNickeau
119c3437056SNickeau}
120