Overview

Namespaces

  • CzProject

Classes

  • CzProject\PathHelper
  • Overview
  • Namespace
  • Class
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 
<?php
    /**
     * @author  Jan Pecha, <janpecha@email.cz>
     * @license BSD-3 (see license.md file)
     */

    namespace CzProject;

    class PathHelper
    {
        /**
         * @param  string
         * @param  string
         * @return string  relative path
         */
        public static function createRelativePath($source, $destination)
        {
            $source = ltrim($source, '/');
            $destination = ltrim($destination, '/');

            $source = explode('/', $source);
            $sourceCount = count($source);
            $destination = explode('/', $destination);

            // remove first same parts
            $iter = 0;
            foreach ($source as $index => $part) {
                if (isset($destination[$index - $iter]) && $destination[$index - $iter] === $source[$index]) {
                    array_shift($destination);
                    $sourceCount--;
                    $iter++;
                    continue;
                }
                break;
            }

            $destinationCount = count($destination);
            $padLeft = $sourceCount - 1;

            if ($padLeft < 0) {
                array_unshift($destination, end($source));
            } else {
                $padLeft += (!$destinationCount) ? 1 : 0;

                if ($destinationCount === 1 && $destination[0] === '') { // remove empty '' (prevents '../', gets '..')
                    $destination = array();
                    $destinationCount = 0;
                } elseif ($destinationCount === 0) {
                    end($source);
                    $k = $sourceCount - $destinationCount;
                    while ($k) {
                        $part = prev($source);
                        $k--;
                    }
                    $destination = array($part);
                    $padLeft++;
                }

                $destination = array_pad($destination, ($destinationCount + $padLeft) * -1, '..');
            }

            $destination = implode('/', $destination);
            return $destination !== '' ? $destination : '.';
        }


        /**
         * @param  string
         * @param  string
         * @return boolean
         */
        public static function isPathCurrent($currentPath, $mask)
        {
            // $path muze obsahovat wildcard (*)
            // Priklady:
            // */contact.html => about/contact.html, ale ne en/about/contact.html
            // en/*/index.html => en/about/index.html, ale ne en/about/references/index.html
            // (tj. nematchuje '/')
            // ALE!
            // about/* => about/index.html i about/references/index.html
            // (tj. wildcard na konci matchuje i '/')

            $currentPath = ltrim($currentPath, '/');
            $mask = ltrim(trim($mask), '/');

            if ($mask === '*') {
                return TRUE;
            }

            // build pattern
            $pattern = strtr(preg_quote($mask, '#'), array(
                '\*\*' => '.*',
                '\*' => '[^/]*',
            ));

            // match
            return (bool) preg_match('#^' . $pattern . '\z#i', $currentPath);
        }


        /**
         * Generates absolute path (resolves '..' and '.' parts)
         * @param  string
         * @return string
         */
        public static function absolutizePath($path, $prefix = '/')
        {
            $path = explode('/', $path);
            $buffer = array();

            foreach ($path as $part) {
                if ($part === '' || $part === '.') { // // || /./
                    continue;
                } elseif ($part === '..') { // /../
                    array_pop($buffer);
                } else {
                    $buffer[] = $part;
                }
            }

            return $prefix . implode('/', $buffer);
        }
    }
czproject/path-helper v4.0.0 API documentation API documentation generated by ApiGen