Removing inline comments

git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@6712 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
joelmoss 2008-04-23 13:58:26 +00:00
parent 8fa2d1cf9c
commit a0af56f923
2 changed files with 0 additions and 24 deletions

View file

@ -160,67 +160,50 @@ class TextHelper extends AppHelper {
extract($ending); extract($ending);
} }
if ($considerHtml) { if ($considerHtml) {
// if the plain text is shorter than the maximum length, return the whole text
if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) { if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
return $text; return $text;
} }
// splits all html-tags to scanable lines
preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER); preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);
$total_length = strlen($ending); $total_length = strlen($ending);
$open_tags = array(); $open_tags = array();
$truncate = ''; $truncate = '';
foreach ($lines as $line_matchings) { foreach ($lines as $line_matchings) {
// if there is any html-tag in this line, handle it and add it (uncounted) to the output
if (!empty($line_matchings[1])) { if (!empty($line_matchings[1])) {
// if it's an "empty element" with or without xhtml-conform closing slash (f.e. <br/>)
if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) { if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
// do nothing
// if tag is a closing tag (f.e. </b>)
} elseif (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) { } elseif (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
// delete tag from $open_tags list
$pos = array_search($tag_matchings[1], $open_tags); $pos = array_search($tag_matchings[1], $open_tags);
if ($pos !== false) { if ($pos !== false) {
unset($open_tags[$pos]); unset($open_tags[$pos]);
} }
// if tag is an opening tag (f.e. <b>)
} elseif (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) { } elseif (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) {
// add tag to the beginning of $open_tags list
array_unshift($open_tags, strtolower($tag_matchings[1])); array_unshift($open_tags, strtolower($tag_matchings[1]));
} }
// add html-tag to $truncate'd text
$truncate .= $line_matchings[1]; $truncate .= $line_matchings[1];
} }
// calculate the length of the plain text part of the line; handle entities as one character
$content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $line_matchings[2])); $content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));
if ($total_length+$content_length > $length) { if ($total_length+$content_length > $length) {
// the number of characters which are left
$left = $length - $total_length; $left = $length - $total_length;
$entities_length = 0; $entities_length = 0;
// search for html entities
if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) { if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
// calculate the real length of all entities in the legal range
foreach ($entities[0] as $entity) { foreach ($entities[0] as $entity) {
if ($entity[1]+1-$entities_length <= $left) { if ($entity[1]+1-$entities_length <= $left) {
$left--; $left--;
$entities_length += strlen($entity[0]); $entities_length += strlen($entity[0]);
} else { } else {
// no more characters left
break; break;
} }
} }
} }
$truncate .= substr($line_matchings[2], 0, $left+$entities_length); $truncate .= substr($line_matchings[2], 0, $left+$entities_length);
// maximum lenght is reached, so get off the loop
break; break;
} else { } else {
$truncate .= $line_matchings[2]; $truncate .= $line_matchings[2];
$total_length += $content_length; $total_length += $content_length;
} }
// if the maximum length is reached, get off the loop
if ($total_length >= $length) { if ($total_length >= $length) {
break; break;
} }
@ -233,21 +216,16 @@ class TextHelper extends AppHelper {
} }
} }
// if the words shouldn't be cut in the middle...
if (!$exact) { if (!$exact) {
// ...search the last occurance of a space...
$spacepos = strrpos($truncate, ' '); $spacepos = strrpos($truncate, ' ');
if (isset($spacepos)) { if (isset($spacepos)) {
// ...and cut the text in this position
$truncate = substr($truncate, 0, $spacepos); $truncate = substr($truncate, 0, $spacepos);
} }
} }
// add the defined ending to the text
$truncate .= $ending; $truncate .= $ending;
if ($considerHtml) { if ($considerHtml) {
// close all unclosed html-tags
foreach ($open_tags as $tag) { foreach ($open_tags as $tag) {
$truncate .= '</' . $tag . '>'; $truncate .= '</' . $tag . '>';
} }

View file

@ -47,7 +47,6 @@ class TextTest extends UnitTestCase {
$text4 = '<img src="mypic.jpg"> This image tag is not XHTML conform!<br><hr/><b>But the following image tag should be conform <img src="mypic.jpg" alt="Me, myself and I" /></b><br />Great, or?'; $text4 = '<img src="mypic.jpg"> This image tag is not XHTML conform!<br><hr/><b>But the following image tag should be conform <img src="mypic.jpg" alt="Me, myself and I" /></b><br />Great, or?';
$text5 = '0<b>1<i>2<span class="myclass">3</span>4<u>5</u>6</i>7</b>8<b>9</b>0'; $text5 = '0<b>1<i>2<span class="myclass">3</span>4<u>5</u>6</i>7</b>8<b>9</b>0';
// normal truncate tests
$this->assertIdentical($this->Text->truncate($text1, 15), 'The quick br...'); $this->assertIdentical($this->Text->truncate($text1, 15), 'The quick br...');
$this->assertIdentical($this->Text->truncate($text1, 15, '...', false), 'The quick...'); $this->assertIdentical($this->Text->truncate($text1, 15, '...', false), 'The quick...');
$this->assertIdentical($this->Text->truncate($text1, 100), 'The quick brown fox jumps over the lazy dog'); $this->assertIdentical($this->Text->truncate($text1, 100), 'The quick brown fox jumps over the lazy dog');
@ -57,7 +56,6 @@ class TextTest extends UnitTestCase {
$this->assertIdentical($this->Text->truncate($text4, 15), '<img src="my...'); $this->assertIdentical($this->Text->truncate($text4, 15), '<img src="my...');
$this->assertIdentical($this->Text->truncate($text5, 6, ''), '0<b>1<'); $this->assertIdentical($this->Text->truncate($text5, 6, ''), '0<b>1<');
// html considering tests
$this->assertIdentical($this->Text->truncate($text1, 15, array('ending' => '...', 'exact' => true, 'considerHtml' => true)), 'The quick br...'); $this->assertIdentical($this->Text->truncate($text1, 15, array('ending' => '...', 'exact' => true, 'considerHtml' => true)), 'The quick br...');
$this->assertIdentical($this->Text->truncate($text1, 15, '...', true, true), 'The quick br...'); $this->assertIdentical($this->Text->truncate($text1, 15, '...', true, true), 'The quick br...');
$this->assertIdentical($this->Text->truncate($text1, 15, '...', false, true), 'The quick...'); $this->assertIdentical($this->Text->truncate($text1, 15, '...', false, true), 'The quick...');