node_summary_token_from_p.module in Node Summary Token From P Tags 1.x
File
node_summary_token_from_p.module
View source
<?php
use Drupal\Core\Cache\Cache;
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) {
$cache = Drupal::cache();
$cid = 'node_summary_token_from_p:' . $node
->id();
$cached = $cache
->get($cid);
if ($cached !== FALSE) {
return $cached->data;
}
$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;
}
}
$summary = trim(implode(' ', $sentences));
$cache
->set($cid, $summary, Cache::PERMANENT, [
'node:' . $node
->id(),
]);
return $summary;
}