Merge branch 'dnadesign-FirstSentancePunctationFix' into 3.1

Closes #3159
This commit is contained in:
Simon Welsh 2014-08-07 21:01:40 +10:00
commit a0211b5f50
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,15 +101,18 @@ 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 "";
$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));
}
}
$sentences = explode( '.', $data );
if( count( $sentences ) )
return $sentences[0] . '.';
else
/* 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);
}

View File

@ -88,6 +88,27 @@ class TextTest extends SapphireTest {
}
}
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()}
*/