adding exclamation mark and question mark to delimiters, made text work the same as HTML Text

This commit is contained in:
John Milmine 2014-05-26 12:57:12 +12:00 committed by Damian Mooyman
parent 3e0d2cb646
commit 7d97df9db8
3 changed files with 37 additions and 13 deletions

View File

@ -165,7 +165,7 @@ class HTMLText extends Text {
/* Then look for the first sentence ending. We could probably use a nice regex, but for now this will do */
$words = preg_split('/\s+/', $paragraph);
foreach ($words as $i => $word) {
if (preg_match('/\.$/', $word) && !preg_match('/(Dr|Mr|Mrs|Ms|Miss|Sr|Jr|No)\.$/i', $word)) {
if (preg_match('/(!|\?|\.)$/', $word) && !preg_match('/(Dr|Mr|Mrs|Ms|Miss|Sr|Jr|No)\.$/i', $word)) {
return implode(' ', array_slice($words, 0, $i+1));
}
}

View File

@ -101,17 +101,20 @@ class Text extends StringField {
* Caution: Not XML/HTML-safe - does not respect closing tags.
*/
public function FirstSentence() {
$data = Convert::xml2raw( $this->value );
if( !$data ) return "";
$sentences = explode( '.', $data );
if( count( $sentences ) )
return $sentences[0] . '.';
else
return $this->Summary(20);
}
$paragraph = Convert::xml2raw( $this->value );
if( !$paragraph ) return "";
$words = preg_split('/\s+/', $paragraph);
foreach ($words as $i => $word) {
if (preg_match('/(!|\?|\.)$/', $word) && !preg_match('/(Dr|Mr|Mrs|Ms|Miss|Sr|Jr|No)\.$/i', $word)) {
return implode(' ', array_slice($words, 0, $i+1));
}
}
/* If we didn't find a sentence ending, use the summary. We re-call rather than using paragraph so that
* Summary will limit the result this time */
return $this->Summary(20);
}
/**
* Caution: Not XML/HTML-safe - does not respect closing tags.

View File

@ -87,7 +87,28 @@ class TextTest extends SapphireTest {
$this->assertEquals($expectedValue, $textObj->LimitSentences(2));
}
}
public function testFirstSentance() {
$cases = array(
'' => '',
'First sentence.' => 'First sentence.',
'First sentence. Second sentence' => 'First sentence.',
'First sentence? Second sentence' => 'First sentence?',
'First sentence! Second sentence' => 'First sentence!',
'<p>First sentence.</p>' => 'First sentence.',
'<p>First sentence. Second sentence. Third sentence</p>' => 'First sentence.',
'<p>First sentence. <em>Second sentence</em>. Third sentence</p>' => 'First sentence.',
'<p>First sentence. <em class="dummyClass">Second sentence</em>. Third sentence</p>'
=> 'First sentence.'
);
foreach($cases as $originalValue => $expectedValue) {
$textObj = new Text('Test');
$textObj->setValue($originalValue);
$this->assertEquals($expectedValue, $textObj->FirstSentence());
}
}
/**
* Test {@link Text->BigSummary()}
*/