diff --git a/modules/islandora_image/config/schema/islandora_image.schema.yml b/modules/islandora_image/config/schema/islandora_image.schema.yml index 687e7c110..e59108705 100644 --- a/modules/islandora_image/config/schema/islandora_image.schema.yml +++ b/modules/islandora_image/config/schema/islandora_image.schema.yml @@ -23,6 +23,9 @@ action.configuration.generate_image_derivative: args: type: text label: 'Convert Arguments' + inputargs: + type: text + label: 'Input arguments for convert' scheme: type: text label: 'Flysystem scheme' diff --git a/modules/islandora_image/src/Plugin/Action/GenerateImageDerivative.php b/modules/islandora_image/src/Plugin/Action/GenerateImageDerivative.php index e81f157b1..42ee9a295 100644 --- a/modules/islandora_image/src/Plugin/Action/GenerateImageDerivative.php +++ b/modules/islandora_image/src/Plugin/Action/GenerateImageDerivative.php @@ -24,6 +24,7 @@ public function defaultConfiguration() { $config['mimetype'] = 'image/jpeg'; $config['path'] = '[date:custom:Y]-[date:custom:m]/[node:nid].jpg'; $config['destination_media_type'] = 'image'; + $config['inputargs'] = ''; return $config; } @@ -33,7 +34,21 @@ public function defaultConfiguration() { public function buildConfigurationForm(array $form, FormStateInterface $form_state) { $form = parent::buildConfigurationForm($form, $form_state); $form['mimetype']['#description'] = $this->t('Mimetype to convert to (e.g. image/jpeg, image/png, etc...)'); - $form['args']['#description'] = $this->t('Additional command line arguments for ImageMagick convert (e.g. -resize 50%'); + + // Adjust args title and description for better clarity. + $form['args']['#title'] = $this->t('Additional output arguments'); + $form['args']['#description'] = $this->t('Additional output options for ImageMagick convert (e.g. -resize 50% -unsharp 0x.5).
See documentation for available options.'); + + $new = [ + 'inputargs' => [ + '#type' => 'textfield', + '#title' => $this->t('Additional input arguments'), + '#default_value' => $this->configuration['inputargs'], + '#rows' => '8', + '#description' => $this->t('Additional input options for ImageMagick convert (e.g. -density 144).
Check the man page to see which options are input options.'), + ], + ]; + $form = $this->utils->arrayInsertAfter($form, 'mimetype', $new); return $form; } @@ -53,4 +68,12 @@ public function validateConfigurationForm(array &$form, FormStateInterface $form } } + /** + * {@inheritdoc} + */ + public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { + parent::submitConfigurationForm($form, $form_state); + $this->configuration['inputargs'] = $form_state->getValue('inputargs'); + } + } diff --git a/modules/islandora_image/src/Plugin/Action/GenerateImageDerivativeFile.php b/modules/islandora_image/src/Plugin/Action/GenerateImageDerivativeFile.php index a6e067740..1529623ee 100644 --- a/modules/islandora_image/src/Plugin/Action/GenerateImageDerivativeFile.php +++ b/modules/islandora_image/src/Plugin/Action/GenerateImageDerivativeFile.php @@ -28,6 +28,7 @@ public function defaultConfiguration() { $config['mimetype'] = 'application/xml'; $config['queue'] = 'islandora-connector-houdini'; $config['scheme'] = $this->config->get('default_scheme'); + $config['inputargs'] = ''; return $config; } @@ -60,7 +61,32 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta $form['mimetype']['#value'] = 'image/jpeg'; $form['mimetype']['#description'] = 'Mimetype to convert to. Must be compatible with the destination image field.'; + $form['mimetype']['#type'] = 'hidden'; + + // Adjust args title and description for better clarity. + $form['args']['#title'] = $this->t('Additional output arguments'); + $form['args']['#description'] = $this->t('Additional output options for ImageMagick convert (e.g. -resize 50% -unsharp 0x.5).
See documentation for available options.'); + + $new = [ + 'inputargs' => [ + '#type' => 'textfield', + '#title' => $this->t('Additional input arguments'), + '#default_value' => $this->configuration['inputargs'], + '#rows' => '8', + '#description' => $this->t('Additional input options for ImageMagick convert (e.g. -density 144).
Check the man page to see which options are input options.'), + ], + ]; + $form = $this->utils->arrayInsertAfter($form, 'mimetype', $new); + return $form; } + /** + * {@inheritdoc} + */ + public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { + parent::submitConfigurationForm($form, $form_state); + $this->configuration['inputargs'] = $form_state->getValue('inputargs'); + } + } diff --git a/src/IslandoraUtils.php b/src/IslandoraUtils.php index 5d667fc42..78fcd57dd 100644 --- a/src/IslandoraUtils.php +++ b/src/IslandoraUtils.php @@ -103,7 +103,7 @@ public function __construct( ContextManager $context_manager, FlysystemFactory $flysystem_factory, LanguageManagerInterface $language_manager, - AccountInterface $current_user + AccountInterface $current_user, ) { $this->entityTypeManager = $entity_type_manager; $this->entityFieldManager = $entity_field_manager; @@ -768,6 +768,33 @@ protected function getParentsByEntityReference(ContentEntityInterface $entity, a return $parents; } + /** + * Insert a value or key/value pair after a specific key in an array. + * + * If key doesn't exist, value is appended to the end of the array. + * This is not islandora specific, but a useful function that neither PHP + * nor Drupal provide. (is there still hope after 16 years? + * https://www.drupal.org/project/drupal/issues/66183 ) + * + * Credit: https://gist.github.com/wpscholar/0deadce1bbfa4adb4e4c + * + * @param array $array + * Array in which the new element should be inserted. + * @param string $key + * The key after which the new element should be inserted. + * @param array $new + * The new element to insert. + * + * @return array + * The new array. + */ + public function arrayInsertAfter(array $array, $key, array $new) { + $keys = array_keys($array); + $index = array_search($key, $keys); + $pos = FALSE === $index ? count($array) : $index + 1; + return array_merge(array_slice($array, 0, $pos), $new, array_slice($array, $pos)); + } + /** * Deletes Media and all associated files. * diff --git a/src/Plugin/Action/AbstractGenerateDerivativeMediaFile.php b/src/Plugin/Action/AbstractGenerateDerivativeMediaFile.php index f0974b0c0..f1a9807e9 100644 --- a/src/Plugin/Action/AbstractGenerateDerivativeMediaFile.php +++ b/src/Plugin/Action/AbstractGenerateDerivativeMediaFile.php @@ -30,6 +30,7 @@ public function defaultConfiguration() { 'event' => 'Generate Derivative', 'source_term_uri' => $uri, 'mimetype' => '', + 'inputargs' => '', 'args' => '', 'path' => '[date:custom:Y]-[date:custom:m]/[media:mid].bin', 'source_field_name' => 'field_media_file', @@ -72,6 +73,7 @@ protected function generateData(EntityInterface $entity) { $allowed = [ 'queue', 'event', + 'inputargs', 'args', 'source_uri', 'destination_uri', @@ -120,12 +122,20 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta Selected destination field must be present on the media.'), ]; + $form['inputargs'] = [ + '#type' => 'textfield', + '#title' => $this->t('Additional input arguments'), + '#default_value' => $this->configuration['inputargs'], + '#rows' => '8', + '#description' => $this->t('Additional command line options related to the source file'), + ]; + $form['args'] = [ '#type' => 'textfield', - '#title' => $this->t('Additional arguments'), + '#title' => $this->t('Additional output arguments'), '#default_value' => $this->configuration['args'], '#rows' => '8', - '#description' => $this->t('Additional command line arguments'), + '#description' => $this->t('Additional command line options related to the output file (derivative)'), ]; $form['mimetype'] = [ @@ -181,6 +191,7 @@ public function validateConfigurationForm(array &$form, FormStateInterface $form public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { parent::submitConfigurationForm($form, $form_state); $this->configuration['mimetype'] = $form_state->getValue('mimetype'); + $this->configuration['inputargs'] = $form_state->getValue('inputargs'); $this->configuration['args'] = $form_state->getValue('args'); $this->configuration['scheme'] = $form_state->getValue('scheme'); $this->configuration['path'] = trim($form_state->getValue('path'), '\\/');