node_summary_token_from_p.module in Node Summary Token From P Tags 1.0.x
File
node_summary_token_from_p.module
View source
<?php
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\node\NodeInterface;
use Drupal\Component\Utility\Html;
use Drupal\Core\Language\LanguageInterface;
function node_summary_token_from_p_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
$replacements = [];
if (isset($options['langcode'])) {
$langcode = $options['langcode'];
}
else {
$langcode = LanguageInterface::LANGCODE_DEFAULT;
}
if ($type == 'node' && !empty($data['node'])) {
$node = $data['node'];
foreach ($tokens as $name => $original) {
switch ($name) {
case 'summary':
$translation = \Drupal::service('entity.repository')
->getTranslationFromContext($node, $langcode, [
'operation' => 'node_tokens',
]);
if (!$translation
->hasField('body') || !($items = $translation
->get('body')) || $items
->isEmpty()) {
$replacements[$original] = node_summary_token_from_p_generate_for_node($node);
}
break;
}
}
}
return $replacements;
}
function node_summary_token_from_p_generate_for_node(NodeInterface $node) {
$view_builder = Drupal::entityTypeManager()
->getViewBuilder('node');
$renderer = Drupal::service('renderer');
$view = $view_builder
->view($node, 'full');
$rendered = $renderer
->renderPlain($view);
$document = Html::load($rendered);
$sentences = [];
foreach ($document
->getElementsByTagName('p') as $paragraph) {
$text = strip_tags($paragraph
->C14n());
$paragraph_sentences = preg_split('/(?<=[.?!;:])\\s+/', $text);
foreach ($paragraph_sentences as $paragraph_sentence) {
$paragraph_sentence = trim($paragraph_sentence);
if (empty($paragraph_sentence)) {
continue;
}
$sentences[] = $paragraph_sentence;
if (count($sentences) >= 3) {
break;
}
}
if (count($sentences) >= 3) {
break;
}
}
return trim(implode(' ', $sentences));
}