Project

General

Profile

1
<?php
2

    
3
/*
4
 * Copyright (C) 2017 Manuela v.d.Decken <manuela@isteam.de>
5
 *
6
 * DO NOT ALTER OR REMOVE COPYRIGHT OR THIS HEADER
7
 *
8
 * This program is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation, version 2 of the License.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License 2 for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License 2
18
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
 */
20
/**
21
 * Description of Autoloader
22
 *
23
 * @package      Core
24
 * @copyright    Manuela v.d.Decken <manuela@isteam.de>
25
 * @author       Manuela v.d.Decken <manuela@isteam.de>
26
 * @license      GNU General Public License 3.0
27
 * @version      0.0.1
28
 * @revision     $Id: CoreAutoloader.php 17 2017-10-04 12:40:32Z Manuela $
29
 * @since        File available since 05.07.2017
30
 * @deprecated   no / since 0000/00/00
31
 * @description  xxx
32
 */
33
//declare(strict_types = 1);
34
//declare(encoding = 'UTF-8');
35

    
36
namespace bin;
37

    
38
// use
39

    
40
/**
41
 * short description of class
42
 */
43
class CoreAutoloader
44
{
45

    
46
    private static $sInstallPath = '';
47
    private static $aPatterns = [];
48
    private static $aReplacements = [];
49

    
50
    private static $aTransNs = [
51
        'vendor/jscalendar' => 'include/jscalendar',
52
        'vendor'            => 'include',
53
        'bin/interfaces'    => 'framework',
54
        'bin/db'            => 'framework/db',
55
        'bin'               => 'framework',
56
        'addon'             => 'modules',
57
        'acp'               => 'admin',
58
    ];
59
/**
60
 * add new Namespace->Directory relation or overwrite existing
61
 * @param string $sNamespace
62
 * @param string $sDirectory
63
 */
64
    public static function addNamespace($sNamespace, $sDirectory)
65
    {
66
        $sNamespace = \trim(\str_replace('\\', '/', $sNamespace), '/');
67
        $sDirectory = \trim(\str_replace('\\', '/', $sDirectory), '/');
68
        self::$aTransNs[$sNamespace] = $sDirectory;
69
        \krsort(self::$aTransNs);
70
        self::$aPatterns = self::$aReplacements = [];
71
        foreach (self::$aTransNs as $sPattern => $sReplacement) {
72
            self::$aPatterns[]     = '@^('.$sPattern.'/)@su';
73
            self::$aReplacements[] = $sReplacement.'/';
74
        }
75
    }
76

    
77
    public static function autoLoad($sClassName)
78
    {
79
        $aMatches = \preg_split(
80
            '=/=',
81
            \str_replace('\\', '/',$sClassName.'.php'),
82
            null,
83
            \PREG_SPLIT_NO_EMPTY
84
        );
85
        // insert default NS if no one is given
86
        if (\sizeof($aMatches) == 1) { \array_unshift($aMatches, 'framework'); }
87
        // extract default filename
88
        $sClassFileName = \array_pop($aMatches);
89
        // translate namespaces into the real dir entries
90
        $sClassDirName = self::$sInstallPath.\preg_replace(
91
            self::$aPatterns,
92
            self::$aReplacements,
93
            \implode('/', $aMatches).'/'
94
        );
95
        // first seek normal filename
96
        $sFilePath = $sClassDirName.$sClassFileName;
97
        if (\is_readable($sFilePath)) {
98
            include $sFilePath;
99
        } else {
100
            // second seek filename with prefix 'class.'
101
            $sFilePath = $sClassDirName.'class.'.$sClassFileName;
102
            if (\is_readable($sFilePath)) {
103
                include $sFilePath;
104
            }
105
        }
106
    }
107
/**
108
 * register this autoloader
109
 */
110
    public static function doRegister(array $aAdditionalTranslations = null)
111
    {
112
        if (!is_null($aAdditionalTranslations)) {
113
            foreach ($aAdditionalTranslations as $sKey=>$sValue) {
114
                self::$aTransNs[$sKey] = $sValue;
115
            }
116
        }
117
        \krsort(self::$aTransNs);
118
        self::$sInstallPath = \rtrim(\str_replace('\\', '/', \dirname(__DIR__)), '/').'/';
119
        foreach (self::$aTransNs as $sPattern => $sReplacement) {
120
            self::$aPatterns[]     = '@^('.$sPattern.'/)@su';
121
            self::$aReplacements[] = $sReplacement.'/';
122
        }
123
        \spl_autoload_register([__CLASS__, 'autoLoad']);
124
    }
125

    
126
/**
127
 * unregister this autoloader
128
 */
129
    public static function unRegister()
130
    {
131
        \spl_autoload_unregister([__CLASS__, 'autoLoad']);
132
    }
133

    
134
}
(1-1/28)