[BUGFIX] Some methods in t3lib_TSparser should be static
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_parsehtml_proc.php
index c7b23a9..25f7974 100644 (file)
@@ -2,7 +2,7 @@
 /***************************************************************
  *  Copyright notice
  *
- *  (c) 1999-2010 Kasper Skårhøj (kasperYYYY@typo3.com)
+ *  (c) 1999-2011 Kasper Skårhøj (kasperYYYY@typo3.com)
  *  All rights reserved
  *
  *  This script is part of the TYPO3 project. The TYPO3 project is
  ***************************************************************/
 /**
  * Functions for parsing HTML, specially for TYPO3 processing in relation to TCEmain and Rich Text Editor (RTE)
- *
- * $Id$
  * Revised for TYPO3 3.6 December/2003 by Kasper Skårhøj
  * XHTML compatible.
  *
  * @author     Kasper Skårhøj <kasperYYYY@typo3.com>
  * @internal
  */
-/**
- * [CLASS/FUNCTION INDEX of SCRIPT]
- *
- *
- *
- *  103: class t3lib_parsehtml_proc extends t3lib_parsehtml
- *  138:        function init($elRef='',$recPid=0)
- *  150:        function setRelPath($path)
- *  174:        function evalWriteFile($pArr,$currentRecord)
- *
- *                       SECTION: Main function
- *  232:        function RTE_transform($value,$specConf,$direction='rte',$thisConfig=array())
- *
- *                       SECTION: Specific RTE TRANSFORMATION functions
- *  398:        function TS_images_db($value)
- *  550:        function TS_images_rte($value)
- *  589:        function TS_reglinks($value,$direction)
- *  626:        function TS_links_db($value)
- *  675:        function TS_links_rte($value)
- *  760:        function TS_preserve_db($value)
- *  784:        function TS_preserve_rte($value)
- *  805:        function TS_transform_db($value,$css=FALSE)
- *  922:        function transformStyledATags($value)
- *  948:        function TS_transform_rte($value,$css=0)
- * 1019:        function TS_strip_db($value)
- *
- *                       SECTION: Generic RTE transformation, analysis and helper functions
- * 1050:        function getURL($url)
- * 1064:        function HTMLcleaner_db($content,$tagList='')
- * 1091:        function getKeepTags($direction='rte',$tagList='')
- * 1200:        function divideIntoLines($value,$count=5,$returnArray=FALSE)
- * 1304:        function setDivTags($value,$dT='p')
- * 1349:        function internalizeFontTags($value)
- * 1385:        function siteUrl()
- * 1395:        function rteImageStorageDir()
- * 1407:        function removeTables($value,$breakChar='<br />')
- * 1439:        function defaultTStagMapping($code,$direction='rte')
- * 1462:        function getWHFromAttribs($attribArray)
- * 1489:        function urlInfoForLinkTags($url)
- * 1548:        function TS_AtagToAbs($value,$dontSetRTEKEEP=FALSE)
- *
- * TOTAL FUNCTIONS: 28
- * (This index is automatically created/updated by the extension "extdeveval")
- *
- */
 
 
 /**
@@ -91,7 +44,7 @@
 class t3lib_parsehtml_proc extends t3lib_parsehtml {
 
                // Static:
-       var $blockElementList = 'PRE,UL,OL,H1,H2,H3,H4,H5,H6,HR,ADDRESS,DL,DD'; // List of tags for these elements
+       var $blockElementList = 'PRE,UL,OL,H1,H2,H3,H4,H5,H6,ADDRESS,DL,DD'; // List of tags for these elements
 
                // Internal, static:
        var $recPid = 0; // Set this to the pid of the record manipulated by the class.
@@ -152,7 +105,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @return      mixed           On success an array with various information is returned, otherwise a string with an error message
         * @see t3lib_TCEmain, t3lib_transferData
         */
-       function evalWriteFile($pArr, $currentRecord) {
+       public static function evalWriteFile($pArr, $currentRecord) {
 
                        // Write file configuration:
                if (is_array($pArr)) {
@@ -666,7 +619,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                foreach ($blockSplit as $k => $v) {
                        $error = '';
                        if ($k % 2) { // block:
-                               $tagCode = t3lib_div::unQuoteFilenames(trim(substr($this->getFirstTag($v), 0, -1)), true);
+                               $tagCode = t3lib_div::unQuoteFilenames(trim(substr($this->getFirstTag($v), 0, -1)), TRUE);
                                $link_param = $tagCode[1];
                                $href = '';
                                        // Parsing the typolink data. This parsing is roughly done like in tslib_content->typolink()
@@ -705,7 +658,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                                        $idPart = $this->recPid;
                                                } // If no id or alias is given, set it to class record pid
                                                        // Checking if the id-parameter is an alias.
-                                               if (!t3lib_div::testInt($idPart)) {
+                                               if (!t3lib_utility_Math::canBeInterpretedAsInteger($idPart)) {
                                                        list($idPartR) = t3lib_BEfunc::getRecordsByField('pages', 'alias', $idPart);
                                                        $idPart = intval($idPartR['uid']);
                                                }
@@ -791,7 +744,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * Cleaning (->db) for standard content elements (ts)
         *
         * @param       string          Content input
-        * @param       boolean         If true, the transformation was "css_transform", otherwise "ts_transform"
+        * @param       boolean         If TRUE, the transformation was "css_transform", otherwise "ts_transform"
         * @return      string          Content output
         * @see TS_transform_rte()
         */
@@ -898,13 +851,17 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                                }
                                        break;
                                        default:
-                                                       // Eliminate true linebreaks inside other headlist tags and after hr tag
+                                                       // Eliminate true linebreaks inside other headlist tags
                                                $blockSplit[$k] = preg_replace('/[' . preg_quote(LF . CR) . ']+/', ' ', $this->transformStyledATags($blockSplit[$k])) . $lastBR;
                                        break;
                                }
                        } else { // NON-block:
                                if (strcmp(trim($blockSplit[$k]), '')) {
-                                       $blockSplit[$k] = $this->divideIntoLines(preg_replace('/[' . preg_quote(LF . CR) . ']+/', ' ', $blockSplit[$k])) . $lastBR;
+                                               // Remove linebreaks following hr tags
+                                       $blockSplit[$k] = preg_replace('/<(hr)(\s[^>\/]*)?[[:space:]]*\/?>[' . preg_quote(LF . CR) . ']+/', '<$1$2 />', $blockSplit[$k]);
+                                               // Replace other linebreaks with space
+                                       $blockSplit[$k] = preg_replace('/[' . preg_quote(LF . CR) . ']+/', ' ', $blockSplit[$k]);
+                                       $blockSplit[$k] = $this->divideIntoLines($blockSplit[$k]) . $lastBR;
                                        $blockSplit[$k] = $this->transformStyledATags($blockSplit[$k]);
                                } else {
                                        unset($blockSplit[$k]);
@@ -927,7 +884,8 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                foreach ($blockSplit as $k => $v) {
                        if ($k % 2) { // If an A-tag was found:
                                $attribArray = $this->get_tag_attributes_classic($this->getFirstTag($v), 1);
-                               if ($attribArray['style']) { // If "style" attribute is set!
+                                       // If "style" attribute is set and rteerror is not set!
+                               if ($attribArray['style'] && !$attribArray['rteerror']) {
                                        $attribArray_copy['style'] = $attribArray['style'];
                                        unset($attribArray['style']);
                                        $bTag = '<span ' . t3lib_div::implodeAttributes($attribArray_copy, 1) . '><a ' . t3lib_div::implodeAttributes($attribArray, 1) . '>';
@@ -944,7 +902,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * Set (->rte) for standard content elements (ts)
         *
         * @param       string          Content input
-        * @param       boolean         If true, the transformation was "css_transform", otherwise "ts_transform"
+        * @param       boolean         If TRUE, the transformation was "css_transform", otherwise "ts_transform"
         * @return      string          Content output
         * @see TS_transform_db()
         */
@@ -986,7 +944,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                        case 'typohead': // Transform typohead into Hx tags.
                                                if (!isset($this->procOptions['typohead']) || $this->procOptions['typohead']) {
                                                        $tC = $this->removeFirstAndLastTag($blockSplit[$k]);
-                                                       $typ = t3lib_div::intInRange($attribArray['type'], 0, 6);
+                                                       $typ = t3lib_utility_Math::forceIntegerInRange($attribArray['type'], 0, 6);
                                                        if (!$typ) {
                                                                $typ = 6;
                                                        }
@@ -1040,10 +998,10 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         *
         * @param       string          Filepath/URL to read
         * @return      string          The content from the resource given as input.
-        * @see t3lib_div::getURL()
+        * @see t3lib_div::getUrl()
         */
-       function getURL($url) {
-               return t3lib_div::getURL($url);
+       function getUrl($url) {
+               return t3lib_div::getUrl($url);
        }
 
        /**
@@ -1210,7 +1168,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         *
         * @param       string          Value to process.
         * @param       integer         Recursion brake. Decremented on each recursion down to zero. Default is 5 (which equals the allowed nesting levels of p/div tags).
-        * @param       boolean         If true, an array with the lines is returned, otherwise a string of the processed input value.
+        * @param       boolean         If TRUE, an array with the lines is returned, otherwise a string of the processed input value.
         * @return      string          Processed input value.
         * @see setDivTags()
         */
@@ -1222,7 +1180,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                }
 
                        // Setting configuration for processing:
-               $allowTagsOutside = t3lib_div::trimExplode(',', strtolower($this->procOptions['allowTagsOutside'] ? $this->procOptions['allowTagsOutside'] : 'img'), 1);
+               $allowTagsOutside = t3lib_div::trimExplode(',', strtolower($this->procOptions['allowTagsOutside'] ? 'hr,' . $this->procOptions['allowTagsOutside'] : 'hr,img'), 1);
                $remapParagraphTag = strtoupper($this->procOptions['remapParagraphTag']);
                $divSplit = $this->splitIntoBlock('div,p', $value, 1); // Setting the third param to 1 will eliminate false end-tags. Maybe this is a good thing to do...?
 
@@ -1234,7 +1192,11 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
 
                        // Returns plainly the value if there was no div/p sections in it
                if (count($divSplit) <= 1 || $count <= 0) {
-                       return $value;
+                               // Wrap hr tags with LF's
+                       $newValue = preg_replace('/<(hr)(\s[^>\/]*)?[[:space:]]*\/?>/i', LF . '<$1$2 />' . LF, $value);
+                       $newValue = preg_replace('/' . preg_quote(LF . LF) . '/i', LF, $newValue);
+                       $newValue = preg_replace('/(^' . preg_quote(LF) . ')|(' . preg_quote(LF) . '$)/i', '', $newValue);
+                       return $newValue;
                }
 
                        // Traverse the splitted sections:
@@ -1283,7 +1245,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                                        if (!count($this->allowedClasses) || in_array($attribs[0]['class'], $this->allowedClasses)) {
                                                                $newAttribs['class'] = $attribs[0]['class'];
                                                        } else {
-                                                               $classes = t3lib_div::trimExplode(' ', $attribs[0]['class'], true);
+                                                               $classes = t3lib_div::trimExplode(' ', $attribs[0]['class'], TRUE);
                                                                $newClasses = array();
                                                                foreach ($classes as $class) {
                                                                        if (in_array($class, $this->allowedClasses)) {
@@ -1323,6 +1285,10 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                        } else { // outside div:
                                        // Remove positions which are outside div/p tags and without content
                                $divSplit[$k] = trim(strip_tags($divSplit[$k], '<' . implode('><', $allowTagsOutside) . '>'));
+                                       // Wrap hr tags with LF's
+                               $divSplit[$k] = preg_replace('/<(hr)(\s[^>\/]*)?[[:space:]]*\/?>/i', LF . '<$1$2 />' . LF, $divSplit[$k]);
+                               $divSplit[$k] = preg_replace('/' . preg_quote(LF . LF) . '/i', LF, $divSplit[$k]);
+                               $divSplit[$k] = preg_replace('/(^' . preg_quote(LF) . ')|(' . preg_quote(LF) . '$)/i', '', $divSplit[$k]);
                                if (!strcmp($divSplit[$k], '')) {
                                        unset($divSplit[$k]);
                                } // Remove part if it's empty
@@ -1364,12 +1330,14 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                }
                        }
 
-                               // Wrapping the line in <$dT> is not already wrapped:
-                       $testStr = strtolower(trim($parts[$k]));
-                       if (substr($testStr, 0, 4) != '<div' || substr($testStr, -6) != '</div>') {
-                               if (substr($testStr, 0, 2) != '<p' || substr($testStr, -4) != '</p>') {
-                                       // Only set p-tags if there is not already div or p tags:
-                                       $parts[$k] = '<' . $dT . '>' . $parts[$k] . '</' . $dT . '>';
+                               // Wrapping the line in <$dT> if not already wrapped and does not contain an hr tag
+                       if (!preg_match('/<(hr)(\s[^>\/]*)?[[:space:]]*\/?>/i', $parts[$k])) {
+                               $testStr = strtolower(trim($parts[$k]));
+                               if (substr($testStr, 0, 4) != '<div' || substr($testStr, -6) != '</div>') {
+                                       if (substr($testStr, 0, 2) != '<p' || substr($testStr, -4) != '</p>') {
+                                               // Only set p-tags if there is not already div or p tags:
+                                               $parts[$k] = '<' . $dT . '>' . $parts[$k] . '</' . $dT . '>';
+                                       }
                                }
                        }
                }
@@ -1589,7 +1557,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * Converting <A>-tags to absolute URLs (+ setting rtekeep attribute)
         *
         * @param       string          Content input
-        * @param       boolean         If true, then the "rtekeep" attribute will not be set.
+        * @param       boolean         If TRUE, then the "rtekeep" attribute will not be set.
         * @return      string          Content output
         */
        function TS_AtagToAbs($value, $dontSetRTEKEEP = FALSE) {