[FEATURE] Allow .ts file extension for static typoscript templates
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_div.php
index 7aaa253..c42ccf2 100644 (file)
@@ -41,7 +41,7 @@
  * @package TYPO3
  * @subpackage t3lib
  */
-final class t3lib_div {
+class t3lib_div {
 
                // Severity constants used by t3lib_div::sysLog()
        const SYSLOG_SEVERITY_INFO = 0;
@@ -2415,15 +2415,27 @@ final class t3lib_div {
         * @return string Minified script or source string if error happened
         */
        public static function minifyJavaScript($script, &$error = '') {
-               require_once(PATH_typo3 . 'contrib/jsmin/jsmin.php');
-               try {
-                       $error = '';
-                       $script = trim(JSMin::minify(str_replace(CR, '', $script)));
-               }
-               catch (JSMinException $e) {
-                       $error = 'Error while minifying JavaScript: ' . $e->getMessage();
-                       self::devLog($error, 't3lib_div', 2,
-                               array('JavaScript' => $script, 'Stack trace' => $e->getTrace()));
+               if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['minifyJavaScript'])) {
+                       $fakeThis = FALSE;
+                       foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['minifyJavaScript'] as $hookMethod) {
+                               try {
+                                       $parameters = array('script' => $script);
+                                       $script = static::callUserFunction($hookMethod, $parameters, $fakeThis);
+                               } catch (Exception $e) {
+                                       $errorMessage = 'Error minifying java script: ' . $e->getMessage();
+                                       $error .= $errorMessage;
+                                       static::devLog(
+                                               $errorMessage,
+                                               't3lib_div',
+                                               2,
+                                               array(
+                                                       'JavaScript' => $script,
+                                                       'Stack trace' => $e->getTrace(),
+                                                       'hook' => $hookMethod
+                                               )
+                                       );
+                               }
+                       }
                }
                return $script;
        }
@@ -2843,7 +2855,7 @@ final class t3lib_div {
 
                        $result = @mkdir($fullDirectoryPath, $permissionMask, TRUE);
                        if (!$result) {
-                               throw new \RuntimeException('Could not create directory!', 1170251400);
+                               throw new \RuntimeException('Could not create directory "' . $fullDirectoryPath . '"!', 1170251400);
                        }
                }
                return $firstCreatedPath;
@@ -4200,10 +4212,10 @@ final class t3lib_div {
         * Calls a user-defined function/method in class
         * Such a function/method should look like this: "function proc(&$params, &$ref) {...}"
         *
-        * @param string $funcName Function/Method reference, '[file-reference":"]["&"]class/function["->"method-name]'. You can prefix this reference with "[file-reference]:" and t3lib_div::getFileAbsFileName() will then be used to resolve the filename and subsequently include it by "require_once()" which means you don't have to worry about including the class file either! Example: "EXT:realurl/class.tx_realurl.php:&tx_realurl->encodeSpURL". Finally; you can prefix the class name with "&" if you want to reuse a former instance of the same object call ("singleton").
+        * @param string $funcName Function/Method reference or Closure, '[file-reference":"]["&"]class/function["->"method-name]'. You can prefix this reference with "[file-reference]:" and t3lib_div::getFileAbsFileName() will then be used to resolve the filename and subsequently include it by "require_once()" which means you don't have to worry about including the class file either! Example: "EXT:realurl/class.tx_realurl.php:&tx_realurl->encodeSpURL". Finally; you can prefix the class name with "&" if you want to reuse a former instance of the same object call ("singleton").
         * @param mixed $params Parameters to be pass along (typically an array) (REFERENCE!)
         * @param mixed $ref Reference to be passed along (typically "$this" - being a reference to the calling object) (REFERENCE!)
-        * @param string $checkPrefix Not used anymore
+        * @param string $checkPrefix Not used anymore since 6.0
         * @param integer $errorMode Error mode (when class/function could not be found): 0 - call debug(), 1 - do nothing, 2 - raise an exception (allows to call a user function that may return FALSE)
         * @return mixed Content from method/function call or FALSE if the class/method/function was not found
         * @see getUserObj()
@@ -4211,6 +4223,11 @@ final class t3lib_div {
        public static function callUserFunction($funcName, &$params, &$ref, $checkPrefix = '', $errorMode = 0) {
                $content = FALSE;
 
+                       // Check if we're using a closure and invoke it directly.
+               if (is_object($funcName) && is_a($funcName, 'Closure')) {
+                       return call_user_func_array($funcName, array(&$params, &$ref));
+               }
+
                        // Check persistent object and if found, call directly and exit.
                if (is_array($GLOBALS['T3_VAR']['callUserFunction'][$funcName])) {
                        return call_user_func_array(
@@ -4303,11 +4320,15 @@ final class t3lib_div {
 
        /**
         * Creates and returns reference to a user defined object.
-        * This function can return an object reference if you like. Just prefix the function call with "&": "$objRef = &t3lib_div::getUserObj('EXT:myext/class.tx_myext_myclass.php:&tx_myext_myclass');". This will work ONLY if you prefix the class name with "&" as well. See description of function arguments.
+        * This function can return an object reference if you like.
+        * Just prefix the function call with "&": "$objRef = &t3lib_div::getUserObj('EXT:myext/class.tx_myext_myclass.php:&tx_myext_myclass');".
+        * This will work ONLY if you prefix the class name with "&" as well. See description of function arguments.
+        *
+        * @TODO: Deprecate the whole method in several steps: 1. Deprecated singleton pattern, 2. Deprecate file prefix/ require file, 3. Deprecate usage without valid class name. The last step should be to deprecate the method itslef.
         *
         * @param string $classRef Class reference, '[file-reference":"]["&"]class-name'. You can prefix the class name with "[file-reference]:" and t3lib_div::getFileAbsFileName() will then be used to resolve the filename and subsequently include it by "require_once()" which means you don't have to worry about including the class file either! Example: "EXT:realurl/class.tx_realurl.php:&tx_realurl". Finally; for the class name you can prefix it with "&" and you will reuse the previous instance of the object identified by the full reference string (meaning; if you ask for the same $classRef later in another place in the code you will get a reference to the first created one!).
-        * @param string $checkPrefix Not used anymore
-        * @param boolean $silent If set, no debug() error message is shown if class/function is not present.
+        * @param string $checkPrefix Not used anymore since 6.0
+        * @param boolean $silent Not used anymore since 6.0
         * @return object The instance of the class asked for. Instance is created with t3lib_div::makeInstance
         * @see callUserFunction()
         */
@@ -4346,10 +4367,6 @@ final class t3lib_div {
                                }
 
                                return $classObj;
-                       } else {
-                               if (!$silent) {
-                                       debug('<strong>ERROR:</strong> No class named: ' . $class, 't3lib_div::getUserObj');
-                               }
                        }
                }
        }
@@ -5260,25 +5277,15 @@ final class t3lib_div {
        }
 
        /**
-        * Quotes a string for usage as JS parameter. Depends whether the value is
-        * used in script tags (it doesn't need/must not get htmlspecialchar'ed in
-        * this case).
+        * Quotes a string for usage as JS parameter.
         *
         * @param string $value the string to encode, may be empty
-        * @param boolean $withinCData
-        *              whether the escaped data is expected to be used as CDATA and thus
-        *              does not need to be htmlspecialchared
         *
         * @return string the encoded value already quoted (with single quotes),
         *                              will not be empty
         */
-       static public function quoteJSvalue($value, $withinCData = FALSE) {
-               $escapedValue = addcslashes(
-                       $value, '\'' . '"' . '\\' . TAB . LF . CR
-               );
-               if (!$withinCData) {
-                       $escapedValue = htmlspecialchars($escapedValue);
-               }
+       public static function quoteJSvalue($value) {
+               $escapedValue = t3lib_div::makeInstance('t3lib_codec_JavaScriptEncoder')->encode($value);
                return '\'' . $escapedValue . '\'';
        }