[TASK] Deprecate some functions not in use anymore in the core
[Packages/TYPO3.CMS.git] / typo3 / sysext / frontend / Classes / ContentObject / ContentObjectRenderer.php
index 4b97ccd..98bdea5 100644 (file)
@@ -14,7 +14,6 @@ namespace TYPO3\CMS\Frontend\ContentObject;
  * The TYPO3 project - inspiring people to share!
  */
 
-use TYPO3\CMS\Compatibility6\ContentObject\OffsetTableContentObject;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\FrontendEditing\FrontendEditingController;
 use TYPO3\CMS\Core\Html\HtmlParser;
@@ -34,6 +33,7 @@ use TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser;
 use TYPO3\CMS\Core\TypoScript\TemplateService;
 use TYPO3\CMS\Core\Utility\ArrayUtility;
 use TYPO3\CMS\Core\Utility\DebugUtility;
+use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Core\Utility\HttpUtility;
 use TYPO3\CMS\Core\Utility\MailUtility;
@@ -41,14 +41,13 @@ use TYPO3\CMS\Core\Utility\MathUtility;
 use TYPO3\CMS\Core\Utility\StringUtility;
 use TYPO3\CMS\Core\Versioning\VersionState;
 use TYPO3\CMS\Frontend\ContentObject\Exception\ContentRenderingException;
+use TYPO3\CMS\Frontend\ContentObject\Exception\ExceptionHandlerInterface;
 use TYPO3\CMS\Frontend\ContentObject\Exception\ProductionExceptionHandler;
 use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
 use TYPO3\CMS\Frontend\Http\UrlProcessorInterface;
 use TYPO3\CMS\Frontend\Imaging\GifBuilder;
-use TYPO3\CMS\Frontend\ContentObject\Exception\ExceptionHandlerInterface;
 use TYPO3\CMS\Frontend\Page\CacheHashCalculator;
 use TYPO3\CMS\Frontend\Page\PageRepository;
-use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Frontend\Service\TypoLinkCodecService;
 
 /**
@@ -191,8 +190,6 @@ class ContentObjectRenderer
         'fontTag' => 'wrap',
         'fontTag.' => 'array',
         'addParams.' => 'array',
-        'textStyle.' => 'array',
-        'tableStyle.' => 'array',
         'filelink.' => 'array',
         'preCObject' => 'cObject',
         'preCObject.' => 'array',
@@ -228,8 +225,6 @@ class ContentObjectRenderer
         'outerWrap.' => 'array',
         'insertData' => 'boolean',
         'insertData.' => 'array',
-        'offsetWrap' => 'space',
-        'offsetWrap.' => 'array',
         'postUserFunc' => 'functionName',
         'postUserFuncInt' => 'functionName',
         'prefixComment' => 'string',
@@ -379,7 +374,7 @@ class ContentObjectRenderer
      * The function stdWrap has TypoScript properties that fetch field-data from this array.
      *
      * @var array
-     * @see init()
+     * @see start()
      */
     public $data = array();
 
@@ -389,7 +384,7 @@ class ContentObjectRenderer
     protected $table = '';
 
     /**
-     * Used for backup...
+     * Used for backup
      *
      * @var array
      */
@@ -675,7 +670,7 @@ class ContentObjectRenderer
     {
         $this->data = $data;
         $this->table = $table;
-        $this->currentRecord = $table ? $table . ':' . $this->data['uid'] : '';
+        $this->currentRecord = $table !== '' ? $table . ':' . $this->data['uid'] : '';
         $this->parameters = array();
         if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['cObjTypeAndClass'])) {
             foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['cObjTypeAndClass'] as $classArr) {
@@ -1041,80 +1036,6 @@ class ContentObjectRenderer
 
         return $exceptionHandlerConfiguration;
     }
-    /**
-     * Rendering the cObject, FLOWPLAYER
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('FLOWPLAYER', $conf) instead
-     */
-    public function FLOWPLAYER($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('FLOWPLAYER'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, TEXT
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('TEXT', $conf) instead
-     */
-    public function TEXT($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('TEXT'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, CLEARGIF
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('CLEARGIF', $conf) instead
-     */
-    public function CLEARGIF($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('CLEARGIF'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, COBJ_ARRAY / COA and COBJ_ARRAY_INT
-     *
-     * @param array $conf Array of TypoScript properties
-     * @param string $ext If "INT" then the cObject is a "COBJ_ARRAY_INT" (non-cached), otherwise just "COBJ_ARRAY" (cached)
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('COA', $conf) or $cObj->cObjGetSingle('COA_INT', $conf) instead
-     */
-    public function COBJ_ARRAY($conf, $ext = '')
-    {
-        GeneralUtility::logDeprecatedFunction();
-        if ($ext === 'INT') {
-            return $this->render($this->getContentObject('COA_INT'), $conf);
-        } else {
-            return $this->render($this->getContentObject('COA'), $conf);
-        }
-    }
-
-    /**
-     * Rendering the cObject, USER and USER_INT
-     *
-     * @param array $conf Array of TypoScript properties
-     * @param string $ext If "INT" then the cObject is a "USER_INT" (non-cached), otherwise just "USER" (cached)
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('USER', $conf) or $cObj->cObjGetSingle('USER_INT', $conf) instead
-     */
-    public function USER($conf, $ext = '')
-    {
-        GeneralUtility::logDeprecatedFunction();
-        if ($ext === 'INT') {
-            return $this->render($this->getContentObject('USER_INT'), $conf);
-        } else {
-            return $this->render($this->getContentObject('USER'), $conf);
-        }
-    }
 
     /**
      * Retrieves a type of object called as USER or USER_INT. Object can detect their
@@ -1154,317 +1075,6 @@ class ContentObjectRenderer
         }
     }
 
-    /**
-     * Rendering the cObject, FILE
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('FILE', $conf) instead
-     */
-    public function FILE($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('FILE'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, FILES
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('FILES', $conf) instead
-     */
-    public function FILES($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('FILES'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, IMAGE
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @see cImage()
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('IMAGE', $conf) instead
-     */
-    public function IMAGE($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('IMAGE'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, IMG_RESOURCE
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @see getImgResource()
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('IMG_RESOURCE', $conf) instead
-     */
-    public function IMG_RESOURCE($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('IMG_RESOURCE'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, IMGTEXT
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('IMGTEXT', $conf) instead
-     */
-    public function IMGTEXT($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('IMGTEXT'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, CONTENT
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('CONTENT', $conf) instead
-     */
-    public function CONTENT($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('CONTENT'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, RECORDS
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('RECORDS', $conf) instead
-     */
-    public function RECORDS($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('RECORDS'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, HMENU
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('HMENU', $conf) instead
-     */
-    public function HMENU($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('HMENU'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, CTABLE
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('CTABLE', $conf) instead
-     */
-    public function CTABLE($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('CTABLE'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, OTABLE
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('OTABLE', $conf) instead
-     */
-    public function OTABLE($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('OTABLE'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, COLUMNS
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('COLUMNS', $conf) instead
-     */
-    public function COLUMNS($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('COLUMNS'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, HRULER
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('HRULER', $conf) instead
-     */
-    public function HRULER($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('HRULER'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, CASE
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('CASE', $conf) instead
-     */
-    public function CASEFUNC($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('CASE'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, LOAD_REGISTER and RESTORE_REGISTER
-     * NOTICE: This cObject does NOT return any content since it just sets internal data based on the TypoScript properties.
-     *
-     * @param array $conf Array of TypoScript properties
-     * @param string $name If "RESTORE_REGISTER" then the cObject rendered is "RESTORE_REGISTER", otherwise "LOAD_REGISTER"
-     * @return string Empty string (the cObject only sets internal data!)
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('LOAD_REGISTER', $conf) and $cObj->cObjGetSingle('RESTORE_REGISTER', $conf) instead
-     */
-    public function LOAD_REGISTER($conf, $name)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        if ($name === 'RESTORE_REGISTER') {
-            return $this->render($this->getContentObject('RESTORE_REGISTER'), $conf);
-        } else {
-            return $this->render($this->getContentObject('LOAD_REGISTER'), $conf);
-        }
-    }
-
-    /**
-     * Rendering the cObject, FORM
-     *
-     * @param array $conf Array of TypoScript properties
-     * @param array|string $formData Alternative formdata overriding whatever comes from TypoScript
-     * @return string Output
-     * @throws ContentRenderingException
-     * @throws \Exception
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('FORM', $conf) instead
-     */
-    public function FORM($conf, $formData = '')
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('FORM'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, SEARCHRESULT
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('SEARCHRESULT', $conf) instead
-     */
-    public function SEARCHRESULT($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('SEARCHRESULT'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, TEMPLATE
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @see substituteMarkerArrayCached()
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('TEMPLATE', $conf) instead
-     */
-    public function TEMPLATE($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('TEMPLATE'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, FLUIDTEMPLATE
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string the HTML output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('FLUIDTEMPLATE', $conf) instead
-     */
-    protected function FLUIDTEMPLATE(array $conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('FLUIDTEMPLATE'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, MULTIMEDIA
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('MULTIMEDIA', $conf) instead
-     */
-    public function MULTIMEDIA($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('MULTIMEDIA'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, MEDIA
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('MEDIA', $conf) instead
-     */
-    public function MEDIA($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('MEDIA'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, SWFOBJECT
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('SWFOBJECT', $conf) instead
-     */
-    public function SWFOBJECT($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('SWFOBJECT'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, QTOBJECT
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('QTOBJECT', $conf) instead
-     */
-    public function QTOBJECT($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('QTOBJECT'), $conf);
-    }
-
-    /**
-     * Rendering the cObject, SVG
-     *
-     * @param array $conf Array of TypoScript properties
-     * @return string Output
-     * @deprecated since TYPO3 CMS 7, will be removed with TYPO3 CMS 8, use $cObj->cObjGetSingle('SVG', $conf) instead
-     */
-    public function SVG($conf)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        return $this->render($this->getContentObject('SVG'), $conf);
-    }
-
     /************************************
      *
      * Various helper functions for content objects:
@@ -1581,13 +1191,13 @@ class ContentObjectRenderer
         $tsfe->imagesOnPage[] = $source;
         $altParam = $this->getAltParam($conf);
         $params = $this->stdWrapValue('params', $conf);
-        if ($params !== '' && $params{0} !== ' ') {
+        if ($params !== '' && $params[0] !== ' ') {
             $params = ' ' . $params;
         }
 
         $imageTagValues = array(
-            'width' =>  $info[0],
-            'height' => $info[1],
+            'width' =>  (int)$info[0],
+            'height' => (int)$info[1],
             'src' => htmlspecialchars($source),
             'params' => $params,
             'altParams' => $altParam,
@@ -1606,14 +1216,14 @@ class ContentObjectRenderer
             $theValue = $this->imageLinkWrap($theValue, $originalFile, $conf['imageLinkWrap.']);
         }
         $wrap = isset($conf['wrap.']) ? $this->stdWrap($conf['wrap'], $conf['wrap.']) : $conf['wrap'];
-        if ($wrap) {
+        if ((string)$wrap !== '') {
             $theValue = $this->wrap($theValue, $conf['wrap']);
         }
         return $theValue;
     }
 
     /**
-     * Returns the 'border' attribute for an <img> tag only if the doctype is not xhtml_strict, xhtml_11, xhtml_2 or html5
+     * Returns the 'border' attribute for an <img> tag only if the doctype is not xhtml_strict, xhtml_11 or html5
      * or if the config parameter 'disableImgBorderAttr' is not set.
      *
      * @param string $borderAttr The border attribute
@@ -1622,7 +1232,12 @@ class ContentObjectRenderer
     public function getBorderAttr($borderAttr)
     {
         $tsfe = $this->getTypoScriptFrontendController();
-        if (!GeneralUtility::inList('xhtml_strict,xhtml_11,xhtml_2', $tsfe->xhtmlDoctype) && $tsfe->config['config']['doctype'] != 'html5' && !$tsfe->config['config']['disableImgBorderAttr']) {
+        $docType = $tsfe->xhtmlDoctype;
+        if (
+            $docType !== 'xhtml_strict' && $docType !== 'xhtml_11'
+            && $tsfe->config['config']['doctype'] !== 'html5'
+            && !$tsfe->config['config']['disableImgBorderAttr']
+        ) {
             return $borderAttr;
         }
         return '';
@@ -1663,7 +1278,7 @@ class ContentObjectRenderer
             // find active sourceCollection
             $activeSourceCollections = array();
             foreach ($conf['sourceCollection.'] as $sourceCollectionKey => $sourceCollectionConfiguration) {
-                if (substr($sourceCollectionKey, -1) == '.') {
+                if (substr($sourceCollectionKey, -1) === '.') {
                     if (empty($sourceCollectionConfiguration['if.']) || $this->checkIf($sourceCollectionConfiguration['if.'])) {
                         $activeSourceCollections[] = $sourceCollectionConfiguration;
                     }
@@ -1707,12 +1322,12 @@ class ContentObjectRenderer
                     if ($dimension) {
                         if (strstr($dimension, 'c') !== false && ($dimensionKey === 'width' || $dimensionKey === 'height')) {
                             $dimensionParts = explode('c', $dimension, 2);
-                            $dimension = (int)($dimensionParts[0] * $pixelDensity) . 'c';
+                            $dimension = ((int)$dimensionParts[0] * $pixelDensity) . 'c';
                             if ($dimensionParts[1]) {
                                 $dimension .= $dimensionParts[1];
                             }
                         } else {
-                            $dimension = (int)($dimension * $pixelDensity);
+                            $dimension = (int)$dimension * $pixelDensity;
                         }
                         $sourceRenderConfiguration['file.'][$dimensionKey] = $dimension;
                         // Remove the stdWrap properties for dimension as they have been processed already above.
@@ -1728,7 +1343,7 @@ class ContentObjectRenderer
                         $urlPrefix = $tsfe->absRefPrefix;
                     }
                     $sourceConfiguration['src'] = htmlspecialchars($urlPrefix . $sourceInfo[3]);
-                    $sourceConfiguration['selfClosingTagSlash'] = (!empty($tsfe->xhtmlDoctype) ? ' /' : '');
+                    $sourceConfiguration['selfClosingTagSlash'] = !empty($tsfe->xhtmlDoctype) ? ' /' : '';
 
                     $oneSourceCollection = $this->substituteMarkerArray($sourceLayout, $sourceConfiguration, '###|###', true, true);
 
@@ -1763,11 +1378,12 @@ class ContentObjectRenderer
      */
     public function imageLinkWrap($string, $imageFile, $conf)
     {
+        $string = (string)$string;
         $enable = isset($conf['enable.']) ? $this->stdWrap($conf['enable'], $conf['enable.']) : $conf['enable'];
         if (!$enable) {
             return $string;
         }
-        $content = $this->typoLink($string, $conf['typolink.']);
+        $content = (string)$this->typoLink($string, $conf['typolink.']);
         if (isset($conf['file.'])) {
             $imageFile = $this->stdWrap($imageFile, $conf['file.']);
         }
@@ -1785,7 +1401,7 @@ class ContentObjectRenderer
         }
 
         // Create imageFileLink if not created with typolink
-        if ($content == $string) {
+        if ($content === $string) {
             $parameterNames = array('width', 'height', 'effects', 'bodyTag', 'title', 'wrap');
             $parameters = array();
             $sample = isset($conf['sample.']) ? $this->stdWrap($conf['sample'], $conf['sample.']) : $conf['sample'];
@@ -1820,15 +1436,15 @@ class ContentObjectRenderer
                 }
             }
             // Create TARGET-attribute only if the right doctype is used
-            if (!GeneralUtility::inList('xhtml_strict,xhtml_11,xhtml_2', $this->getTypoScriptFrontendController()->xhtmlDoctype)) {
-                $target = isset($conf['target.']) ? $this->stdWrap($conf['target'], $conf['target.']) : $conf['target'];
-                if ($target) {
-                    $target = sprintf(' target="%s"', $target);
-                } else {
-                    $target = ' target="thePicture"';
+            $target = '';
+            $xhtmlDocType = $this->getTypoScriptFrontendController()->xhtmlDoctype;
+            if ($xhtmlDocType !== 'xhtml_strict' && $xhtmlDocType !== 'xhtml_11') {
+                $target = isset($conf['target.'])
+                    ? (string)$this->stdWrap($conf['target'], $conf['target.'])
+                    : (string)$conf['target'];
+                if ($target === '') {
+                    $target = 'thePicture';
                 }
-            } else {
-                $target = '';
             }
             $a1 = '';
             $a2 = '';
@@ -1851,7 +1467,10 @@ class ContentObjectRenderer
                     . GeneralUtility::quoteJSvalue('width=' . ($processedFile->getProperty('width') + $offset[0])
                         . ',height=' . ($processedFile->getProperty('height') + $offset[1]) . ',status=0,menubar=0')
                     . '); return false;';
-                $a1 = '<a href="' . htmlspecialchars($url) . '" onclick="' . htmlspecialchars($onClick) . '"' . $target . $this->getTypoScriptFrontendController()->ATagParams . '>';
+                $a1 = '<a href="' . htmlspecialchars($url) . '"'
+                    . ' onclick="' . htmlspecialchars($onClick) . '"'
+                    . ($target !== '' ? ' target="' . $target . '"' : '')
+                    . $this->getTypoScriptFrontendController()->ATagParams . '>';
                 $a2 = '</a>';
                 $this->getTypoScriptFrontendController()->setJS('openPic');
             } else {
@@ -1879,11 +1498,12 @@ class ContentObjectRenderer
         $tsfe = $this->getTypoScriptFrontendController();
         $incFile = $tsfe->tmpl->getFileName($fName);
         if ($incFile && file_exists($incFile)) {
-            $fileinfo = GeneralUtility::split_fileref($incFile);
-            if (GeneralUtility::inList('jpg,gif,jpeg,png', $fileinfo['fileext'])) {
+            $fileInfo = GeneralUtility::split_fileref($incFile);
+            $extension = $fileInfo['fileext'];
+            if ($extension === 'jpg' || $extension === 'jpeg' || $extension === 'gif' || $extension === 'png') {
                 $imgFile = $incFile;
                 $imgInfo = @getImageSize($imgFile);
-                return '<img src="' . $tsfe->absRefPrefix . $imgFile . '" width="' . $imgInfo[0] . '" height="' . $imgInfo[1] . '"' . $this->getBorderAttr(' border="0"') . ' ' . $addParams . ' />';
+                return '<img src="' . $tsfe->absRefPrefix . $imgFile . '" width="' . (int)$imgInfo[0] . '" height="' . (int)$imgInfo[1] . '"' . $this->getBorderAttr(' border="0"') . ' ' . $addParams . ' />';
             } elseif (filesize($incFile) < 1024 * 1024) {
                 return $tsfe->tmpl->fileContent($incFile);
             }
@@ -1947,41 +1567,26 @@ class ContentObjectRenderer
         } else {
             $longDescUrl = trim($conf['longdescURL']);
         }
+        $longDescUrl = strip_tags($longDescUrl);
+
         // "alt":
         $altParam = ' alt="' . htmlspecialchars($altText) . '"';
         // "title":
         $emptyTitleHandling = isset($conf['emptyTitleHandling.']) ? $this->stdWrap($conf['emptyTitleHandling'], $conf['emptyTitleHandling.']) : $conf['emptyTitleHandling'];
         // Choices: 'keepEmpty' | 'useAlt' | 'removeAttr'
-        if ($titleText || $emptyTitleHandling == 'keepEmpty') {
+        if ($titleText || $emptyTitleHandling === 'keepEmpty') {
             $altParam .= ' title="' . htmlspecialchars($titleText) . '"';
-        } elseif (!$titleText && $emptyTitleHandling == 'useAlt') {
+        } elseif (!$titleText && $emptyTitleHandling === 'useAlt') {
             $altParam .= ' title="' . htmlspecialchars($altText) . '"';
         }
         // "longDesc" URL
-        if ($longDesc) {
-            $altParam .= ' longdesc="' . htmlspecialchars(strip_tags($longDescUrl)) . '"';
+        if ($longDesc && !empty($longDescUrl)) {
+            $altParam .= ' longdesc="' . htmlspecialchars($longDescUrl) . '"';
         }
         return $altParam;
     }
 
     /**
-     * Removes forbidden characters and spaces from name/id attributes in the form tag and formfields
-     *
-     * @param string $name Input string
-     * @return string the cleaned string
-     * @see FORM()
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8, the method is moved to FormContentObject
-     */
-    public function cleanFormName($name)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        // Turn data[x][y] into data:x:y:
-        $name = preg_replace('/\\[|\\]\\[?/', ':', trim($name));
-        // Remove illegal chars like _
-        return preg_replace('#[^:a-zA-Z0-9]#', '', $name);
-    }
-
-    /**
      * An abstraction method to add parameters to an A tag.
      * Uses the ATagParams property.
      *
@@ -2125,7 +1730,7 @@ class ContentObjectRenderer
      * but only the splitting of the template in various parts. So if you
      * want only one cache-entry per template, make sure you always pass the
      * exact same set of marker/subpart keys. Else you will be flooding the
-     * users cache table.
+     * user's cache table.
      *
      * This function takes three kinds of substitutions in one:
      * $markContentArray is a regular marker-array where the 'keys' are
@@ -2165,16 +1770,13 @@ class ContentObjectRenderer
         // Finding keys and check hash:
         $sPkeys = array_keys($subpartContentArray);
         $wPkeys = array_keys($wrappedSubpartContentArray);
-        $aKeys = array_merge(array_keys($markContentArray), $sPkeys, $wPkeys);
-        if (empty($aKeys)) {
+        $keysToReplace = array_merge(array_keys($markContentArray), $sPkeys, $wPkeys);
+        if (empty($keysToReplace)) {
             $timeTracker->pull();
             return $content;
         }
-        asort($aKeys);
-        $storeKey = md5('substituteMarkerArrayCached_storeKey:' . serialize(array(
-            $content,
-            $aKeys
-        )));
+        asort($keysToReplace);
+        $storeKey = md5('substituteMarkerArrayCached_storeKey:' . serialize(array($content, $keysToReplace)));
         if ($this->substMarkerCache[$storeKey]) {
             $storeArr = $this->substMarkerCache[$storeKey];
             $timeTracker->setTSlogMessage('Cached', 0);
@@ -2186,8 +1788,6 @@ class ContentObjectRenderer
                 $this->substMarkerCache[$storeKey] = $storeArr;
                 $timeTracker->setTSlogMessage('Cached from DB', 0);
             } else {
-                // Initialize storeArr
-                $storeArr = array();
                 // Finding subparts and substituting them with the subpart as a marker
                 foreach ($sPkeys as $sPK) {
                     $content = $this->substituteSubpart($content, $sPK, $sPK);
@@ -2199,38 +1799,57 @@ class ContentObjectRenderer
                         $wPK
                     ));
                 }
-                // Traverse keys and quote them for reg ex.
-                foreach ($aKeys as $tK => $tV) {
-                    $aKeys[$tK] = preg_quote($tV, '/');
+
+                $storeArr = array();
+                // search all markers in the content
+                $result = preg_match_all('/###([^#](?:[^#]*+|#{1,2}[^#])+)###/', $content, $markersInContent);
+                if ($result !== false && !empty($markersInContent[1])) {
+                    $keysToReplaceFlipped = array_flip($keysToReplace);
+                    $regexKeys = array();
+                    $wrappedKeys = array();
+                    // Traverse keys and quote them for reg ex.
+                    foreach ($markersInContent[1] as $key) {
+                        if (isset($keysToReplaceFlipped['###' . $key . '###'])) {
+                            $regexKeys[] = preg_quote($key, '/');
+                            $wrappedKeys[] = '###' . $key . '###';
+                        }
+                    }
+                    $regex = '/###(?:' . implode('|', $regexKeys) . ')###/';
+                    $storeArr['c'] = preg_split($regex, $content); // contains all content parts around markers
+                    $storeArr['k'] = $wrappedKeys; // contains all markers incl. ###
+                    // Setting cache:
+                    $this->substMarkerCache[$storeKey] = $storeArr;
+                    // Storing the cached data:
+                    $this->getTypoScriptFrontendController()->sys_page->storeHash($storeKey, $storeArr, 'substMarkArrayCached');
                 }
-                $regex = '/' . implode('|', $aKeys) . '/';
-                // Doing regex's
-                $storeArr['c'] = preg_split($regex, $content);
-                preg_match_all($regex, $content, $keyList);
-                $storeArr['k'] = $keyList[0];
-                // Setting cache:
-                $this->substMarkerCache[$storeKey] = $storeArr;
-                // Storing the cached data:
-                $this->getTypoScriptFrontendController()->sys_page->storeHash($storeKey, $storeArr, 'substMarkArrayCached');
                 $timeTracker->setTSlogMessage('Parsing', 0);
             }
         }
-        // Substitution/Merging:
-        // Merging content types together, resetting
-        $valueArr = array_merge($markContentArray, $subpartContentArray, $wrappedSubpartContentArray);
-        $wSCA_reg = array();
-        $content = '';
-        // Traversing the keyList array and merging the static and dynamic content
-        foreach ($storeArr['k'] as $n => $keyN) {
-            $content .= $storeArr['c'][$n];
-            if (!is_array($valueArr[$keyN])) {
-                $content .= $valueArr[$keyN];
-            } else {
-                $content .= $valueArr[$keyN][(int)$wSCA_reg[$keyN] % 2];
-                $wSCA_reg[$keyN]++;
+        if (!empty($storeArr['k']) && is_array($storeArr['k'])) {
+            // Substitution/Merging:
+            // Merging content types together, resetting
+            $valueArr = array_merge($markContentArray, $subpartContentArray, $wrappedSubpartContentArray);
+            $wSCA_reg = array();
+            $content = '';
+            // Traversing the keyList array and merging the static and dynamic content
+            foreach ($storeArr['k'] as $n => $keyN) {
+                // add content before marker
+                $content .= $storeArr['c'][$n];
+                if (!is_array($valueArr[$keyN])) {
+                    // fetch marker replacement from $markContentArray or $subpartContentArray
+                    $content .= $valueArr[$keyN];
+                } else {
+                    if (!isset($wSCA_reg[$keyN])) {
+                        $wSCA_reg[$keyN] = 0;
+                    }
+                    // fetch marker replacement from $wrappedSubpartContentArray
+                    $content .= $valueArr[$keyN][$wSCA_reg[$keyN] % 2];
+                    $wSCA_reg[$keyN]++;
+                }
             }
+            // add remaining content
+            $content .= $storeArr['c'][count($storeArr['k'])];
         }
-        $content .= $storeArr['c'][count($storeArr['k'])];
         $timeTracker->pull();
         return $content;
     }
@@ -2367,6 +1986,7 @@ class ContentObjectRenderer
      */
     public function stdWrap($content = '', $conf = array())
     {
+        $content = (string)$content;
         // If there is any hook object, activate all of the process and override functions.
         // The hook interface ContentObjectStdWrapHookInterface takes care that all 4 methods exist.
         if ($this->stdWrapHookObjects) {
@@ -2435,7 +2055,7 @@ class ContentObjectRenderer
                     // Call the function with the prefix stdWrap_ to make sure nobody can execute functions just by adding their name to the TS Array
                     $functionName = 'stdWrap_' . $functionName;
                     $content = $this->{$functionName}($content, $singleConf);
-                } elseif ($functionType == 'boolean' && !$conf[$functionName]) {
+                } elseif ($functionType === 'boolean' && !$conf[$functionName]) {
                     $isExecuted[$functionName] = true;
                     $isExecuted[$functionProperties] = true;
                 }
@@ -2990,7 +2610,7 @@ class ContentObjectRenderer
     public function stdWrap_prioriCalc($content = '', $conf = array())
     {
         $content = MathUtility::calculateWithParentheses($content);
-        if ($conf['prioriCalc'] == 'intval') {
+        if ($conf['prioriCalc'] === 'intval') {
             $content = (int)$content;
         }
         return $content;
@@ -3089,7 +2709,7 @@ class ContentObjectRenderer
     public function stdWrap_date($content = '', $conf = array())
     {
         // Check for zero length string to mimic default case of date/gmdate.
-        $content = $content == '' ? $GLOBALS['EXEC_TIME'] : (int)$content;
+        $content = (string)$content === '' ? $GLOBALS['EXEC_TIME'] : (int)$content;
         $content = $conf['date.']['GMT'] ? gmdate($conf['date'], $content) : date($conf['date'], $content);
         return $content;
     }
@@ -3106,12 +2726,10 @@ class ContentObjectRenderer
     public function stdWrap_strftime($content = '', $conf = array())
     {
         // Check for zero length string to mimic default case of strtime/gmstrftime
-        $content = $content == '' ? $GLOBALS['EXEC_TIME'] : (int)$content;
+        $content = (string)$content === '' ? $GLOBALS['EXEC_TIME'] : (int)$content;
         $content = $conf['strftime.']['GMT'] ? gmstrftime($conf['strftime'], $content) : strftime($conf['strftime'], $content);
-        $tsfe = $this->getTypoScriptFrontendController();
-        $tmp_charset = $conf['strftime.']['charset'] ? $conf['strftime.']['charset'] : $tsfe->localeCharset;
-        if ($tmp_charset) {
-            $content = $tsfe->csConv($content, $tmp_charset);
+        if (!empty($conf['strftime.']['charset'])) {
+            $content = $this->getTypoScriptFrontendController()->csConv($content, $conf['strftime.']['charset']);
         }
         return $content;
     }
@@ -3142,7 +2760,7 @@ class ContentObjectRenderer
      */
     public function stdWrap_age($content = '', $conf = array())
     {
-        return $this->calcAge($GLOBALS['EXEC_TIME'] - $content, $conf['age']);
+        return $this->calcAge((int)$GLOBALS['EXEC_TIME'] - (int)$content, $conf['age']);
     }
 
     /**
@@ -3190,7 +2808,6 @@ class ContentObjectRenderer
      * Removes HTML tags based on stdWrap properties
      *
      * @param string $content Input value undergoing processing in this function.
-     * @param array $conf stdWrap properties for removeBadHTML.
      * @return string The processed input value
      */
     public function stdWrap_removeBadHTML($content = '')
@@ -3407,34 +3024,6 @@ class ContentObjectRenderer
     }
 
     /**
-     * textStyle
-     * Wraps content in font tags
-     * See wrap
-     *
-     * @param string $content Input value undergoing processing in this function.
-     * @param array $conf stdWrap properties for textStyle.
-     * @return string The processed input value
-     */
-    public function stdWrap_textStyle($content = '', $conf = array())
-    {
-        return $this->textStyle($content, $conf['textStyle.']);
-    }
-
-    /**
-     * tableStyle
-     * Wraps content with table tags
-     * See wrap
-     *
-     * @param string $content Input value undergoing processing in this function.
-     * @param array $conf stdWrap properties for tableStyle.
-     * @return string The processed input value
-     */
-    public function stdWrap_tableStyle($content = '', $conf = array())
-    {
-        return $this->tableStyle($content, $conf['tableStyle.']);
-    }
-
-    /**
      * filelink
      * Used to make lists of links to files
      * See wrap
@@ -3719,35 +3308,6 @@ class ContentObjectRenderer
     }
 
     /**
-     * offsetWrap
-     * Creates a so called offset table around the content
-     * Still here for historical reasons even not used too much nowadays
-     *
-     * @param string $content Input value undergoing processing in this function.
-     * @param array $conf stdWrap properties for offsetWrap.
-     * @return string The processed input value
-     */
-    public function stdWrap_offsetWrap($content = '', $conf = array())
-    {
-        $controlTable = GeneralUtility::makeInstance(OffsetTableContentObject::class);
-        if ($conf['offsetWrap.']['tableParams'] || $conf['offsetWrap.']['tableParams.']) {
-            $controlTable->tableParams = isset($conf['offsetWrap.']['tableParams.'])
-                ? $this->stdWrap($conf['offsetWrap.']['tableParams'], $conf['offsetWrap.']['tableParams.'])
-                : $conf['offsetWrap.']['tableParams'];
-        }
-        if ($conf['offsetWrap.']['tdParams'] || $conf['offsetWrap.']['tdParams.']) {
-            $controlTable->tdParams = ' ' . (isset($conf['offsetWrap.']['tdParams.'])
-                ? $this->stdWrap($conf['offsetWrap.']['tdParams'], $conf['offsetWrap.']['tdParams.'])
-                : $conf['offsetWrap.']['tdParams']);
-        }
-        $content = $controlTable->start($content, $conf['offsetWrap']);
-        if ($conf['offsetWrap.']['stdWrap.']) {
-            $content = $this->stdWrap($content, $conf['offsetWrap.']['stdWrap.']);
-        }
-        return $content;
-    }
-
-    /**
      * postUserFunc
      * Will execute a user function after the content has been modified by any other stdWrap function
      *
@@ -3909,7 +3469,7 @@ class ContentObjectRenderer
      */
     public function stdWrap_debugFunc($content = '', $conf = array())
     {
-        debug($conf['debugFunc'] == 2 ? array($content) : $content);
+        debug((int)$conf['debugFunc'] === 2 ? array($content) : $content);
         return $content;
     }
 
@@ -4064,7 +3624,7 @@ class ContentObjectRenderer
     public function filelist($data)
     {
         $data = trim($data);
-        if (!$data) {
+        if ($data === '') {
             return '';
         }
         $data_arr = explode('|', $data);
@@ -4094,7 +3654,7 @@ class ContentObjectRenderer
                 if ($entry != '.' && $entry != '..') {
                     // Because of odd PHP-error where <br />-tag is sometimes placed after a filename!!
                     $wholePath = $path . '/' . $entry;
-                    if (file_exists($wholePath) && filetype($wholePath) == 'file') {
+                    if (file_exists($wholePath) && filetype($wholePath) === 'file') {
                         $info = GeneralUtility::split_fileref($wholePath);
                         if (!$ext_list || GeneralUtility::inList($ext_list, $info['fileext'])) {
                             $items['files'][] = $info['file'];
@@ -4329,12 +3889,19 @@ class ContentObjectRenderer
         $replacementForEllipsis = trim($options[1]);
         $crop2space = trim($options[2]) === '1';
         // Split $content into an array(even items in the array are outside the tags, odd numbers are tag-blocks).
-        $tags = 'a|b|blockquote|body|div|em|font|form|h1|h2|h3|h4|h5|h6|i|li|map|ol|option|p|pre|sub|sup|select|span|strong|table|thead|tbody|tfoot|td|textarea|tr|u|ul|br|hr|img|input|area|link';
-        // @todo We should not crop inside <script> tags.
+        $tags = 'a|abbr|address|area|article|aside|audio|b|bdi|bdo|blockquote|body|br|button|caption|cite|code|col|colgroup|data|datalist|dd|del|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|h1|h2|h3|h4|h5|h6|header|hr|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|main|map|mark|meter|nav|object|ol|optgroup|option|output|p|param|pre|progress|q|rb|rp|rt|rtc|ruby|s|samp|section|select|small|source|span|strong|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|tr|track|u|ul|ut|var|video|wbr';
         $tagsRegEx = '
                        (
                                (?:
                                        <!--.*?-->                                      # a comment
+                                       |
+                                       <canvas[^>]*>.*?</canvas>   # a canvas tag
+                                       |
+                                       <script[^>]*>.*?</script>   # a script tag
+                                       |
+                                       <noscript[^>]*>.*?</noscript> # a noscript tag
+                                       |
+                                       <template[^>]*>.*?</template> # a template tag
                                )
                                |
                                </?(?:' . $tags . ')+                   # opening tag (\'<tag\') or closing tag (\'</tag\')
@@ -4376,7 +3943,7 @@ class ContentObjectRenderer
         $countSplittedContent = count($splittedContent);
         for ($offset = 0; $offset < $countSplittedContent; $offset++) {
             if ($offset % 2 === 0) {
-                $tempContent = $tsfe->csConvObj->utf8_encode($splittedContent[$offset], $tsfe->renderCharset);
+                $tempContent = $tsfe->csConvObj->conv($splittedContent[$offset], $tsfe->renderCharset, 'utf-8');
                 $thisStrLen = $tsfe->csConvObj->strlen('utf-8', html_entity_decode($tempContent, ENT_COMPAT, 'UTF-8'));
                 if ($strLen + $thisStrLen > $absChars) {
                     $croppedOffset = $offset;
@@ -4399,7 +3966,7 @@ class ContentObjectRenderer
                             }
                         }
                     }
-                    $splittedContent[$offset] = $tsfe->csConvObj->utf8_decode($tempContent, $tsfe->renderCharset);
+                    $splittedContent[$offset] = $tsfe->csConvObj->conv($tempContent, 'utf-8', $tsfe->renderCharset);
                     break;
                 } else {
                     $strLen += $thisStrLen;
@@ -4488,134 +4055,6 @@ class ContentObjectRenderer
     }
 
     /**
-     * Implements the stdWrap property "textStyle"; This generates a <font>-tag (and a <div>-tag for align-attributes) which is wrapped around the input value.
-     *
-     * @param string $theValue The input value
-     * @param array $conf TypoScript properties for the "TypoScript function" '->textStyle'
-     * @return string The processed output value
-     * @access private
-     * @see stdWrap()
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public function textStyle($theValue, $conf)
-    {
-        $this->getTypoScriptFrontendController()->logDeprecatedTyposcript('textStyle', 'Deprecated since 7.1 and will be removed with CMS 8. Use CSS instead');
-        $conf['face.'][1] = 'Times New Roman';
-        $conf['face.'][2] = 'Verdana,Arial,Helvetica,Sans serif';
-        $conf['face.'][3] = 'Arial,Helvetica,Sans serif';
-        $conf['size.'][1] = 1;
-        $conf['size.'][2] = 2;
-        $conf['size.'][3] = 3;
-        $conf['size.'][4] = 4;
-        $conf['size.'][5] = 5;
-        $conf['size.'][10] = '+1';
-        $conf['size.'][11] = '-1';
-        $conf['color.'][240] = 'black';
-        $conf['color.'][241] = 'white';
-        $conf['color.'][242] = '#333333';
-        $conf['color.'][243] = 'gray';
-        $conf['color.'][244] = 'silver';
-        $conf['color.'][245] = 'red';
-        $conf['color.'][246] = 'navy';
-        $conf['color.'][247] = 'yellow';
-        $conf['color.'][248] = 'green';
-        $conf['color.'][249] = 'olive';
-        $conf['color.'][250] = 'maroon';
-        $face = $this->data[$conf['face.']['field']];
-        $size = $this->data[$conf['size.']['field']];
-        $color = $this->data[$conf['color.']['field']];
-        $align = $this->data[$conf['align.']['field']];
-        $properties = $this->data[$conf['properties.']['field']];
-        if (!$properties) {
-            $properties = isset($conf['properties.']['default.']) ? $this->stdWrap($conf['properties.']['default'], $conf['properties.']['default.']) : $conf['properties.']['default'];
-        }
-        // Properties
-        if ($properties & 8) {
-            $theValue = $this->HTMLcaseshift($theValue, 'upper');
-        }
-        if ($properties & 1) {
-            $theValue = '<strong>' . $theValue . '</strong>';
-        }
-        if ($properties & 2) {
-            $theValue = '<i>' . $theValue . '</i>';
-        }
-        if ($properties & 4) {
-            $theValue = '<u>' . $theValue . '</u>';
-        }
-        // Fonttag
-        $theFace = $conf['face.'][$face];
-        if (!$theFace) {
-            $theFace = isset($conf['face.']['default.']) ? $this->stdWrap($conf['face.']['default'], $conf['face.']['default.']) : $conf['face.']['default'];
-        }
-        $theSize = $conf['size.'][$size];
-        if (!$theSize) {
-            $theSize = isset($conf['size.']['default.']) ? $this->stdWrap($conf['size.']['default'], $conf['size.']['default.']) : $conf['size.']['default'];
-        }
-        $theColor = $conf['color.'][$color];
-        if (!$theColor) {
-            $theColor = isset($conf['color.']['default.']) ? $this->stdWrap($conf['color.']['default'], $conf['color.']['default.']) : $conf['color.']['default.'];
-        }
-        if ($conf['altWrap']) {
-            $theValue = $this->wrap($theValue, $conf['altWrap']);
-        } elseif ($theFace || $theSize || $theColor) {
-            $fontWrap = '<font' . ($theFace ? ' face="' . $theFace . '"' : '') . ($theSize ? ' size="' . $theSize . '"' : '') . ($theColor ? ' color="' . $theColor . '"' : '') . '>|</font>';
-            $theValue = $this->wrap($theValue, $fontWrap);
-        }
-        // Align
-        if ($align) {
-            $theValue = $this->wrap($theValue, '<div style="text-align:' . $align . ';">|</div>');
-        }
-        // Return
-        return $theValue;
-    }
-
-    /**
-     * Implements the stdWrap property "tableStyle"; Basically this generates a <table>-tag with properties which is wrapped around the input value.
-     *
-     * @param string $theValue The input value
-     * @param array $conf TypoScript properties for the "TypoScript function" '->textStyle'
-     * @return string The processed output value
-     * @access private
-     * @see stdWrap()
-     * @deprecated since TYPO3 CMS 7, will be removed in TYPO3 CMS 8
-     */
-    public function tableStyle($theValue, $conf)
-    {
-        $this->getTypoScriptFrontendController()->logDeprecatedTyposcript('tableStyle', 'Deprecated since 7.1 and will be removed with CMS 8. Use CSS instead');
-        $conf['color.'][240] = 'black';
-        $conf['color.'][241] = 'white';
-        $conf['color.'][242] = '#333333';
-        $conf['color.'][243] = 'gray';
-        $conf['color.'][244] = 'silver';
-        $align = isset($conf['align.']) ? $this->stdWrap($conf['align'], $conf['align.']) : $conf['align'];
-        $border = isset($conf['border.']) ? (int)$this->stdWrap($conf['border'], $conf['border.']) : (int)$conf['border'];
-        $cellspacing = isset($conf['cellspacing.']) ? (int)$this->stdWrap($conf['cellspacing'], $conf['cellspacing.']) : (int)$conf['cellspacing'];
-        $cellpadding = isset($conf['cellpadding.']) ? (int)$this->stdWrap($conf['cellpadding'], $conf['cellpadding.']) : (int)$conf['cellpadding'];
-        $color = $this->data[$conf['color.']['field']];
-        $theColor = $conf['color.'][$color] ? $conf['color.'][$color] : $conf['color.']['default'];
-        // Assembling the table tag
-        $tableTagArray = array(
-            '<table'
-        );
-        $tableTagArray[] = 'border="' . $border . '"';
-        $tableTagArray[] = 'cellspacing="' . $cellspacing . '"';
-        $tableTagArray[] = 'cellpadding="' . $cellpadding . '"';
-        if ($align) {
-            $tableTagArray[] = 'align="' . $align . '"';
-        }
-        if ($theColor) {
-            $tableTagArray[] = 'bgcolor="' . $theColor . '"';
-        }
-        if ($conf['params']) {
-            $tableTagArray[] = $conf['params'];
-        }
-        $tableWrap = implode(' ', $tableTagArray) . '> | </table>';
-        $theValue = $this->wrap($theValue, $tableWrap);
-        // return
-        return $theValue;
-    }
-
-    /**
      * Implements the TypoScript function "addParams"
      *
      * @param string $content The string with the HTML tag.
@@ -4702,26 +4141,24 @@ class ContentObjectRenderer
             $typoLinkConf = $additionalTypoLinkConfiguration;
         }
 
-        if (isset($conf['jumpurl']) || isset($conf['jumpurl.'])) {
-            GeneralUtility::deprecationLog('The TypoScript jumpurl configuration is deprecated for file links since TYPO3 CMS 7 and will be removed in TYPO3 CMS 8. Pass this configuration in the typolinkConfiguration property instead.');
-            if (isset($conf['jumpurl'])) {
-                $typoLinkConf['jumpurl'] = $conf['jumpurl'];
-            }
-            if (isset($conf['jumpurl.'])) {
-                $typoLinkConf['jumpurl.'] = $conf['jumpurl.'];
-            }
-        }
-
         $theLinkWrap = $this->typoLink('|', $typoLinkConf);
         $theSize = filesize($theFile);
         $fI = GeneralUtility::split_fileref($theFile);
         $icon = '';
         if ($conf['icon']) {
-            $conf['icon.']['path'] = isset($conf['icon.']['path.']) ? $this->stdWrap($conf['icon.']['path'], $conf['icon.']['path.']) : $conf['icon.']['path'];
-            $iconP = !empty($conf['icon.']['path']) ? $conf['icon.']['path'] : ExtensionManagementUtility::siteRelPath('frontend') . 'Resources/Public/Icons/FileIcons/';
-            $conf['icon.']['ext'] = isset($conf['icon.']['ext.']) ? $this->stdWrap($conf['icon.']['ext'], $conf['icon.']['ext.']) : $conf['icon.']['ext'];
+            $conf['icon.']['path'] = isset($conf['icon.']['path.'])
+                ? $this->stdWrap($conf['icon.']['path'], $conf['icon.']['path.'])
+                : $conf['icon.']['path'];
+            $iconP = !empty($conf['icon.']['path'])
+                ? $conf['icon.']['path']
+                : ExtensionManagementUtility::siteRelPath('frontend') . 'Resources/Public/Icons/FileIcons/';
+            $conf['icon.']['ext'] = isset($conf['icon.']['ext.'])
+                ? $this->stdWrap($conf['icon.']['ext'], $conf['icon.']['ext.'])
+                : $conf['icon.']['ext'];
             $iconExt = !empty($conf['icon.']['ext']) ? '.' . $conf['icon.']['ext'] : '.gif';
-            $icon = @is_file(($iconP . $fI['fileext'] . $iconExt)) ? $iconP . $fI['fileext'] . $iconExt : $iconP . 'default' . $iconExt;
+            $icon = @is_file(($iconP . $fI['fileext'] . $iconExt))
+                ? $iconP . $fI['fileext'] . $iconExt
+                : $iconP . 'default' . $iconExt;
             // Checking for images: If image, then return link to thumbnail.
             $IEList = isset($conf['icon_image_ext_list.']) ? $this->stdWrap($conf['icon_image_ext_list'], $conf['icon_image_ext_list.']) : $conf['icon_image_ext_list'];
             $image_ext_list = str_replace(' ', '', strtolower($IEList));
@@ -4729,7 +4166,7 @@ class ContentObjectRenderer
                 if ($conf['iconCObject']) {
                     $icon = $this->cObjGetSingle($conf['iconCObject'], $conf['iconCObject.'], 'iconCObject');
                 } else {
-                    $notFoundThumb = TYPO3_mainDir . 'sysext/core/Resources/Public/Images/NotFound.gif';
+                    $notFoundThumb = ExtensionManagementUtility::siteRelPath('core') . 'Resources/Public/Images/NotFound.gif';
                     $sizeParts = array(64, 64);
                     if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['thumbnails']) {
                         // using the File Abstraction Layer to generate a preview image
@@ -4742,7 +4179,7 @@ class ContentObjectRenderer
                                 $fileExtension = $fileObject->getExtension();
                                 if ($fileExtension === 'ttf' || GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'], $fileExtension)) {
                                     if ($conf['icon_thumbSize'] || $conf['icon_thumbSize.']) {
-                                        $thumbSize = (isset($conf['icon_thumbSize.']) ? $this->stdWrap($conf['icon_thumbSize'], $conf['icon_thumbSize.']) : $conf['icon_thumbSize']);
+                                        $thumbSize = isset($conf['icon_thumbSize.']) ? $this->stdWrap($conf['icon_thumbSize'], $conf['icon_thumbSize.']) : $conf['icon_thumbSize'];
                                         $sizeParts = explode('x', $thumbSize);
                                     }
                                     $icon = $fileObject->process(ProcessedFile::CONTEXT_IMAGEPREVIEW, array(
@@ -4762,15 +4199,20 @@ class ContentObjectRenderer
                         $urlPrefix = $tsfe->absRefPrefix;
                     }
                     $icon = '<img src="' . htmlspecialchars($urlPrefix . $icon) . '"' .
-                            'width="' . $sizeParts[0] . '" height="' . $sizeParts[1] . '" ' .
+                            ' width="' . (int)$sizeParts[0] . '" height="' . (int)$sizeParts[1] . '" ' .
                             $this->getBorderAttr(' border="0"') . '' . $this->getAltParam($conf) . ' />';
                 }
             } else {
-                $conf['icon.']['widthAttribute'] = isset($conf['icon.']['widthAttribute.']) ? $this->stdWrap($conf['icon.']['widthAttribute'], $conf['icon.']['widthAttribute.']) : $conf['icon.']['widthAttribute'];
+                $conf['icon.']['widthAttribute'] = isset($conf['icon.']['widthAttribute.'])
+                    ? $this->stdWrap($conf['icon.']['widthAttribute'], $conf['icon.']['widthAttribute.'])
+                    : $conf['icon.']['widthAttribute'];
                 $iconWidth = !empty($conf['icon.']['widthAttribute']) ? $conf['icon.']['widthAttribute'] : 18;
-                $conf['icon.']['heightAttribute'] = isset($conf['icon.']['heightAttribute.']) ? $this->stdWrap($conf['icon.']['heightAttribute'], $conf['icon.']['heightAttribute.']) : $conf['icon.']['heightAttribute'];
-                $iconHeight = !empty($conf['icon.']['heightAttribute']) ? $conf['icon.']['heightAttribute'] : 16;
-                $icon = '<img src="' . htmlspecialchars($tsfe->absRefPrefix . $icon) . '" width="' . $iconWidth . '" height="' . $iconHeight . '"' . $this->getBorderAttr(' border="0"') . $this->getAltParam($conf) . ' />';
+                $conf['icon.']['heightAttribute'] = isset($conf['icon.']['heightAttribute.'])
+                    ? $this->stdWrap($conf['icon.']['heightAttribute'], $conf['icon.']['heightAttribute.'])
+                    : $conf['icon.']['heightAttribute'];
+                $iconHeight = !empty($conf['icon.']['heightAttribute']) ? (int)$conf['icon.']['heightAttribute'] : 16;
+                $icon = '<img src="' . htmlspecialchars($tsfe->absRefPrefix . $icon) . '" width="' . (int)$iconWidth . '" height="' . (int)$iconHeight . '"'
+                    . $this->getBorderAttr(' border="0"') . $this->getAltParam($conf) . ' />';
             }
             if ($conf['icon_link'] && !$conf['combinedLink']) {
                 $icon = $this->wrap($icon, $theLinkWrap);
@@ -4835,18 +4277,18 @@ class ContentObjectRenderer
             } else {
                 $theVal = 0;
             }
-            if ($sign == '-') {
+            if ($sign === '-') {
                 $value -= $theVal;
             }
-            if ($sign == '+') {
+            if ($sign === '+') {
                 $value += $theVal;
             }
-            if ($sign == '/') {
+            if ($sign === '/') {
                 if ((int)$theVal) {
                     $value /= (int)$theVal;
                 }
             }
-            if ($sign == '*') {
+            if ($sign === '*') {
                 $value *= $theVal;
             }
         }
@@ -4902,26 +4344,22 @@ class ContentObjectRenderer
             return $returnCount ? count($valArr) : 0;
         }
 
-        // start further processing of the values
-        $conf['max'] = isset($conf['max.']) ? (int)$this->stdWrap($conf['max'], $conf['max.']) : (int)$conf['max'];
-        $conf['min'] = isset($conf['min.']) ? (int)$this->stdWrap($conf['min'], $conf['min.']) : (int)$conf['min'];
-
         // calculate splitCount
         $splitCount = count($valArr);
-        $max = isset($conf['max.']) ? $this->stdWrap($conf['max'], $conf['max.']) : $conf['max'];
+        $max = isset($conf['max.']) ? (int)$this->stdWrap($conf['max'], $conf['max.']) : (int)$conf['max'];
         if ($max && $splitCount > $max) {
             $splitCount = $max;
         }
-        $min = isset($conf['min.']) ? $this->stdWrap($conf['min'], $conf['min.']) : $conf['min'];
+        $min = isset($conf['min.']) ? (int)$this->stdWrap($conf['min'], $conf['min.']) : (int)$conf['min'];
         if ($min && $splitCount < $min) {
             $splitCount = $min;
         }
-        $wrap = isset($conf['wrap.']) ? $this->stdWrap($conf['wrap'], $conf['wrap.']) : $conf['wrap'];
-        $cObjNum = isset($conf['cObjNum.']) ? $this->stdWrap($conf['cObjNum'], $conf['cObjNum.']) : $conf['cObjNum'];
+        $wrap = isset($conf['wrap.']) ? (string)$this->stdWrap($conf['wrap'], $conf['wrap.']) : (string)$conf['wrap'];
+        $cObjNumSplitConf = isset($conf['cObjNum.']) ? (string)$this->stdWrap($conf['cObjNum'], $conf['cObjNum.']) : (string)$conf['cObjNum'];
         $splitArr = array();
-        if ($wrap || $cObjNum) {
+        if ($wrap !== '' || $cObjNumSplitConf !== '') {
             $splitArr['wrap'] = $wrap;
-            $splitArr['cObjNum'] = $cObjNum;
+            $splitArr['cObjNum'] = $cObjNumSplitConf;
             $splitArr = $GLOBALS['TSFE']->tmpl->splitConfArray($splitArr, $splitCount);
         }
         $content = '';
@@ -4931,7 +4369,9 @@ class ContentObjectRenderer
             $this->data[$this->currentValKey] = $value;
             if ($splitArr[$a]['cObjNum']) {
                 $objName = (int)$splitArr[$a]['cObjNum'];
-                $value = isset($conf[$objName . '.']) ? $this->stdWrap($this->cObjGet($conf[$objName . '.'], $objName . '.'), $conf[$objName . '.']) : $this->cObjGet($conf[$objName . '.'], $objName . '.');
+                $value = isset($conf[$objName . '.'])
+                    ? $this->stdWrap($this->cObjGet($conf[$objName . '.'], $objName . '.'), $conf[$objName . '.'])
+                    : $this->cObjGet($conf[$objName . '.'], $objName . '.');
             }
             $wrap = isset($splitArr[$a]['wrap.']) ? $this->stdWrap($splitArr[$a]['wrap'], $splitArr[$a]['wrap.']) : $splitArr[$a]['wrap'];
             if ($wrap) {
@@ -5070,7 +4510,7 @@ class ContentObjectRenderer
      */
     public function numberFormat($content, $conf)
     {
-        $decimals = isset($conf['decimals.']) ? $this->stdWrap($conf['decimals'], $conf['decimals.']) : $conf['decimals'];
+        $decimals = isset($conf['decimals.']) ? (int)$this->stdWrap($conf['decimals'], $conf['decimals.']) : (int)$conf['decimals'];
         $dec_point = isset($conf['dec_point.']) ? $this->stdWrap($conf['dec_point'], $conf['dec_point.']) : $conf['dec_point'];
         $thousands_sep = isset($conf['thousands_sep.']) ? $this->stdWrap($conf['thousands_sep'], $conf['thousands_sep.']) : $conf['thousands_sep'];
         return number_format(floatval($content), $decimals, $dec_point, $thousands_sep);
@@ -5155,17 +4595,21 @@ class ContentObjectRenderer
                                     $tag = $htmlParser->getFirstTag($vvv);
                                     $tagName = strtolower($htmlParser->getFirstTagName($vvv));
                                     $colParts[$kkk] = $htmlParser->removeFirstAndLastTag($vvv);
-                                    if ($cfg['HTMLtableCells.'][$cc . '.']['callRecursive'] || !isset($cfg['HTMLtableCells.'][($cc . '.')]['callRecursive']) && $cfg['HTMLtableCells.']['default.']['callRecursive']) {
+                                    if ($cfg['HTMLtableCells.'][$cc . '.']['callRecursive'] || !isset($cfg['HTMLtableCells.'][$cc . '.']['callRecursive']) && $cfg['HTMLtableCells.']['default.']['callRecursive']) {
                                         if ($cfg['HTMLtableCells.']['addChr10BetweenParagraphs']) {
                                             $colParts[$kkk] = str_replace('</p><p>', '</p>' . LF . '<p>', $colParts[$kkk]);
                                         }
                                         $colParts[$kkk] = $this->parseFunc($colParts[$kkk], $conf);
                                     }
-                                    $tagStdWrap = is_array($cfg['HTMLtableCells.'][$cc . '.']['tagStdWrap.']) ? $cfg['HTMLtableCells.'][$cc . '.']['tagStdWrap.'] : $cfg['HTMLtableCells.']['default.']['tagStdWrap.'];
+                                    $tagStdWrap = is_array($cfg['HTMLtableCells.'][$cc . '.']['tagStdWrap.'])
+                                        ? $cfg['HTMLtableCells.'][$cc . '.']['tagStdWrap.']
+                                        : $cfg['HTMLtableCells.']['default.']['tagStdWrap.'];
                                     if (is_array($tagStdWrap)) {
                                         $tag = $this->stdWrap($tag, $tagStdWrap);
                                     }
-                                    $stdWrap = is_array($cfg['HTMLtableCells.'][$cc . '.']['stdWrap.']) ? $cfg['HTMLtableCells.'][$cc . '.']['stdWrap.'] : $cfg['HTMLtableCells.']['default.']['stdWrap.'];
+                                    $stdWrap = is_array($cfg['HTMLtableCells.'][$cc . '.']['stdWrap.'])
+                                        ? $cfg['HTMLtableCells.'][$cc . '.']['stdWrap.']
+                                        : $cfg['HTMLtableCells.']['default.']['stdWrap.'];
                                     if (is_array($stdWrap)) {
                                         $colParts[$kkk] = $this->stdWrap($colParts[$kkk], $stdWrap);
                                     }
@@ -5328,25 +4772,25 @@ class ContentObjectRenderer
                     $tag['out'] = 1;
                 }
                 if ($conf['tags.'][$tag[0]]) {
-                    $treated = 0;
-                    $stripNL = 0;
+                    $treated = false;
+                    $stripNL = false;
                     // in-tag
                     if (!$currentTag && !$tag['out']) {
                         // $currentTag (array!) is the tag we are currently processing
                         $currentTag = $tag;
                         $contentAccumP++;
-                        $treated = 1;
+                        $treated = true;
                         // in-out-tag: img and other empty tags
                         if (preg_match('/^(area|base|br|col|hr|img|input|meta|param)$/i', $tag[0])) {
                             $tag['out'] = 1;
                         }
                     }
                     // out-tag
-                    if ($currentTag[0] == $tag[0] && $tag['out']) {
+                    if ($currentTag[0] === $tag[0] && $tag['out']) {
                         $theName = $conf['tags.'][$tag[0]];
                         $theConf = $conf['tags.'][$tag[0] . '.'];
                         // This flag indicates, that NL- (13-10-chars) should be stripped first and last.
-                        $stripNL = $theConf['stripNL'] ? 1 : 0;
+                        $stripNL = (bool)$theConf['stripNL'];
                         // This flag indicates, that this TypoTag section should NOT be included in the nonTypoTag content.
                         $breakOut = $theConf['breakoutTypoTagContent'] ? 1 : 0;
                         $this->parameters = array();
@@ -5373,21 +4817,21 @@ class ContentObjectRenderer
                         $contentAccumP++;
                         // If the TypoTag section
                         if (!$breakOut) {
-                            $contentAccum[$contentAccumP - 2] .= $contentAccum[($contentAccumP - 1)] . $contentAccum[$contentAccumP];
+                            $contentAccum[$contentAccumP - 2] .= $contentAccum[$contentAccumP - 1] . $contentAccum[$contentAccumP];
                             unset($contentAccum[$contentAccumP]);
                             unset($contentAccum[$contentAccumP - 1]);
                             $contentAccumP -= 2;
                         }
                         unset($currentTag);
-                        $treated = 1;
+                        $treated = true;
                     }
-                    // other tags...
+                    // other tags
                     if (!$treated) {
                         $contentAccum[$contentAccumP] .= $data;
                     }
                 } else {
                     // If a tag was not a typo tag, then it is just added to the content
-                    $stripNL = 0;
+                    $stripNL = false;
                     if (GeneralUtility::inList($allowTags, $tag[0]) || $denyTags != '*' && !GeneralUtility::inList($denyTags, $tag[0])) {
                         $contentAccum[$contentAccumP] .= $data;
                     } else {
@@ -5429,7 +4873,9 @@ class ContentObjectRenderer
         $lParts = explode(LF, $theValue);
         $encapTags = GeneralUtility::trimExplode(',', strtolower($conf['encapsTagList']), true);
         $nonWrappedTag = $conf['nonWrappedTag'];
-        $defaultAlign = isset($conf['defaultAlign.']) ? trim($this->stdWrap($conf['defaultAlign'], $conf['defaultAlign.'])) : trim($conf['defaultAlign']);
+        $defaultAlign = isset($conf['defaultAlign.'])
+            ? trim($this->stdWrap($conf['defaultAlign'], $conf['defaultAlign.']))
+            : trim($conf['defaultAlign']);
         if ((string)$theValue === '') {
             return '';
         }
@@ -5445,10 +4891,10 @@ class ContentObjectRenderer
                 $fwParts = explode('>', substr($l, 1), 2);
                 list($tagName) = explode(' ', $fwParts[0], 2);
                 if (!$fwParts[1]) {
-                    if (substr($tagName, -1) == '/') {
+                    if (substr($tagName, -1) === '/') {
                         $tagName = substr($tagName, 0, -1);
                     }
-                    if (substr($fwParts[0], -1) == '/') {
+                    if (substr($fwParts[0], -1) === '/') {
                         $sameBeginEnd = 1;
                         $emptyTag = 1;
                         $attrib = GeneralUtility::get_tag_attributes('<' . substr($fwParts[0], 0, -1) . '>');
@@ -5457,7 +4903,7 @@ class ContentObjectRenderer
                     $backParts = GeneralUtility::revExplode('<', substr($fwParts[1], 0, -1), 2);
                     $attrib = GeneralUtility::get_tag_attributes('<' . $fwParts[0] . '>');
                     $str_content = $backParts[0];
-                    $sameBeginEnd = substr(strtolower($backParts[1]), 1, strlen($tagName)) == strtolower($tagName);
+                    $sameBeginEnd = substr(strtolower($backParts[1]), 1, strlen($tagName)) === strtolower($tagName);
                 }
             }
             if ($sameBeginEnd && in_array(strtolower($tagName), $encapTags)) {
@@ -5480,11 +4926,11 @@ class ContentObjectRenderer
                 if (is_array($conf['addAttributes.'][$uTagName . '.'])) {
                     foreach ($conf['addAttributes.'][$uTagName . '.'] as $kk => $vv) {
                         if (!is_array($vv)) {
-                            if ((string)$conf['addAttributes.'][($uTagName . '.')][($kk . '.')]['setOnly'] == 'blank') {
+                            if ((string)$conf['addAttributes.'][$uTagName . '.'][$kk . '.']['setOnly'] === 'blank') {
                                 if ((string)$attrib[$kk] === '') {
                                     $attrib[$kk] = $vv;
                                 }
-                            } elseif ((string)$conf['addAttributes.'][($uTagName . '.')][($kk . '.')]['setOnly'] == 'exists') {
+                            } elseif ((string)$conf['addAttributes.'][$uTagName . '.'][$kk . '.']['setOnly'] === 'exists') {
                                 if (!isset($attrib[$kk])) {
                                     $attrib[$kk] = $vv;
                                 }
@@ -5539,7 +4985,7 @@ class ContentObjectRenderer
             $textstr = $textpieces[0];
             for ($i = 1; $i < $pieces; $i++) {
                 $len = strcspn($textpieces[$i], chr(32) . TAB . CRLF);
-                if (trim(substr($textstr, -1)) == '' && $len) {
+                if (trim(substr($textstr, -1)) === '' && $len) {
                     $lastChar = substr($textpieces[$i], $len - 1, 1);
                     if (!preg_match('/[A-Za-z0-9\\/#_-]/', $lastChar)) {
                         $len--;
@@ -5559,7 +5005,7 @@ class ContentObjectRenderer
                         // Added $linkParts['query'] 3/12
                         if (strstr($keep, 'query') && $linkParts['query']) {
                             $linktxt .= '?' . $linkParts['query'];
-                        } elseif ($linkParts['path'] == '/') {
+                        } elseif ($linkParts['path'] === '/') {
                             $linktxt = substr($linktxt, 0, -1);
                         }
                     }
@@ -5576,10 +5022,12 @@ class ContentObjectRenderer
                     // check for jump URLs or similar
                     $linkUrl = $this->processUrl(UrlProcessorInterface::CONTEXT_COMMON, $scheme . $parts[0], $conf);
 
-                    $res = '<a href="' . htmlspecialchars($linkUrl) . '"' . ($target ? ' target="' . $target . '"' : '') . $aTagParams . $this->extLinkATagParams(('http://' . $parts[0]), 'url') . '>';
+                    $res = '<a href="' . htmlspecialchars($linkUrl) . '"'
+                        . ($target !== '' ? ' target="' . $target . '"' : '')
+                        . $aTagParams . $this->extLinkATagParams(('http://' . $parts[0]), 'url') . '>';
 
                     $wrap = isset($conf['wrap.']) ? $this->stdWrap($conf['wrap'], $conf['wrap.']) : $conf['wrap'];
-                    if ($conf['ATagBeforeWrap']) {
+                    if ((string)$conf['ATagBeforeWrap'] !== '') {
                         $res = $res . $this->wrap($linktxt, $wrap) . '</a>';
                     } else {
                         $res = $this->wrap($res . $linktxt . '</a>', $wrap);
@@ -5613,7 +5061,7 @@ class ContentObjectRenderer
         $tsfe = $this->getTypoScriptFrontendController();
         for ($i = 1; $i < $pieces; $i++) {
             $len = strcspn($textpieces[$i], chr(32) . TAB . CRLF);
-            if (trim(substr($textstr, -1)) == '' && $len) {
+            if (trim(substr($textstr, -1)) === '' && $len) {
                 $lastChar = substr($textpieces[$i], $len - 1, 1);
                 if (!preg_match('/[A-Za-z0-9]/', $lastChar)) {
                     $len--;
@@ -5625,7 +5073,7 @@ class ContentObjectRenderer
                 $mailToUrl = $tsfe->spamProtectEmailAddresses === 'ascii' ? $mailToUrl : htmlspecialchars($mailToUrl);
                 $res = '<a href="' . $mailToUrl . '"' . $aTagParams . '>';
                 $wrap = isset($conf['wrap.']) ? $this->stdWrap($conf['wrap'], $conf['wrap.']) : $conf['wrap'];
-                if ($conf['ATagBeforeWrap']) {
+                if ((string)$conf['ATagBeforeWrap'] !== '') {
                     $res = $res . $this->wrap($linktxt, $wrap) . '</a>';
                 } else {
                     $res = $this->wrap($res . $linktxt . '</a>', $wrap);
@@ -5738,9 +5186,11 @@ class ContentObjectRenderer
                 $processingConfiguration['noScale'] = isset($fileArray['noScale.']) ? $this->stdWrap($fileArray['noScale'], $fileArray['noScale.']) : $fileArray['noScale'];
                 $processingConfiguration['additionalParameters'] = isset($fileArray['params.']) ? $this->stdWrap($fileArray['params'], $fileArray['params.']) : $fileArray['params'];
                 $processingConfiguration['frame'] = isset($fileArray['frame.']) ? (int)$this->stdWrap($fileArray['frame'], $fileArray['frame.']) : (int)$fileArray['frame'];
-                $processingConfiguration['crop'] = isset($fileArray['crop.']) ? $this->stdWrap($fileArray['crop'], $fileArray['crop.']) : (isset($fileArray['crop']) ? $fileArray['crop'] : null);
+                $processingConfiguration['crop'] = isset($fileArray['crop.'])
+                    ? $this->stdWrap($fileArray['crop'], $fileArray['crop.'])
+                    : (isset($fileArray['crop']) ? $fileArray['crop'] : null);
                 // Possibility to cancel/force profile extraction
-                // see $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_stripProfileCommand']
+                // see $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_stripColorProfileCommand']
                 if (isset($fileArray['stripProfile'])) {
                     $processingConfiguration['stripProfile'] = $fileArray['stripProfile'];
                 }
@@ -5941,7 +5391,11 @@ class ContentObjectRenderer
                             $retVal = 'none';
                         } elseif ($retVal === '' || $retVal === '0') {
                             // If it not set check the root-line for a layout on next level and use this
-                            foreach ($tsfe->rootLine as $rootLinePage) {
+                            // Remove first element, which is the current page
+                            // See also \TYPO3\CMS\Backend\View\BackendLayoutView::getSelectedCombinedIdentifier()
+                            $rootLine = $tsfe->rootLine;
+                            array_shift($rootLine);
+                            foreach ($rootLine as $rootLinePage) {
                                 $retVal = (string) $rootLinePage['backend_layout_next_level'];
                                 // If layout for "next level" is set to "none" - don't use any and stop searching
                                 if ($retVal === '-1') {
@@ -6025,9 +5479,7 @@ class ContentObjectRenderer
      */
     protected function getFileDataKey($key)
     {
-        $parts = explode(':', $key);
-        $fileUidOrCurrentKeyword = $parts[0];
-        $requestedFileInformationKey = $parts[1];
+        list($fileUidOrCurrentKeyword, $requestedFileInformationKey) = explode(':', $key, 3);
         try {
             if ($fileUidOrCurrentKeyword === 'current') {
                 $fileObject = $this->getCurrentFile();
@@ -6087,13 +5539,13 @@ class ContentObjectRenderer
      *
      * @param string $key Which level in the root line
      * @param string $field The field in the rootline record to return (a field from the pages table)
-     * @param bool|int $slideBack If set, then we will traverse through the rootline from outer level towards the root level until the value found is TRUE
+     * @param bool $slideBack If set, then we will traverse through the rootline from outer level towards the root level until the value found is TRUE
      * @param mixed $altRootLine If you supply an array for this it will be used as an alternative root line array
      * @return string The value from the field of the rootline.
      * @access private
      * @see getData()
      */
-    public function rootLineValue($key, $field, $slideBack = 0, $altRootLine = '')
+    public function rootLineValue($key, $field, $slideBack = false, $altRootLine = '')
     {
         $rootLine = is_array($altRootLine) ? $altRootLine : $this->getTypoScriptFrontendController()->tmpl->rootLine;
         if (!$slideBack) {
@@ -6250,6 +5702,9 @@ class ContentObjectRenderer
                 // Resource was not found
                 return $linkText;
             }
+        // Disallow direct javascript: links
+        } elseif (strtolower(trim($linkHandlerKeyword)) === 'javascript') {
+            return $linkText;
         } else {
             $linkParameter = $linkParameterParts['url'];
         }
@@ -6258,7 +5713,7 @@ class ContentObjectRenderer
         if ($linkParameterParts['additionalParams'] !== '') {
             $forceParams = $linkParameterParts['additionalParams'];
             // params value
-            $configuration['additionalParams'] .= $forceParams[0] == '&' ? $forceParams : '&' . $forceParams;
+            $configuration['additionalParams'] .= $forceParams[0] === '&' ? $forceParams : '&' . $forceParams;
         }
 
         return array(
@@ -6286,10 +5741,10 @@ class ContentObjectRenderer
     protected function detectLinkTypeFromLinkParameter($linkParameter)
     {
         // Parse URL:
-        $linkParts = parse_url($linkParameter);
+        $scheme = parse_url($linkParameter, PHP_URL_SCHEME);
         // Detecting kind of link:
         // If it's a mail address:
-        if (strpos($linkParameter, '@') > 0 && (!$linkParts['scheme'] || $linkParts['scheme'] == 'mailto')) {
+        if (strpos($linkParameter, '@') > 0 && (!$scheme || $scheme === 'mailto')) {
             return 'mailto';
         }
 
@@ -6304,7 +5759,8 @@ class ContentObjectRenderer
             list($rootFileDat) = explode('?', rawurldecode($linkParameter));
             $containsSlash = strpos($rootFileDat, '/') !== false;
             $rFD_fI = pathinfo($rootFileDat);
-            if (trim($rootFileDat) && !$containsSlash && (@is_file((PATH_site . $rootFileDat)) || GeneralUtility::inList('php,html,htm', strtolower($rFD_fI['extension'])))) {
+            $fileExtension = strtolower($rFD_fI['extension']);
+            if (!$containsSlash && trim($rootFileDat) && (@is_file(PATH_site . $rootFileDat) || $fileExtension === 'php' || $fileExtension === 'html' || $fileExtension === 'htm')) {
                 $isLocalFile = 1;
             } elseif ($containsSlash) {
                 // Adding this so realurl directories are linked right (non-existing).
@@ -6313,7 +5769,7 @@ class ContentObjectRenderer
         }
 
         // url (external): If doubleSlash or if a '.' comes before a '/'.
-        if ($linkParts['scheme'] || $isLocalFile != 1 && $urlChar && (!$containsSlash || $urlChar < $fileChar)) {
+        if ($scheme || $isLocalFile !== 1 && $urlChar && (!$containsSlash || $urlChar < $fileChar)) {
             return 'url';
 
         // file (internal)
@@ -6342,12 +5798,13 @@ class ContentObjectRenderer
      */
     public function typoLink($linktxt, $conf)
     {
+        $linktxt = (string)$linktxt;
         $tsfe = $this->getTypoScriptFrontendController();
 
         $LD = array();
         $finalTagParts = array();
         $finalTagParts['aTagParams'] = $this->getATagParams($conf);
-        $linkParameter = isset($conf['parameter.']) ? trim($this->stdWrap($conf['parameter'], $conf['parameter.'])) : trim($conf['parameter']);
+        $linkParameter = trim(isset($conf['parameter.']) ? $this->stdWrap($conf['parameter'], $conf['parameter.']) : $conf['parameter']);
         $this->lastTypoLinkUrl = '';
         $this->lastTypoLinkTarget = '';
 
@@ -6374,7 +5831,7 @@ class ContentObjectRenderer
             $JSwindow_tempParamsArr = GeneralUtility::trimExplode(',', strtolower($conf['JSwindow_params'] . ',' . $JSwindowParts[4]), true);
             $JSwindow_paramsArr = array();
             foreach ($JSwindow_tempParamsArr as $JSv) {
-                list($JSp, $JSv) = explode('=', $JSv);
+                list($JSp, $JSv) = explode('=', $JSv, 2);
                 $JSwindow_paramsArr[$JSp] = $JSp . '=' . $JSv;
             }
             // Add width/height:
@@ -6426,7 +5883,7 @@ class ContentObjectRenderer
                 if ($forceTarget) {
                     $target = $forceTarget;
                 }
-                if ($linktxt == '') {
+                if ($linktxt === '') {
                     $linktxt = $this->parseFunc($linkParameter, array('makelinks' => 0), '< lib.parseFunc');
                 }
                 // Parse URL:
@@ -6452,7 +5909,7 @@ class ContentObjectRenderer
 
                 // check if the file exists or if a / is contained (same check as in detectLinkType)
                 if (file_exists(rawurldecode($splitLinkParam[0])) || strpos($linkParameter, '/') !== false) {
-                    if ($linktxt == '') {
+                    if ($linktxt === '') {
                         $linktxt = $this->parseFunc(rawurldecode($linkParameter), array('makelinks' => 0), '< lib.parseFunc');
                     }
                     $this->lastTypoLinkUrl = $this->processUrl(UrlProcessorInterface::CONTEXT_FILE, $GLOBALS['TSFE']->absRefPrefix . $linkParameter, $conf);
@@ -6469,7 +5926,7 @@ class ContentObjectRenderer
                     $finalTagParts['targetParams'] = $target ? ' target="' . $target . '"' : '';
                     $finalTagParts['aTagParams'] .= $this->extLinkATagParams($finalTagParts['url'], $linkType);
                 } else {
-                    $this->getTimeTracker()->setTSlogMessage('typolink(): File \'' . $splitLinkParam[0] . '\' did not exist, so \'' . $linktxt . '\' was not linked.', 1);
+                    $this->getTimeTracker()->setTSlogMessage('typolink(): File "' . $splitLinkParam[0] . '" did not exist, so "' . $linktxt . '" was not linked.', 1);
                     return $linktxt;
                 }
             break;
@@ -6493,12 +5950,14 @@ class ContentObjectRenderer
                     $linkParameter = $tsfe->id;
                 }
 
-                $sectionMark = isset($conf['section.']) ? trim($this->stdWrap($conf['section'], $conf['section.'])) : trim($conf['section']);
-                $sectionMark = $sectionMark ? (MathUtility::canBeInterpretedAsInteger($sectionMark) ? '#c' : '#') . $sectionMark : '';
+                $sectionMark = trim(isset($conf['section.']) ? $this->stdWrap($conf['section'], $conf['section.']) : $conf['section']);
+                if ($sectionMark !== '') {
+                    $sectionMark = '#' . (MathUtility::canBeInterpretedAsInteger($sectionMark) ? 'c' : '') . $sectionMark;
+                }
 
-                if ($link_params_parts[1] && !$sectionMark) {
+                if ($link_params_parts[1] && $sectionMark === '') {
                     $sectionMark = trim($link_params_parts[1]);
-                    $sectionMark = (MathUtility::canBeInterpretedAsInteger($sectionMark) ? '#c' : '#') . $sectionMark;
+                    $sectionMark = '#' . (MathUtility::canBeInterpretedAsInteger($sectionMark) ? 'c' : '') . $sectionMark;
                 }
                 if (count($pairParts) > 1) {
                     // Overruling 'type'
@@ -6531,13 +5990,13 @@ class ContentObjectRenderer
                     if (is_array($mount_info) && $mount_info['overlay']) {
                         $page = $tsfe->sys_page->getPage($mount_info['mount_pid'], $disableGroupAccessCheck);
                         if (empty($page)) {
-                            $this->getTimeTracker()->setTSlogMessage('typolink(): Mount point \'' . $mount_info['mount_pid'] . '\' was not available, so \'' . $linktxt . '\' was not linked.', 1);
+                            $this->getTimeTracker()->setTSlogMessage('typolink(): Mount point "' . $mount_info['mount_pid'] . '" was not available, so "' . $linktxt . '" was not linked.', 1);
                             return $linktxt;
                         }
                         $MPvarAcc['re-map'] = $mount_info['MPvar'];
                     }
                     // Setting title if blank value to link:
-                    if ($linktxt == '') {
+                    if ($linktxt === '') {
                         $linktxt = $this->parseFunc($page['title'], array('makelinks' => 0), '< lib.parseFunc');
                     }
                     // Query Params:
@@ -6558,7 +6017,7 @@ class ContentObjectRenderer
                         unset($params);
                     }
                     $targetDomain = '';
-                    $currentDomain = $this->getEnvironmentVariable('HTTP_HOST');
+                    $currentDomain = (string)$this->getEnvironmentVariable('HTTP_HOST');
                     // Mount pages are always local and never link to another domain
                     if (!empty($MPvarAcc)) {
                         // Add "&MP" var:
@@ -6570,16 +6029,23 @@ class ContentObjectRenderer
                         // If we link across domains and page is free type shortcut, we must resolve the shortcut first!
                         // If we do not do it, TYPO3 will fail to (1) link proper page in RealURL/CoolURI because
                         // they return relative links and (2) show proper page if no RealURL/CoolURI exists when link is clicked
-                        if ($enableLinksAcrossDomains && $page['doktype'] == PageRepository::DOKTYPE_SHORTCUT && $page['shortcut_mode'] == PageRepository::SHORTCUT_MODE_NONE) {
+                        if ($enableLinksAcrossDomains
+                            && (int)$page['doktype'] === PageRepository::DOKTYPE_SHORTCUT
+                            && (int)$page['shortcut_mode'] === PageRepository::SHORTCUT_MODE_NONE
+                        ) {
                             // Save in case of broken destination or endless loop
                             $page2 = $page;
                             // Same as in RealURL, seems enough
                             $maxLoopCount = 20;
-                            while ($maxLoopCount && is_array($page) && $page['doktype'] == PageRepository::DOKTYPE_SHORTCUT && $page['shortcut_mode'] == PageRepository::SHORTCUT_MODE_NONE) {
+                            while ($maxLoopCount
+                                && is_array($page)
+                                && (int)$page['doktype'] === PageRepository::DOKTYPE_SHORTCUT
+                                && (int)$page['shortcut_mode'] === PageRepository::SHORTCUT_MODE_NONE
+                            ) {
                                 $page = $tsfe->sys_page->getPage($page['shortcut'], $disableGroupAccessCheck);
                                 $maxLoopCount--;
                             }
-                            if (empty($page) || $maxLoopCount == 0) {
+                            if (empty($page) || $maxLoopCount === 0) {
                                 // We revert if shortcut is broken or maximum number of loops is exceeded (indicates endless loop)
                                 $page = $page2;
                             }
@@ -6608,7 +6074,7 @@ class ContentObjectRenderer
                             $targetDomain = $currentDomain;
                         }
                         // If go for an absolute link, add site path if it's not taken care about by absRefPrefix
-                        if (!$tsfe->config['config']['absRefPrefix'] && $targetDomain == $currentDomain) {
+                        if (!$tsfe->config['config']['absRefPrefix'] && $targetDomain === $currentDomain) {
                             $targetDomain = $currentDomain . rtrim($this->getEnvironmentVariable('TYPO3_SITE_PATH'), '/');
                         }
                     }
@@ -6626,7 +6092,7 @@ class ContentObjectRenderer
                         if (!preg_match('/^[a-z0-9.\\-]*$/i', $targetDomain)) {
                             $targetDomain =  GeneralUtility::idnaEncode($targetDomain);
                         }
-                        $this->lastTypoLinkUrl = $this->URLqMark(($absoluteUrlScheme . '://' . $targetDomain . '/index.php?id=' . $page['uid']), $addQueryParams) . $sectionMark;
+                        $this->lastTypoLinkUrl = $this->URLqMark($absoluteUrlScheme . '://' . $targetDomain . '/index.php?id=' . $page['uid'], $addQueryParams) . $sectionMark;
                     } else {
                         // Internal link or current domain's linking scheme should be used
                         if ($forceTarget) {
@@ -6641,36 +6107,47 @@ class ContentObjectRenderer
                                 // domains. absRefPrefix can contain domain name, which will screw up
                                 // the link to the external domain.
                                 $prefixLength = strlen($tsfe->config['config']['absRefPrefix']);
-                                if (substr($LD['totalURL'], 0, $prefixLength) == $tsfe->config['config']['absRefPrefix']) {
+                                if (substr($LD['totalURL'], 0, $prefixLength) === $tsfe->config['config']['absRefPrefix']) {
                                     $LD['totalURL'] = substr($LD['totalURL'], $prefixLength);
                                 }
                             }
                             $urlParts = parse_url($LD['totalURL']);
-                            if ($urlParts['host'] == '') {
-                                $LD['totalURL'] = $absoluteUrlScheme . '://' . $targetDomain . ($LD['totalURL'][0] == '/' ? '' : '/') . $LD['totalURL'];
+                            if (empty($urlParts['host'])) {
+                                $LD['totalURL'] = $absoluteUrlScheme . '://' . $targetDomain . ($LD['totalURL'][0] === '/' ? '' : '/') . $LD['totalURL'];
                             }
                         }
                         $this->lastTypoLinkUrl = $this->URLqMark($LD['totalURL'], '') . $sectionMark;
                     }
                     $this->lastTypoLinkTarget = $LD['target'];
-                    $targetPart = $LD['target'] ? ' target="' . htmlspecialchars($LD['target']) . '"' : '';
                     // If sectionMark is set, there is no baseURL AND the current page is the page the link is to, check if there are any additional parameters or addQueryString parameters and if not, drop the url.
-                    if ($sectionMark && !$tsfe->config['config']['baseURL'] && $page['uid'] == $tsfe->id && !trim($addQueryParams) && !($conf['addQueryString'] && $conf['addQueryString.'])) {
-                        list(, $URLparams) = explode('?', $this->lastTypoLinkUrl);
-                        list($URLparams) = explode('#', $URLparams);
-                        parse_str($URLparams . $LD['orig_type'], $URLparamsArray);
-                        // Type nums must match as well as page ids
-                        if ((int)$URLparamsArray['type'] == $tsfe->type) {
-                            unset($URLparamsArray['id']);
-                            unset($URLparamsArray['type']);
-                            // If there are no parameters left.... set the new url.
-                            if (empty($URLparamsArray)) {
-                                $this->lastTypoLinkUrl = $sectionMark;
+                    if ($sectionMark
+                        && !$tsfe->config['config']['baseURL']
+                        && (int)$page['uid'] === (int)$tsfe->id
+                        && !trim($addQueryParams)
+                        && (empty($conf['addQueryString']) || !isset($conf['addQueryString.']))
+                    ) {
+                        $currentQueryParams = $this->getQueryArguments(array());
+                        if (!trim($currentQueryParams)) {
+                            list(, $URLparams) = explode('?', $this->lastTypoLinkUrl);
+                            list($URLparams) = explode('#', $URLparams);
+                            parse_str($URLparams . $LD['orig_type'], $URLparamsArray);
+                            // Type nums must match as well as page ids
+                            if ((int)$URLparamsArray['type'] === (int)$tsfe->type) {
+                                unset($URLparamsArray['id']);
+                                unset($URLparamsArray['type']);
+                                // If there are no parameters left.... set the new url.
+                                if (empty($URLparamsArray)) {
+                                    $this->lastTypoLinkUrl = $sectionMark;
+                                }
                             }
                         }
                     }
                     // If link is to an access restricted page which should be redirected, then find new URL:
-                    if (empty($conf['linkAccessRestrictedPages']) && $tsfe->config['config']['typolinkLinkAccessRestrictedPages'] && $tsfe->config['config']['typolinkLinkAccessRestrictedPages'] !== 'NONE' && !$tsfe->checkPageGroupAccess($page)) {
+                    if (empty($conf['linkAccessRestrictedPages'])
+                        && $tsfe->config['config']['typolinkLinkAccessRestrictedPages']
+                        && $tsfe->config['config']['typolinkLinkAccessRestrictedPages'] !== 'NONE'
+                        && !$tsfe->checkPageGroupAccess($page)
+                    ) {
                         $thePage = $tsfe->sys_page->getPage($tsfe->config['config']['typolinkLinkAccessRestrictedPages']);
                         $addParams = str_replace(
                             array(
@@ -6690,9 +6167,9 @@ class ContentObjectRenderer
                     }
                     // Rendering the tag.
                     $finalTagParts['url'] = $this->lastTypoLinkUrl;
-                    $finalTagParts['targetParams'] = $targetPart;
+                    $finalTagParts['targetParams'] = (string)$LD['target'] !== '' ? ' target="' . htmlspecialchars($LD['target']) . '"' : '';
                 } else {
-                    $this->getTimeTracker()->setTSlogMessage('typolink(): Page id \'' . $linkParameter . '\' was not found, so \'' . $linktxt . '\' was not linked.', 1);
+                    $this->getTimeTracker()->setTSlogMessage('typolink(): Page id "' . $linkParameter . '" was not found, so "' . $linktxt . '" was not linked.', 1);
                     return $linktxt;
                 }
             break;
@@ -6707,20 +6184,31 @@ class ContentObjectRenderer
 
         if ($JSwindowParams) {
             // Create TARGET-attribute only if the right doctype is used
-            if (!GeneralUtility::inList('xhtml_strict,xhtml_11,xhtml_2', $tsfe->xhtmlDoctype)) {
+            $xhtmlDocType = $tsfe->xhtmlDoctype;
+            if ($xhtmlDocType !== 'xhtml_strict' && $xhtmlDocType !== 'xhtml_11') {
                 $target = ' target="FEopenLink"';
             } else {
                 $target = '';
             }
             $onClick = 'vHWin=window.open(' . GeneralUtility::quoteJSvalue($tsfe->baseUrlWrap($finalTagParts['url'])) . ',\'FEopenLink\',' . GeneralUtility::quoteJSvalue($JSwindowParams) . ');vHWin.focus();return false;';
-            $finalAnchorTag = '<a href="' . htmlspecialchars($finalTagParts['url']) . '"' . $target . ' onclick="' . htmlspecialchars($onClick) . '"' . ($title ? ' title="' . htmlspecialchars($title) . '"' : '') . ($linkClass ? ' class="' . $linkClass . '"' : '') . $finalTagParts['aTagParams'] . '>';
+            $finalAnchorTag = '<a href="' . htmlspecialchars($finalTagParts['url']) . '"'
+                . $target
+                . ' onclick="' . htmlspecialchars($onClick) . '"'
+                . ((string)$title !== '' ? ' title="' . htmlspecialchars($title) . '"' : '')
+                . ($linkClass !== '' ? ' class="' . $linkClass . '"' : '')
+                . $finalTagParts['aTagParams']
+                . '>';
         } else {
             if ($tsfe->spamProtectEmailAddresses === 'ascii' && $linkType === 'mailto') {
                 $finalAnchorTag = '<a href="' . $finalTagParts['url'] . '"';
             } else {
                 $finalAnchorTag = '<a href="' . htmlspecialchars($finalTagParts['url']) . '"';
             }
-            $finalAnchorTag .= ($title ? ' title="' . htmlspecialchars($title) . '"' : '') . $finalTagParts['targetParams'] . ($linkClass ? ' class="' . $linkClass . '"' : '') . $finalTagParts['aTagParams'] . '>';
+            $finalAnchorTag .= ((string)$title !== '' ? ' title="' . htmlspecialchars($title) . '"' : '')
+                . $finalTagParts['targetParams']
+                . ($linkClass ? ' class="' . $linkClass . '"' : '')
+                . $finalTagParts['aTagParams']
+                . '>';
         }
 
         // Call user function:
@@ -6992,7 +6480,7 @@ class ContentObjectRenderer
             foreach ($tCR_rootline as $tCR_data) {
                 foreach ($inverseTmplRootline as $rlKey => $invTmplRLRec) {
                     // Force accumulating when in overlay mode: Links to this page have to stay within the current branch
-                    if ($invTmplRLRec['_MOUNT_OL'] && $tCR_data['uid'] == $invTmplRLRec['uid']) {
+                    if ($invTmplRLRec['_MOUNT_OL'] && (int)$tCR_data['uid'] === (int)$invTmplRLRec['uid']) {
                         $startMPaccu = true;
                     }
                     // Accumulate MP data:
@@ -7002,7 +6490,7 @@ class ContentObjectRenderer
                     // If two PIDs matches and this is NOT the site root, start accumulation of MP data (on the next level):
                     // (The check for site root is done so links to branches outsite the site but sharing the site roots PID
                     // is NOT detected as within the branch!)
-                    if ($tCR_data['pid'] == $invTmplRLRec['pid'] && count($inverseTmplRootline) !== $rlKey + 1) {
+                    if ((int)$tCR_data['pid'] === (int)$invTmplRLRec['pid'] && count($inverseTmplRootline) !== $rlKey + 1) {
                         $startMPaccu = true;
                     }
                 }
@@ -7029,6 +6517,7 @@ class ContentObjectRenderer
      */
     public function getMailTo($mailAddress, $linktxt)
     {
+        $mailAddress = (string)$mailAddress;
         if ((string)$linktxt === '') {
             $linktxt = $mailAddress;
         }
@@ -7146,7 +6635,9 @@ class ContentObjectRenderer
     public function noTrimWrap($content, $wrap, $char = '|')
     {
         if ($wrap) {
-            $wrapArr = explode($char, $wrap);
+            // expects to be wrapped with (at least) 3 characters (before, middle, after)
+            // anything else is not taken into account
+            $wrapArr = explode($char, $wrap, 4);
             $content = $wrapArr[1] . $content . $wrapArr[2];
         }
         return $content;
@@ -7200,9 +6691,8 @@ class ContentObjectRenderer
         // Split parts
         $parts = explode('->', $funcName);
         if (count($parts) === 2) {
-            // Class
-            // Check whether class is available and try to reload includeLibs if possible:
-            if ($this->isClassAvailable($parts[0], $conf)) {
+            // Check whether PHP class is available
+            if (class_exists($parts[0])) {
                 $classObj = GeneralUtility::makeInstance($parts[0]);
                 if (is_object($classObj) && method_exists($classObj, $parts[1])) {
                     $classObj->cObj = $this;
@@ -7233,16 +6723,18 @@ class ContentObjectRenderer
      *
      * @param string $params Text which the parameters
      * @return array array with the parameters as key/value pairs
+     * @deprecated since TYPO3 CMS 8, will be removed in TYPO3 CMS 9.
      */
     public function processParams($params)
     {
+        GeneralUtility::logDeprecatedFunction();
         $paramArr = array();
         $lines = GeneralUtility::trimExplode(LF, $params, true);
         foreach ($lines as $val) {
             $pair = explode('=', $val, 2);
-            $pair[0] = trim($pair[0]);
-            if (!GeneralUtility::inList('#,/', $pair[0][0])) {
-                $paramArr[$pair[0]] = trim($pair[1]);
+            $key = trim($pair[0]);
+            if ($key[0] !== '#' && $key[0] !== '/') {
+                $paramArr[$key] = trim($pair[1]);
             }
         }
         return $paramArr;
@@ -7499,7 +6991,7 @@ class ContentObjectRenderer
         $Valign = strtolower(trim($conf['Valign']));
         $tmplObjNumber = (int)$conf['tmplObjNumber'];
         $maxLines = (int)$conf['maxLines'];
-        if ($tmplObjNumber && $gifbuilderConf[$tmplObjNumber] == 'TEXT') {
+        if ($tmplObjNumber && $gifbuilderConf[$tmplObjNumber] === 'TEXT') {
             $textArr = $this->linebreaks($text, $chars, $maxLines);
             $angle = (int)$gifbuilderConf[$tmplObjNumber . '.']['angle'];
             foreach ($textArr as $c => $textChunk) {
@@ -7511,7 +7003,7 @@ class ContentObjectRenderer
                 $y_d = cos($rad_angle) * $lineDist;
                 $diff_x_d = 0;
                 $diff_y_d = 0;
-                if ($Valign == 'center') {
+                if ($Valign === 'center') {
                     $diff_x_d = $x_d * count($textArr);
                     $diff_x_d = $diff_x_d / 2;
                     $diff_y_d = $y_d * count($textArr);
@@ -7580,40 +7072,6 @@ class ContentObjectRenderer
         return $librariesIncluded;
     }
 
-    /**
-     * Checks whether a PHP class is available. If the check fails, the method tries to
-     * determine the correct includeLibs to make the class available automatically.
-     *
-     * TypoScript example that can cause this:
-     * | plugin.tx_myext_pi1 = USER
-     * | plugin.tx_myext_pi1 {
-     * |   includeLibs = EXT:myext/pi1/class.tx_myext_pi1.php
-     * |   userFunc = tx_myext_pi1->main
-     * | }
-     * | 10 = USER
-     * | 10.userFunc = tx_myext_pi1->renderHeader
-     *
-     * @param string $className The name of the PHP class to be checked
-     * @param array $config TypoScript configuration (naturally of a USER or COA cObject)
-     * @return bool Whether the class is available
-     * @link http://forge.typo3.org/issues/19510
-     * @todo This method was introduced in TYPO3 4.3 and can be removed if the autoload was integrated
-     */
-    protected function isClassAvailable($className, array $config = null)
-    {
-        if (class_exists($className)) {
-            return true;
-        }
-        if ($config) {
-            $pluginConfiguration = &$this->getTypoScriptFrontendController()->tmpl->setup['plugin.'][$className . '.'];
-            if (isset($pluginConfiguration['includeLibs']) && $pluginConfiguration['includeLibs']) {
-                $config['includeLibs'] = $pluginConfiguration['includeLibs'];
-                return $this->includeLibs($config);
-            }
-        }
-        return false;
-    }
-
     /***********************************************
      *
      * Database functions, making of queries
@@ -7770,19 +7228,29 @@ class ContentObjectRenderer
      */
     public function DBmayFEUserEdit($table, $row, $feUserRow, $allowedGroups = '', $feEditSelf = 0)
     {
-        $groupList = $allowedGroups ? implode(',', array_intersect(GeneralUtility::trimExplode(',', $feUserRow['usergroup'], true), GeneralUtility::trimExplode(',', $allowedGroups, true))) : $feUserRow['usergroup'];
+        if ($allowedGroups) {
+            $groupList = implode(
+                ',',
+                array_intersect(
+                    GeneralUtility::trimExplode(',', $feUserRow['usergroup'], true),
+                    GeneralUtility::trimExplode(',', $allowedGroups, true)
+                )
+            );
+        } else {
+            $groupList = $feUserRow['usergroup'];
+        }
         $ok = 0;
         // Points to the field that allows further editing from frontend if not set. If set the record is locked.
         if (!$GLOBALS['TCA'][$table]['ctrl']['fe_admin_lock'] || !$row[$GLOBALS['TCA'][$table]['ctrl']['fe_admin_lock']]) {
             // Points to the field (int) that holds the fe_users-id of the creator fe_user
             if ($GLOBALS['TCA'][$table]['ctrl']['fe_cruser_id']) {
                 $rowFEUser = (int)$row[$GLOBALS['TCA'][$table]['ctrl']['fe_cruser_id']];
-                if ($rowFEUser && $rowFEUser == $feUserRow['uid']) {
+                if ($rowFEUser && $rowFEUser === (int)$feUserRow['uid']) {
                     $ok = 1;
                 }
             }
             // If $feEditSelf is set, fe_users may always edit them selves...
-            if ($feEditSelf && $table == 'fe_users' && (int)$feUserRow['uid'] === (int)$row['uid']) {
+            if ($feEditSelf && $table === 'fe_users' && (int)$feUserRow['uid'] === (int)$row['uid']) {
                 $ok = 1;
             }
             // Points to the field (int) that holds the fe_group-id of the creator fe_user's first group
@@ -7813,7 +7281,17 @@ class ContentObjectRenderer
     public function DBmayFEUserEditSelect($table, $feUserRow, $allowedGroups = '', $feEditSelf = 0)
     {
         // Returns where-definition that selects user-editable records.
-        $groupList = $allowedGroups ? implode(',', array_intersect(GeneralUtility::trimExplode(',', $feUserRow['usergroup'], true), GeneralUtility::trimExplode(',', $allowedGroups, true))) : $feUserRow['usergroup'];
+        if ($allowedGroups) {
+            $groupList = implode(
+                ',',
+                array_intersect(
+                    GeneralUtility::trimExplode(',', $feUserRow['usergroup'], true),
+                    GeneralUtility::trimExplode(',', $allowedGroups, true)
+                )
+            );
+        } else {
+            $groupList = $feUserRow['usergroup'];
+        }
         $OR_arr = array();
         // Points to the field (int) that holds the fe_users-id of the creator fe_user
         if ($GLOBALS['TCA'][$table]['ctrl']['fe_cruser_id']) {
@@ -7829,7 +7307,7 @@ class ContentObjectRenderer
             }
         }
         // If $feEditSelf is set, fe_users may always edit them selves...
-        if ($feEditSelf && $table == 'fe_users') {
+        if ($feEditSelf && $table === 'fe_users') {
             $OR_arr[] = 'uid=' . (int)$feUserRow['uid'];
         }
         $whereDef = ' AND 1=0';
@@ -7861,7 +7339,7 @@ class ContentObjectRenderer
     {
         $tsfe = $this->getTypoScriptFrontendController();
         $show_hidden = $show_hidden ?: ($table === 'pages' ? $tsfe->showHiddenPage : $tsfe->showHiddenRecords);
-        return $tsfe->sys_page->enableFields($table, $show_hidden, $ignore_array);
+        return $tsfe->sys_page->enableFields($table, (bool)$show_hidden, $ignore_array);
     }
 
     /**
@@ -7925,7 +7403,7 @@ class ContentObjectRenderer
             $cacheEntry = $db->exec_SELECTgetSingleRow(
                 'treelist',
                 'cache_treelist',
-                'md5hash = \'' . $requestHash . '\' AND ( expires > ' . $GLOBALS['EXEC_TIME'] . ' OR expires = 0 )'
+                'md5hash = \'' . $requestHash . '\' AND ( expires > ' . (int)$GLOBALS['EXEC_TIME'] . ' OR expires = 0 )'
             );
             if (is_array($cacheEntry)) {
                 // Cache hit
@@ -7933,7 +7411,7 @@ class ContentObjectRenderer
             }
             // If Id less than zero it means we should add the real id to list:
             if ($id < 0) {
-                $addId = ($id = abs($id));
+                $addId = $id = abs($id);
             }
             // Check start page:
             if ($tsfe->sys_page->getRawRecord('pages', $id, 'uid')) {
@@ -7969,8 +7447,8 @@ class ContentObjectRenderer
                     /** @var VersionState $versionState */
                     $versionState = VersionState::cast($row['t3ver_state']);
                     $tsfe->sys_page->versionOL('pages', $row);
-                    if ($row['doktype'] == PageRepository::DOKTYPE_RECYCLER
-                        || $row['doktype'] == PageRepository::DOKTYPE_BE_USER_SECTION
+                    if ((int)$row['doktype'] === PageRepository::DOKTYPE_RECYCLER
+                        || (int)$row['doktype'] === PageRepository::DOKTYPE_BE_USER_SECTION
                         || $versionState->indicatesPlaceholder()
                     ) {
                         // Doing this after the overlay to make sure changes
@@ -7993,8 +7471,8 @@ class ContentObjectRenderer
                             'sorting'
                         );
                         $tsfe->sys_page->versionOL('pages', $row);
-                        if ($row['doktype'] == PageRepository::DOKTYPE_RECYCLER
-                            || $row['doktype'] == PageRepository::DOKTYPE_BE_USER_SECTION
+                        if ((int)$row['doktype'] === PageRepository::DOKTYPE_RECYCLER
+                            || (int)$row['doktype'] === PageRepository::DOKTYPE_BE_USER_SECTION
                             || $versionState->indicatesPlaceholder()
                         ) {
                             // Doing this after the overlay to make sure
@@ -8074,7 +7552,9 @@ class ContentObjectRenderer
         return $this->getDatabaseConnection()->exec_SELECTquery(
             $select,
             $local_table . ',' . $mm_table . ($foreign_table ? ',' . $foreign_table : ''),
-            $local_table . '.uid=' . $mm_table . '.uid_local' . ($foreign_table ? ' AND ' . $foreign_table . '.uid=' . $mm_table . '.uid_foreign' : '') . $whereClause,
+            $local_table . '.uid=' . $mm_table . '.uid_local'
+                . ($foreign_table ? ' AND ' . $foreign_table . '.uid=' . $mm_table . '.uid_foreign' : '')
+                . $whereClause,
             $groupBy,
             $orderBy,
             $limit
@@ -8101,7 +7581,9 @@ class ContentObjectRenderer
         return $this->getDatabaseConnection()->exec_SELECTquery(
             $select,
             $mm_table . ($foreign_table ? ',' . $foreign_table : ''),
-            $mm_table . '.uid_local IN (' . $local_table_uidlist . ')' . ($foreign_table ? ' AND ' . $foreign_table . '.uid=' . $mm_table . '.uid_foreign' : '') . $whereClause,
+            $mm_table . '.uid_local IN (' . $local_table_uidlist . ')'
+                . ($foreign_table ? ' AND ' . $foreign_table . '.uid=' . $mm_table . '.uid_foreign' : '')
+                . $whereClause,
             $groupBy,
             $orderBy,
             $limit
@@ -8389,7 +7871,6 @@ class ContentObjectRenderer
         $considerMovePlaceholders = (
             $tsfe->sys_page->versioningPreview && $table !== 'pages'
             && !empty($GLOBALS['TCA'][$table]['ctrl']['versioningWS'])
-            && (int)$GLOBALS['TCA'][$table]['ctrl']['versioningWS'] >= 2
         );
         if (trim($conf['uidInList'])) {
             $listArr = GeneralUtility::intExplode(',', str_replace('this', $tsfe->contentPid, $conf['uidInList']));
@@ -8408,7 +7889,7 @@ class ContentObjectRenderer
             $pid_uid_flag++;
         }
         // Static_* tables are allowed to be fetched from root page
-        if (substr($table, 0, 7) == 'static_') {
+        if (substr($table, 0, 7) === 'static_') {
             $pid_uid_flag++;
         }
         if (trim($conf['pidInList'])) {
@@ -8471,13 +7952,9 @@ class ContentObjectRenderer
             }
             $query .= ' AND (' . $languageQuery . ')';
         }
-        $andWhere = isset($conf['andWhere.']) ? trim($this->stdWrap($conf['andWhere'], $conf['andWhere.'])) : trim($conf['andWhere']);
-        if ($andWhere) {
-            GeneralUtility::deprecationLog('Usage of TypoScript property "andWhere" is deprecated since 7.1 in favor of "where". It has been used to query the table "' . $table . '".');
-            $query .= ' AND ' . $andWhere;
-        }
+
         // Enablefields
-        if ($table == 'pages') {
+        if ($table === 'pages') {
             $query .= ' ' . $tsfe->sys_page->where_hid_del . $tsfe->sys_page->where_groupAccess;
         } else {
             $query .= $this->enableFields($table, false, $enableFieldsIgnore);
@@ -8624,7 +8101,7 @@ class ContentObjectRenderer
             } elseif (is_null($tempValue)) {
                 // It represents NULL
                 $markerValues[$marker] = 'NULL';
-            } elseif ($conf['markers.'][$dottedMarker]['commaSeparatedList'] == 1) {
+            } elseif (!empty($conf['markers.'][$dottedMarker]['commaSeparatedList'])) {
                 // See if it is really a comma separated list of values
                 $explodeValues = GeneralUtility::trimExplode(',', $tempValue);
                 if (count($explodeValues) > 1) {
@@ -8733,7 +8210,7 @@ class ContentObjectRenderer
         $tsfe = $this->getTypoScriptFrontendController();
         $enablecolumns = $GLOBALS['TCA'][$table]['ctrl']['enablecolumns'];
         return $enablecolumns['disabled'] && $row[$enablecolumns['disabled']]
-            || $enablecolumns['fe_group'] && $tsfe->simUserGroup && $row[$enablecolumns['fe_group']] == $tsfe->simUserGroup
+            || $enablecolumns['fe_group'] && $tsfe->simUserGroup && (int)$row[$enablecolumns['fe_group']] === (int)$tsfe->simUserGroup
             || $enablecolumns['starttime'] && $row[$enablecolumns['starttime']] > $GLOBALS['EXEC_TIME']
             || $enablecolumns['endtime'] && $row[$enablecolumns['endtime']] && $row[$enablecolumns['endtime']] < $GLOBALS['EXEC_TIME'];
     }