mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-09-21 00:46:07 +02:00
4a5d9b03f8
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@39001 467b73ca-7a2a-4603-9d3b-597d59a354a9
60 lines
1.5 KiB
PHP
Executable File
60 lines
1.5 KiB
PHP
Executable File
<?php
|
|
|
|
class HTMLText extends Text {
|
|
|
|
/**
|
|
* Create a summary of the content. This will either be the first paragraph, or the first $maxWords
|
|
* words, whichever is shorter
|
|
*/
|
|
public function Summary( $maxWords = 50 ) {
|
|
// split the string into tags and words
|
|
$parts = Convert::xml2array( $this->value );
|
|
|
|
// store any unmatched tags
|
|
$tagStack = array();
|
|
|
|
$pIndex = 0;
|
|
|
|
// find the first paragraph tag
|
|
for( $i = 0; $i < count( $parts ); $i++ )
|
|
if( strpos( $parts[$i], '<p' ) === 0 ) {
|
|
$pIndex = $i;
|
|
break;
|
|
}
|
|
|
|
$summary = '';
|
|
$words = 0;
|
|
|
|
// create the summary, keeping track of opening and closing tags
|
|
while( $words <= $maxWords && $pIndex < count( $parts ) ) {
|
|
if( $parts[$pIndex] == '</p>' ) {
|
|
$summary .= $parts[$pIndex];
|
|
break;
|
|
}
|
|
elseif( preg_match( '/<\/(\w+)>/', $parts[$pIndex], $endTag ) && $endTag[1] == substr( $tagStack[count($tagStack) - 1], 1, strlen( $endTag[1] ) ) ) {
|
|
array_pop( $tagStack );
|
|
$words++;
|
|
$summary .= $parts[$pIndex++];
|
|
} elseif( preg_match( '/^<\w+/', $parts[$pIndex] ) ) {
|
|
array_push( $tagStack, $parts[$pIndex] );
|
|
$words++;
|
|
$summary .= $parts[$pIndex++];
|
|
} else
|
|
$summary .= $parts[$pIndex++] . ' ';
|
|
}
|
|
|
|
|
|
|
|
// make sure that the summary is well formed XHTML by closing tags
|
|
while( $openTag = array_pop( $tagStack ) ) {
|
|
preg_match( '/^<(\w+)\s+/', $openTag, $tagName );
|
|
if(sizeof($tagName) > 0)
|
|
$summary .= "</{$tagName[1]}>";
|
|
}
|
|
|
|
return $summary;
|
|
}
|
|
|
|
}
|
|
|
|
?>
|