diff -u b/core/modules/node/node.tokens.inc b/core/modules/node/node.tokens.inc --- b/core/modules/node/node.tokens.inc +++ b/core/modules/node/node.tokens.inc @@ -130,17 +130,17 @@ $translation = \Drupal::entityManager()->getTranslationFromContext($node, $langcode, ['operation' => 'node_tokens']); if ($translation->hasField('body') && ($items = $translation->get('body')) && !$items->isEmpty()) { $item = $items[0]; - // If the summary was requested and is not empty, use it. - if ($name == 'summary' && !empty($item->summary)) { - $output = $item->summary_processed; + + if ($name === 'body') { + $output = $item->processed; } - // Attempt to provide a suitable version of the 'body' field. else { - $output = $item->processed; - // A summary was requested. - if ($name == 'summary') { - // Generate an optionally trimmed summary of the body field. - + // If the summary was requested and is not empty, use it. + if (!empty($item->summary)) { + $output = $item->summary_processed; + } + // Else generate an optionally trimmed summary of the body field. + else { // Get the 'trim_length' size used for the 'teaser' mode, if // present, or use the default trim_length size. $display_options = entity_get_display('node', $node->getType(), 'teaser')->getComponent('body'); @@ -152,14 +152,10 @@ $length = $settings['trim_length']; } - // Cast to string, because "processed" returns a - // \Drupal\Component\Render\MarkupInterface via check_markup() - // and all unicode utilities expect string input. - $output = text_summary((string) $output, $item->format, $length); + $output = text_summary($item->value, $item->format, $length); } } - // "processed" returns a \Drupal\Component\Render\MarkupInterface - // via check_markup(). + $replacements[$original] = $output; } break; diff -u b/core/modules/node/tests/src/Kernel/NodeTokenReplaceTest.php b/core/modules/node/tests/src/Kernel/NodeTokenReplaceTest.php --- b/core/modules/node/tests/src/Kernel/NodeTokenReplaceTest.php +++ b/core/modules/node/tests/src/Kernel/NodeTokenReplaceTest.php @@ -19,7 +19,7 @@ class NodeTokenReplaceTest extends TokenReplaceKernelTestBase { /** - * User account used as node author. + * User account used as a node author. * * @var \Drupal\user\Entity\User */ @@ -120,18 +120,19 @@ * Tests the [node:summary] token. */ public function testNodeSummaryTokenReplacement() { - // Length of this text is 828 characters and it's longer than a default + // Length of this text is 843 characters and it's longer than a default // trim length setting (600). - $text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi diam dui, finibus et purus ac, elementum pretium augue. ' - . 'Fusce lacus nisl, feugiat sit amet blandit sed, mattis eu ligula. Duis laoreet dui non felis maximus fringilla. ' - . 'Maecenas tempor magna id urna dapibus, in elementum mauris consequat. ' - . 'Praesent in urna non felis fringilla ullamcorper interdum eu risus. ' - . 'Vestibulum id erat ultrices, varius est sed, dignissim dui. Vestibulum a dapibus nisl. ' - . 'Maecenas vestibulum nibh a aliquet mollis. Donec ac justo eget justo interdum faucibus. ' - . 'Aenean sit amet finibus turpis. Donec viverra vel eros eget varius. Praesent rutrum est diam. ' - . 'Mauris at odio scelerisque, mattis mi et, tempor eros. ' - . 'Vestibulum sollicitudin sem quis diam sollicitudin posuere. Nam finibus vestibulum suscipit. ' - . 'Fusce tempor tincidunt lorem vitae mollis.'; + $text = ' dolor sit amet, consectetur adipiscing elit. ' + . 'Morbi diam dui, finibus et purus ac, elementum pretium augue. ' + . 'Fusce lacus nisl, feugiat sit amet blandit sed, mattis eu ligula. Duis laoreet dui non felis maximus fringilla. ' + . 'Maecenas tempor magna id urna dapibus, in elementum mauris consequat. ' + . 'Praesent in urna non felis fringilla ullamcorper interdum eu risus. ' + . 'Vestibulum id erat ultrices, varius est sed, dignissim dui. Vestibulum a dapibus nisl. ' + . 'Maecenas vestibulum nibh a aliquet mollis. Donec ac justo eget justo interdum faucibus. ' + . 'Aenean sit amet finibus turpis. Donec viverra vel eros eget varius. Praesent rutrum est diam. ' + . 'Mauris at odio scelerisque, mattis mi et, tempor eros. ' + . 'Vestibulum sollicitudin sem quis diam sollicitudin posuere. Nam finibus vestibulum suscipit. ' + . 'Fusce tempor tincidunt lorem vitae mollis.'; // Create a node. /* @var $node \Drupal\node\NodeInterface */ $node = Node::create([ @@ -162,21 +163,22 @@ // formatter of teaser view mode. $view_display->setComponent('body', [ 'type' => 'text_summary_or_trimmed', - 'settings' => ['trim_length' => 130], + 'settings' => ['trim_length' => 160], ]); $view_display->save(); - $expected_trimmed_to_130 = Html::escape('
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi diam dui, finibus et purus ac, elementum pretium augue.'); - $this->assertNodeSummaryTokenReplacement($node, $expected_trimmed_to_130); + $expected_trimmed_to_160 = Html::escape(' dolor sit amet, consectetur adipiscing elit. ' + . 'Morbi diam dui, finibus et purus ac, elementum pretium augue.'); + $this->assertNodeSummaryTokenReplacement($node, $expected_trimmed_to_160); // Token [node:summary] should use trim settings of "Trimmed" // formatter of teaser view mode. $view_display->setComponent('body', [ 'type' => 'text_trimmed', - 'settings' => ['trim_length' => 70], + 'settings' => ['trim_length' => 80], ]); $view_display->save(); - $expected_trimmed_to_70 = Html::escape('
Lorem ipsum dolor sit amet, consectetur adipiscing elit.'); - $this->assertNodeSummaryTokenReplacement($node, $expected_trimmed_to_70); + $expected_trimmed_to_80 = Html::escape(' dolor sit amet, consectetur adipiscing elit.'); + $this->assertNodeSummaryTokenReplacement($node, $expected_trimmed_to_80); // Token [node:summary] should not pickup trim length setting of any other // formatter rather than "Summary or trimmed" or "Trimmed", even if setting @@ -187,13 +189,13 @@ 'settings' => ['trim_length' => 42], ]); $view_display->save(); - $expected_trimmed_to_600 = Html::escape('
Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' - . 'Morbi diam dui, finibus et purus ac, elementum pretium augue. Fusce lacus nisl, feugiat sit amet blandit sed, mattis eu ligula. ' - . 'Duis laoreet dui non felis maximus fringilla. Maecenas tempor magna id urna dapibus, in elementum mauris consequat. ' - . 'Praesent in urna non felis fringilla ullamcorper interdum eu risus. ' - . 'Vestibulum id erat ultrices, varius est sed, dignissim dui. Vestibulum a dapibus nisl. ' - . 'Maecenas vestibulum nibh a aliquet mollis. Donec ac justo eget justo interdum faucibus. ' - . 'Aenean sit amet finibus turpis.'); + $expected_trimmed_to_600 = Html::escape(' dolor sit amet, consectetur adipiscing elit. ' + . 'Morbi diam dui, finibus et purus ac, elementum pretium augue. Fusce lacus nisl, feugiat sit amet blandit sed, mattis eu ligula. ' + . 'Duis laoreet dui non felis maximus fringilla. Maecenas tempor magna id urna dapibus, in elementum mauris consequat. ' + . 'Praesent in urna non felis fringilla ullamcorper interdum eu risus. ' + . 'Vestibulum id erat ultrices, varius est sed, dignissim dui. Vestibulum a dapibus nisl. ' + . 'Maecenas vestibulum nibh a aliquet mollis. Donec ac justo eget justo interdum faucibus. ' + . 'Aenean sit amet finibus turpis.'); $this->assertNodeSummaryTokenReplacement($node, $expected_trimmed_to_600); // Token [node:summary] should not pickup trim length setting if teaser