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