From 3056a6b49d8943524d62e96a1f4b5c420c0371a6 Mon Sep 17 00:00:00 2001 From: git <git@3552753.no-reply.drupal.org> Date: Sat, 18 Nov 2017 13:38:22 -0600 Subject: [PATCH] Issue #2923891 by JorgeLM, hl17, heddn, edysmp: Transliterate file names --- .../migrate/process/Transliteration.php | 84 +++++++++++++++++++ .../src/Unit/process/TransliterationTest.php | 51 +++++++++++ 2 files changed, 135 insertions(+) create mode 100644 src/Plugin/migrate/process/Transliteration.php create mode 100644 tests/src/Unit/process/TransliterationTest.php diff --git a/src/Plugin/migrate/process/Transliteration.php b/src/Plugin/migrate/process/Transliteration.php new file mode 100644 index 00000000..0ce2f6e6 --- /dev/null +++ b/src/Plugin/migrate/process/Transliteration.php @@ -0,0 +1,84 @@ +<?php + +namespace Drupal\migrate_plus\Plugin\migrate\process; + +use Drupal\Component\Transliteration\TransliterationInterface; +use Drupal\Core\Language\LanguageInterface; +use Drupal\Core\Plugin\ContainerFactoryPluginInterface; +use Drupal\migrate\ProcessPluginBase; +use Drupal\migrate\MigrateExecutableInterface; +use Drupal\migrate\Row; +use Symfony\Component\DependencyInjection\ContainerInterface; + +/** + * Transliterates text from Unicode to US-ASCII + * + * The transliteration process plugin takes the source value and runs it through + * the transliteration service. Letters will have language decorations and + * accents removed. + * + * Example: + * + * @code + * process: + * bar: + * plugin: transliteration + * source: foo + * @endcode + * + * If the value of foo in the source is 'áéÃ!' then the destination value of bar + * will be 'aei!'. + * + * @see \Drupal\migrate\Plugin\MigrateProcessInterface + * + * @MigrateProcessPlugin( + * id = "transliteration" + * ) + */ +class Transliteration extends ProcessPluginBase implements ContainerFactoryPluginInterface { + + /** + * The transliteration service. + * + * @var \Drupal\Component\Transliteration\TransliterationInterface + */ + protected $transliteration; + + /** + * Constructs a Transliteration plugin. + * + * @param array $configuration + * The plugin configuration. + * @param string $plugin_id + * The plugin ID. + * @param mixed $plugin_definition + * The plugin definition. + * @param \Drupal\Component\Transliteration\TransliterationInterface $transliteration + * The transliteration service. + */ + public function __construct(array $configuration, $plugin_id, $plugin_definition, TransliterationInterface $transliteration) { + parent::__construct($configuration, $plugin_id, $plugin_definition); + $this->transliteration = $transliteration; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('transliteration') + ); + } + + /** + * {@inheritdoc} + */ + public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { + return $this->transliteration->transliterate($value, LanguageInterface::LANGCODE_DEFAULT, '_'); + } + +} + diff --git a/tests/src/Unit/process/TransliterationTest.php b/tests/src/Unit/process/TransliterationTest.php new file mode 100644 index 00000000..dbfe2885 --- /dev/null +++ b/tests/src/Unit/process/TransliterationTest.php @@ -0,0 +1,51 @@ +<?php + +namespace Drupal\Tests\migrate_plus\Unit\process; + +use Drupal\Component\Transliteration\PhpTransliteration; +use Drupal\migrate\MigrateExecutableInterface; +use Drupal\migrate\Row; +use Drupal\migrate_plus\Plugin\migrate\process\Transliteration; +use Drupal\Tests\migrate\Unit\process\MigrateProcessTestCase; + +/** + * Tests the transliteration process plugin. + * + * @group migrate_plus + */ +class TransliterationTest extends MigrateProcessTestCase { + + /** + * A transliteration instance. + * + * @var \Drupal\Component\Transliteration\TransliterationInterface + */ + protected $transliteration; + + /** + * {@inheritdoc} + */ + protected function setUp() { + $this->transliteration = new PhpTransliteration(); + $this->row = $this->getMockBuilder(Row::class) + ->disableOriginalConstructor() + ->getMock(); + $this->migrateExecutable = $this->getMockBuilder(MigrateExecutableInterface::class) + ->disableOriginalConstructor() + ->getMock(); + parent::setUp(); + } + + /** + * Tests transliteration transformation of non-alphanumeric characters. + */ + public function testTransform() { + $actual = '9000004351_53494854_Spøgelsesjægerneáéö'; + $expected_result = '9000004351_53494854_Spogelsesjaegerneaeo'; + + $plugin = new Transliteration([], 'transliteration', [], $this->transliteration); + $value = $plugin->transform($actual, $this->migrateExecutable, $this->row, 'destinationproperty'); + $this->assertEquals($expected_result, $value); + } + +} -- GitLab