diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2896,6 +2896,7 @@ 'PhabricatorManiphestTaskTestDataGenerator' => 'applications/maniphest/lipsum/PhabricatorManiphestTaskTestDataGenerator.php', 'PhabricatorMarkupCache' => 'applications/cache/storage/PhabricatorMarkupCache.php', 'PhabricatorMarkupEngine' => 'infrastructure/markup/PhabricatorMarkupEngine.php', + 'PhabricatorMarkupEngineTestCase' => 'infrastructure/markup/__tests__/PhabricatorMarkupEngineTestCase.php', 'PhabricatorMarkupInterface' => 'infrastructure/markup/PhabricatorMarkupInterface.php', 'PhabricatorMarkupOneOff' => 'infrastructure/markup/PhabricatorMarkupOneOff.php', 'PhabricatorMarkupPreviewController' => 'infrastructure/markup/PhabricatorMarkupPreviewController.php', @@ -7871,6 +7872,7 @@ 'PhabricatorManiphestTaskTestDataGenerator' => 'PhabricatorTestDataGenerator', 'PhabricatorMarkupCache' => 'PhabricatorCacheDAO', 'PhabricatorMarkupEngine' => 'Phobject', + 'PhabricatorMarkupEngineTestCase' => 'PhabricatorTestCase', 'PhabricatorMarkupOneOff' => array( 'Phobject', 'PhabricatorMarkupInterface', diff --git a/src/applications/project/typeahead/PhabricatorProjectDatasource.php b/src/applications/project/typeahead/PhabricatorProjectDatasource.php --- a/src/applications/project/typeahead/PhabricatorProjectDatasource.php +++ b/src/applications/project/typeahead/PhabricatorProjectDatasource.php @@ -130,7 +130,7 @@ $description = idx($descriptions, $phid); if (strlen($description)) { - $summary = PhabricatorMarkupEngine::summarize($description); + $summary = PhabricatorMarkupEngine::summarizeSentence($description); $proj_result->addAttribute($summary); } } diff --git a/src/infrastructure/markup/PhabricatorMarkupEngine.php b/src/infrastructure/markup/PhabricatorMarkupEngine.php --- a/src/infrastructure/markup/PhabricatorMarkupEngine.php +++ b/src/infrastructure/markup/PhabricatorMarkupEngine.php @@ -607,6 +607,28 @@ return array_values($files); } + public static function summarizeSentence($corpus) { + $corpus = trim($corpus); + $blocks = preg_split('/\n+/', $corpus, 2); + $block = head($blocks); + + $sentences = preg_split( + '/\b([.?!]+)\B/u', + $block, + 2, + PREG_SPLIT_DELIM_CAPTURE); + + if (count($sentences) > 1) { + $result = $sentences[0].$sentences[1]; + } else { + $result = head($sentences); + } + + return id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs(128) + ->truncateString($result); + } + /** * Produce a corpus summary, in a way that shortens the underlying text * without truncating it somewhere awkward. diff --git a/src/infrastructure/markup/__tests__/PhabricatorMarkupEngineTestCase.php b/src/infrastructure/markup/__tests__/PhabricatorMarkupEngineTestCase.php new file mode 100644 --- /dev/null +++ b/src/infrastructure/markup/__tests__/PhabricatorMarkupEngineTestCase.php @@ -0,0 +1,43 @@ +assertSentenceSummary( + 'The quick brown fox. Jumped over the lazy dog.', + 'The quick brown fox.'); + + $this->assertSentenceSummary( + 'Go to www.help.com for details. Good day.', + 'Go to www.help.com for details.'); + + $this->assertSentenceSummary( + 'Coxy lummox gives squid who asks for job pen.', + 'Coxy lummox gives squid who asks for job pen.'); + + $this->assertSentenceSummary( + 'DEPRECATED', + 'DEPRECATED'); + + $this->assertSentenceSummary( + 'Never use this! It is deadly poison.', + 'Never use this!'); + + $this->assertSentenceSummary( + "a short poem\nmeow meow meow\nmeow meow meow\n\n- cat", + 'a short poem'); + + $this->assertSentenceSummary( + 'WOW!! GREAT PROJECT!', + 'WOW!!'); + } + + private function assertSentenceSummary($corpus, $summary) { + $this->assertEqual( + $summary, + PhabricatorMarkupEngine::summarizeSentence($corpus), + pht('Summary of: %s', $corpus)); + } + +}