Index: t3lib/class.t3lib_parsehtml_proc.php =================================================================== --- t3lib/class.t3lib_parsehtml_proc.php (révision 9755) +++ t3lib/class.t3lib_parsehtml_proc.php (copie de travail) @@ -102,7 +102,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. @@ -914,13 +914,17 @@ } 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]); } @@ -1228,7 +1232,7 @@ if ($this->procOptions['internalizeFontTags']) {$value = $this->internalizeFontTags($value);} // 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...? @@ -1240,7 +1244,11 @@ // 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: @@ -1323,6 +1331,10 @@ } 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 } } @@ -1359,15 +1371,16 @@ $parts[$k]=$this->HTMLcleaner($parts[$k],$keepTags,$kUknown,$hSC); if ($convNBSP) $parts[$k]=str_replace('&nbsp;',' ',$parts[$k]); } - - // Wrapping the line in <$dT> is not already wrapped: - $testStr = strtolower(trim($parts[$k])); - if (substr($testStr,0,4)!=' 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) != ''.$parts[$k].''; - } - } + $parts[$k] = '<' . $dT . '>' . $parts[$k] . ''; + } + } + } } // Implode result: Index: typo3/sysext/cms/tslib/class.tslib_content.php =================================================================== --- typo3/sysext/cms/tslib/class.tslib_content.php (révision 9755) +++ typo3/sysext/cms/tslib/class.tslib_content.php (copie de travail) @@ -5089,7 +5089,7 @@ $contentAccumP++; $treated=1; // in-out-tag: img and other empty tags - if ($tag[0]=='img' || substr($tag[1],-3,2)==' /') { + if (preg_match('/^(area|base|br|col|hr|img|input|meta|param)$/i', $tag[0])) { $tag['out']=1; } } @@ -5183,17 +5183,28 @@ foreach ($lParts as $k => $l) { $sameBeginEnd=0; + $emptyTag = 0; $l=trim($l); $attrib=array(); $nWrapped=0; - $byPass=0; if (substr($l,0,1)=='<' && substr($l,-1)=='>') { $fwParts = explode('>',substr($l,1),2); - $backParts = t3lib_div::revExplode('<', substr($fwParts[1],0,-1), 2); - $attrib = t3lib_div::get_tag_attributes('<'.$fwParts[0].'>'); - list($tagName) = explode(' ',$fwParts[0]); - $str_content = $backParts[0]; - $sameBeginEnd = (substr(strtolower($backParts[1]),1,strlen($tagName))==strtolower($tagName)); + list($tagName, $tagParams) = explode(' ',$fwParts[0], 2); + if (!$fwParts[1]) { + if (substr($tagName, -1) == '/') { + $tagName = substr($tagName, 0, -1); + } + if (substr($fwParts[0], -1) == '/') { + $sameBeginEnd = 1; + $emptyTag = 1; + $attrib = t3lib_div::get_tag_attributes('<'.substr($fwParts[0], 0, -1).'>'); + } + } else { + $backParts = t3lib_div::revExplode('<', substr($fwParts[1],0,-1), 2); + $attrib = t3lib_div::get_tag_attributes('<'.$fwParts[0].'>'); + $str_content = $backParts[0]; + $sameBeginEnd = (substr(strtolower($backParts[1]),1,strlen($tagName))==strtolower($tagName)); + } } if ($sameBeginEnd && in_array(strtolower($tagName),$encapTags)) { @@ -5230,10 +5241,14 @@ if (!$attrib['align'] && $defaultAlign) $attrib['align']=$defaultAlign; $params = t3lib_div::implodeAttributes($attrib,1); - if ($conf['removeWrapping']) { + if ($conf['removeWrapping'] && !($emptyTag && $conf['removeWrapping.']['keepSingleTag'])) { $str_content=$str_content; } else { - $str_content='<'.strtolower($uTagName).(trim($params)?' '.trim($params):'').'>'.$str_content.''; + if ($emptyTag) { + $str_content='<'.strtolower($uTagName).(trim($params)?' '.trim($params):'').' />'; + } else { + $str_content='<'.strtolower($uTagName).(trim($params)?' '.trim($params):'').'>'.$str_content.''; + } } } Index: typo3/sysext/css_styled_content/static/setup.txt =================================================================== --- typo3/sysext/css_styled_content/static/setup.txt (révision 9755) +++ typo3/sysext/css_styled_content/static/setup.txt (copie de travail) @@ -123,7 +123,7 @@ div.callRecursive = 1 } nonTypoTagStdWrap.encapsLines { - encapsTagList = p,pre,h1,h2,h3,h4,h5,h6 + encapsTagList = p,pre,h1,h2,h3,h4,h5,h6,hr remapTag.DIV = P nonWrappedTag = P innerStdWrap_all.ifBlank =