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 Simon Welsh
parent b9d306b07d
commit 0a36951ab1
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 */ /* 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); $words = preg_split('/\s+/', $paragraph);
foreach ($words as $i => $word) { 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)); 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. * Caution: Not XML/HTML-safe - does not respect closing tags.
*/ */
public function FirstSentence() { public function FirstSentence() {
$data = Convert::xml2raw( $this->value ); $paragraph = Convert::xml2raw( $this->value );
if( !$data ) return ""; if( !$paragraph ) return "";
$words = preg_split('/\s+/', $paragraph);
$sentences = explode( '.', $data ); foreach ($words as $i => $word) {
if (preg_match('/(!|\?|\.)$/', $word) && !preg_match('/(Dr|Mr|Mrs|Ms|Miss|Sr|Jr|No)\.$/i', $word)) {
if( count( $sentences ) ) return implode(' ', array_slice($words, 0, $i+1));
return $sentences[0] . '.'; }
else }
return $this->Summary(20);
} /* 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. * 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)); $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()} * Test {@link Text->BigSummary()}
*/ */