diff --git a/entity_print.services.yml b/entity_print.services.yml index faf0e65..cacc1b5 100644 --- a/entity_print.services.yml +++ b/entity_print.services.yml @@ -18,7 +18,7 @@ services: entity_print.renderer.content: class: Drupal\entity_print\Renderer\ContentEntityRenderer - arguments: ['@renderer', '@entity_print.asset_renderer', '@event_dispatcher', '@entity_type.manager'] + arguments: ['@renderer', '@entity_print.asset_renderer', '@entity_print.filename_generator', '@event_dispatcher', '@entity_type.manager'] entity_print.post_render_subscriber: class: Drupal\entity_print\EventSubscriber\PostRenderSubscriber @@ -34,6 +34,10 @@ services: class: Drupal\entity_print\Asset\AssetRenderer arguments: ['@asset.resolver', '@asset.css.collection_renderer', '@entity_print.asset_collector'] + entity_print.filename_generator: + class: Drupal\entity_print\FilenameGenerator + arguments: ['@transliteration'] + entity_print.print_engine_exception_subscriber: class: Drupal\entity_print\EventSubscriber\PrintEngineExceptionSubscriber arguments: ['@current_route_match', '@entity_type.manager'] diff --git a/modules/entity_print_views/entity_print_views.services.yml b/modules/entity_print_views/entity_print_views.services.yml index 6e36d64..75cc67e 100644 --- a/modules/entity_print_views/entity_print_views.services.yml +++ b/modules/entity_print_views/entity_print_views.services.yml @@ -1,4 +1,4 @@ services: entity_print.renderer.view: class: Drupal\entity_print_views\Renderer\ViewRenderer - arguments: ['@renderer', '@entity_print.asset_renderer', '@event_dispatcher'] + arguments: ['@renderer', '@entity_print.asset_renderer', '@entity_print.filename_generator', '@event_dispatcher'] diff --git a/modules/entity_print_views/src/Renderer/ViewRenderer.php b/modules/entity_print_views/src/Renderer/ViewRenderer.php index 6a2c953..4da4324 100644 --- a/modules/entity_print_views/src/Renderer/ViewRenderer.php +++ b/modules/entity_print_views/src/Renderer/ViewRenderer.php @@ -45,17 +45,13 @@ class ViewRenderer extends RendererBase { } /** - * Gets a label for the view object. - * - * @param \Drupal\Core\Entity\EntityInterface $view - * The view object we want to get a label for. - * - * @return false|string - * The view title. + * {@inheritdoc} */ - protected function getLabel(EntityInterface $view) { - /** @var \Drupal\views\ViewEntityInterface $view */ - return $view->getExecutable()->getTitle(); + public function getFilename(array $entities) { + return $this->filenameGenerator->generateFilename($entities, function ($view) { + /** @var \Drupal\views\ViewEntityInterface $view */ + return $view->getExecutable()->getTitle(); + }); } /** diff --git a/modules/entity_print_views/tests/src/Kernel/ViewsRendererTest.php b/modules/entity_print_views/tests/src/Kernel/ViewsRendererTest.php index 980cfb2..79edd77 100644 --- a/modules/entity_print_views/tests/src/Kernel/ViewsRendererTest.php +++ b/modules/entity_print_views/tests/src/Kernel/ViewsRendererTest.php @@ -2,7 +2,7 @@ namespace Drupal\Tests\entity_print_views\Kernel; -use Drupal\entity_print\Renderer\RendererBase; +use Drupal\entity_print\FilenameGeneratorInterface; use Drupal\KernelTests\KernelTestBase; use Drupal\views\Views; @@ -52,7 +52,7 @@ class ViewsRendererTest extends KernelTestBase { $this->assertSame('My Test view block', $renderer->getFilename([$view->storage])); $view->setTitle(' '); - $this->assertSame(RendererBase::DEFAULT_FILENAME, $renderer->getFilename([$view->storage])); + $this->assertSame(FilenameGeneratorInterface::DEFAULT_FILENAME, $renderer->getFilename([$view->storage])); } } diff --git a/src/FilenameGenerator.php b/src/FilenameGenerator.php new file mode 100644 index 0000000..258cf7e --- /dev/null +++ b/src/FilenameGenerator.php @@ -0,0 +1,60 @@ +transliteration = $transliteration; + } + + /** + * {@inheritdoc} + */ + public function generateFilename(array $entities, callable $entity_label_callback = NULL) { + $filenames = []; + /** @var \Drupal\Core\Entity\EntityInterface $entity */ + foreach ($entities as $entity) { + if ($label = trim($this->sanitizeFilename($entity_label_callback ? $entity_label_callback($entity) : $entity->label(), $entity->language()->getId()))) { + $filenames[] = $label; + } + } + + return $filenames ? implode('-', $filenames) : static::DEFAULT_FILENAME; + } + + /** + * Gets a safe filename. + * + * @param string $filename + * The un-processed filename. + * @param string $langcode + * The language of the filename. + * + * @return string + * The filename stripped to only safe characters. + */ + protected function sanitizeFilename($filename, $langcode) { + $transformed = $this->transliteration->transliterate($filename, $langcode); + return preg_replace("/[^A-Za-z0-9 ]/", '', $transformed); + } + +} diff --git a/src/FilenameGeneratorInterface.php b/src/FilenameGeneratorInterface.php new file mode 100644 index 0000000..bffe8eb --- /dev/null +++ b/src/FilenameGeneratorInterface.php @@ -0,0 +1,30 @@ +entityTypeManager = $entity_type_manager; } diff --git a/src/Renderer/RendererBase.php b/src/Renderer/RendererBase.php index a5f07fa..0c36f06 100644 --- a/src/Renderer/RendererBase.php +++ b/src/Renderer/RendererBase.php @@ -7,6 +7,7 @@ use Drupal\Core\Render\RenderContext; use Drupal\entity_print\Asset\AssetRendererInterface; use Drupal\entity_print\Event\PrintEvents; use Drupal\entity_print\Event\PrintHtmlAlterEvent; +use Drupal\entity_print\FilenameGeneratorInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Drupal\Core\Render\RendererInterface as CoreRendererInterface; @@ -16,13 +17,6 @@ use Drupal\Core\Render\RendererInterface as CoreRendererInterface; abstract class RendererBase implements RendererInterface { /** - * The filename used when we're unable to calculate a filename. - * - * @var string - */ - const DEFAULT_FILENAME = 'document'; - - /** * The renderer for renderable arrays. * * @var \Drupal\Core\Render\RendererInterface @@ -37,15 +31,23 @@ abstract class RendererBase implements RendererInterface { protected $assetRenderer; /** + * Generate filename's for a printed document. + * + * @var \Drupal\entity_print\FilenameGeneratorInterface + */ + protected $filenameGenerator; + + /** * The event dispatcher. * * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface */ protected $dispatcher; - public function __construct(CoreRendererInterface $renderer, AssetRendererInterface $asset_renderer, EventDispatcherInterface $event_dispatcher) { + public function __construct(CoreRendererInterface $renderer, AssetRendererInterface $asset_renderer, FilenameGeneratorInterface $filename_generator, EventDispatcherInterface $event_dispatcher) { $this->renderer = $renderer; $this->assetRenderer = $asset_renderer; + $this->filenameGenerator = $filename_generator; $this->dispatcher = $event_dispatcher; } @@ -69,40 +71,10 @@ abstract class RendererBase implements RendererInterface { } /** - * Gets a safe filename. - * - * @param string $filename - * The un-processed filename. - * - * @return string - * The filename stripped to only safe characters. - */ - protected function sanitizeFilename($filename) { - return preg_replace("/[^A-Za-z0-9 ]/", '', $filename); - } - - /** * {@inheritdoc} */ public function getFilename(array $entities) { - $filenames = []; - foreach ($entities as $entity) { - if ($label = trim($this->sanitizeFilename($this->getLabel($entity)))) { - $filenames[] = $label; - } - } - return $filenames ? implode('-', $filenames) : static::DEFAULT_FILENAME; + return $this->filenameGenerator->generateFilename($entities); } - /** - * Gets the entity label. - * - * @param \Drupal\Core\Entity\EntityInterface $entity - * The entity we want to generate a label for. - * - * @return string - * The label for this entity. - */ - abstract protected function getLabel(EntityInterface $entity); - } diff --git a/src/Renderer/RendererInterface.php b/src/Renderer/RendererInterface.php index edd7f7a..c8b6936 100644 --- a/src/Renderer/RendererInterface.php +++ b/src/Renderer/RendererInterface.php @@ -35,6 +35,7 @@ interface RendererInterface { * * @param \Drupal\Core\Entity\EntityInterface[] $entities * The entities for which to generate the filename from. + * * @return string * The generate file name for this entity. */ diff --git a/tests/src/Kernel/ContentRendererTest.php b/tests/src/Kernel/ContentRendererTest.php index 8301004..a6ae5d4 100644 --- a/tests/src/Kernel/ContentRendererTest.php +++ b/tests/src/Kernel/ContentRendererTest.php @@ -2,7 +2,7 @@ namespace Drupal\Tests\entity_print\Kernel; -use Drupal\entity_print\Renderer\RendererBase; +use Drupal\entity_print\FilenameGeneratorInterface; use Drupal\KernelTests\KernelTestBase; use Drupal\simpletest\NodeCreationTrait; @@ -55,8 +55,9 @@ class ContentRendererTest extends KernelTestBase { ['Random Node Title', 'Random Node Title'], ['Title -=with special chars&*#', 'Title with special chars'], ['Title 5 with Nums 2', 'Title 5 with Nums 2'], + ['Dußeldorf will be transliterated', 'Dusseldorf will be transliterated'], // Ensure invalid filenames get the default. - [' ', RendererBase::DEFAULT_FILENAME], + [' ', FilenameGeneratorInterface::DEFAULT_FILENAME], ]; }