entity_to_text-1.0.x-dev/src/Extractor/NodeToText.php
src/Extractor/NodeToText.php
<?php
namespace Drupal\entity_to_text\Extractor;
use Drupal\Core\Field\FieldTypePluginManagerInterface;
use Drupal\Core\Render\Markup;
use Drupal\Core\Render\RendererInterface;
use Drupal\entity_to_text\HtmlPurifier;
use Drupal\node\NodeInterface;
/**
* Provide Capabilities to transform a Node content to plain-text strings.
*/
class NodeToText {
/**
* The HTML Purifier service.
*
* @var \Drupal\entity_to_text\HtmlPurifier
*/
protected $htmlPurifier;
/**
* The renderer service.
*
* @var \Drupal\Core\Render\RendererInterface
*/
protected $renderer;
/**
* The field type manager to define field.
*
* @var \Drupal\Core\Field\FieldTypePluginManagerInterface
*/
protected $fieldTypeManager;
/**
* Construct a new NodeToText object.
*/
public function __construct(HtmlPurifier $html_purifier, RendererInterface $renderer, FieldTypePluginManagerInterface $field_type_manager) {
$this->htmlPurifier = $html_purifier;
$this->renderer = $renderer;
$this->fieldTypeManager = $field_type_manager;
}
/**
* Transform a Field into plain text value.
*
* @param string $field_name
* The field name to fetch from the given node.
* @param \Drupal\node\NodeInterface $node
* The node with the according field to transform.
*
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*
* @return string
* The transformed field into a plain text value.
*/
public function fromFieldtoText(string $field_name, NodeInterface $node): string {
$field_definition = $node->getFieldDefinition($field_name);
$field_type_definition = $field_definition ? $this->fieldTypeManager->getDefinition($field_definition->getType()) : NULL;
if (!$field_type_definition) {
return '';
}
$display_options = ['label' => 'hidden'];
$display_options['type'] = $field_type_definition['default_formatter'];
$field = $node->get($field_name);
if ($field->isEmpty()) {
return '';
}
$view = $field->view($display_options);
/** @var \Drupal\Core\Render\Markup|string $markup */
$markup = $this->renderer->renderRoot($view);
$purifier = $this->htmlPurifier->init();
if ($markup instanceof Markup) {
$clean_html = $purifier->purify($markup->__toString());
}
else {
$clean_html = $purifier->purify($markup);
}
return trim($clean_html);
}
}
