mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-09-07 02:01:24 +02:00
60 lines
1.5 KiB
PHP
60 lines
1.5 KiB
PHP
|
<?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;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
?>
|