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