public function resolvePath (string $source, string $target) : string
    {
        $sourceDirs = $this->toDirectoryFragments(\dirname($source));
        $targetFileName = \basename($target);

        // if relative path is absolute, just return the absolute path
        if ("/" === \substr($target, 0, 1))
        {
            return $target;
        }

        // strip leading "./"
        if ("./" === \substr($target, 0, 2))
        {
            $target = \substr($target, 2);
        }

        $targetDirs = $this->toDirectoryFragments(\dirname($target));

        // if the relative dirs are empty (it is just a file name), use the same directory
        if (empty($targetDirs))
        {
            return $this->buildFilePath($sourceDirs, $targetFileName);
        }

        // strip leading "../../" from the beginning of the relative dir and simultaneously from the end of the source dir
        while (!empty($targetDirs) && ".." === $targetDirs[0])
        {
            \array_pop($sourceDirs);
            \array_shift($targetDirs);
        }

        return $this->buildFilePath(
            \array_merge($sourceDirs, $targetDirs),
            $targetFileName
        );
    }
public function resolvePath (string $source, string $target) : string
    {
        $sourceDirs = $this->toDirectoryFragments(\dirname($source));
        $targetFileName = \basename($target);

        // if relative path is absolute, just return the absolute path
        if ("/" === \substr($target, 0, 1))
        {
            return $target;
        }

        // strip leading "./"
        if ("./" === \substr($target, 0, 2))
        {
            $target = \substr($target, 2);
        }

        $targetDirs = $this->toDirectoryFragments(\dirname($target));

        // if the relative dirs are empty (it is just a file name), use the same directory
        if (empty($targetDirs))
        {
            return $this->buildFilePath($sourceDirs, $targetFileName);
        }

        // strip leading "../../" from the beginning of the relative dir and simultaneously from the end of the source dir
        while (!empty($targetDirs) && ".." === $targetDirs[0])
        {
            \array_pop($sourceDirs);
            \array_shift($targetDirs);
        }

        return $this->buildFilePath(
            \array_merge($sourceDirs, $targetDirs),
            $targetFileName
        );
    }
public function resolvePath ( string $ source , string $ target ) : string { $ sourceDirs = $ this -> toDirectoryFragments ( \ dirname ( $ source ) ) ; $ targetFileName = \ basename ( $ target ) ; // if relative path is absolute, just return the absolute path if ( "/" === \ substr ( $ target , 0 , 1 ) ) { return $ target ; } // strip leading "./" if ( "./" === \ substr ( $ target , 0 , 2 ) ) { $ target = \ substr ( $ target , 2 ) ; } $ targetDirs = $ this -> toDirectoryFragments ( \ dirname ( $ target ) ) ; // if the relative dirs are empty (it is just a file name), use the same directory if ( empty ( $ targetDirs ) ) { return $ this -> buildFilePath ( $ sourceDirs , $ targetFileName ) ; } // strip leading "../../" from the beginning of the relative dir and simultaneously from the end of the source dir while ( ! empty ( $ targetDirs ) && ".." === $ targetDirs [ 0 ] ) { \ array_pop ( $ sourceDirs ) ; \ array_shift ( $ targetDirs ) ; } return $ this -> buildFilePath ( \ array_merge ( $ sourceDirs , $ targetDirs ) , $ targetFileName ) ; }
Resolves an absolute path with a relative one

@param string $source    the path to the source
@param string $target    the relative path to the target
@return string
Resolves an absolute path with a relative one