diff --git a/src/Plugin/migrate/process/Transliteration.php b/src/Plugin/migrate/process/Transliteration.php new file mode 100644 index 0000000000000000000000000000000000000000..0ce2f6e65c334926adf753ef909f9be29fed95d0 --- /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 0000000000000000000000000000000000000000..dbfe288570f10bd877473cf2a23dfdc6da681142 --- /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); + } + +}