From c0413f84d9361f850767142309636fa82fe6dbf9 Mon Sep 17 00:00:00 2001
From: Jim Frederick <james.p.frederick@gmail.com>
Date: Thu, 7 Apr 2016 15:53:55 -0400
Subject: [PATCH] Issue #2702205 by jfrederick: Allow a max number of
 characters

---
 config/schema/image_effects.schema.yml             |  6 +++++
 src/Plugin/ImageEffect/TextOverlayImageEffect.php  | 27 ++++++++++++++++++++++
 .../ImageToolkit/Operation/TextToWrapperTrait.php  |  6 +++++
 .../ImageToolkit/Operation/gd/TextToWrapper.php    | 12 ++++++++++
 4 files changed, 51 insertions(+)

diff --git a/config/schema/image_effects.schema.yml b/config/schema/image_effects.schema.yml
index 4fc7d82..b1319c0 100644
--- a/config/schema/image_effects.schema.yml
+++ b/config/schema/image_effects.schema.yml
@@ -299,6 +299,12 @@ image.effect.image_effects_text_overlay:
     text:
       type: mapping
       mapping:
+        maximum_chars:
+          type: integer
+          label: 'Maximum characters'
+        maximum_chars_ellipsis:
+          type: boolean
+          label: 'Ellipsis'
         maximum_width:
           type: integer
           label: 'Maximum width in px'
diff --git a/src/Plugin/ImageEffect/TextOverlayImageEffect.php b/src/Plugin/ImageEffect/TextOverlayImageEffect.php
index 9da7487..12c6e03 100644
--- a/src/Plugin/ImageEffect/TextOverlayImageEffect.php
+++ b/src/Plugin/ImageEffect/TextOverlayImageEffect.php
@@ -158,6 +158,8 @@ class TextOverlayImageEffect extends ConfigurableImageEffectBase implements Cont
           'extended_color'        => NULL,
         ),
         'text' => array(
+          'maximum_chars'         => 0,
+          'maximum_chars_ellipsis' => FALSE,
           'maximum_width'         => 0,
           'fixed_width'           => FALSE,
           'align'                 => 'left',
@@ -417,6 +419,27 @@ class TextOverlayImageEffect extends ConfigurableImageEffectBase implements Cont
       '#title' => $this->t('Text settings'),
       '#group'   => 'settings',
     );
+    // Max characters
+    $form['text']['maximum_chars'] = array(
+      '#type' => 'number',
+      '#title' => $this->t('Maximum characters'),
+      '#description' => $this->t('The maximum allowed characters of text. Set to 0 or blank for no limit.'),
+      '#default_value' => $this->configuration['text']['maximum_chars'],
+      '#maxlength' => 4,
+      '#size' => 5,
+      '#min' => 0,
+    );
+    $form['text']['maximum_chars_ellipsis'] = array(
+      '#type'  => 'checkbox',
+      '#title' => $this->t('Display ellipsis'),
+      '#description' => $this->t('If checked, and if the text is shortened, display an ellipsis.'),
+      '#default_value' => $this->configuration['text']['maximum_chars_ellipsis'],
+      '#states' => array(
+        'visible' => array(
+          ':input[name="data[text][maximum_chars]"]' => array('!value' => 0),
+        ),
+      ),
+    );
     // Inner width.
     $form['text']['maximum_width'] = array(
       '#type'  => 'number',
@@ -656,6 +679,8 @@ class TextOverlayImageEffect extends ConfigurableImageEffectBase implements Cont
         'background_color'     => $form_state->getValue(['layout', 'background_color']),
       ),
       'text'   => array(
+        'maximum_chars'        => $form_state->getValue(['text', 'maximum_chars']),
+        'maximum_chars_ellipsis' => $form_state->getValue(['text', 'maximum_chars_ellipsis']),
         'maximum_width'        => $form_state->getValue(['text', 'maximum_width']),
         'fixed_width'          => $form_state->getValue(['text', 'fixed_width']),
         'align'                => $form_state->getValue(['text', 'align']),
@@ -907,6 +932,8 @@ class TextOverlayImageEffect extends ConfigurableImageEffectBase implements Cont
       'layout_y_offset'            => $this->configuration['layout']['y_offset'],
       'layout_background_color'    => $this->configuration['layout']['background_color'],
       'layout_overflow_action'     => $this->configuration['layout']['overflow_action'],
+      'text_maximum_chars'         => $this->configuration['text']['maximum_chars'],
+      'text_maximum_chars_ellipsis' => $this->configuration['text']['maximum_chars_ellipsis'],
       'text_maximum_width'         => $this->configuration['text']['maximum_width'],
       'text_fixed_width'           => $this->configuration['text']['fixed_width'],
       'text_align'                 => $this->configuration['text']['align'],
diff --git a/src/Plugin/ImageToolkit/Operation/TextToWrapperTrait.php b/src/Plugin/ImageToolkit/Operation/TextToWrapperTrait.php
index bc618e8..d1e438f 100644
--- a/src/Plugin/ImageToolkit/Operation/TextToWrapperTrait.php
+++ b/src/Plugin/ImageToolkit/Operation/TextToWrapperTrait.php
@@ -84,6 +84,12 @@ trait TextToWrapperTrait {
       'layout_overflow_action' => [
         'description' => 'Layout overflow action.',
       ],
+      'text_maximum_chars' => [
+        'description' => 'Maximum character count.',
+      ],
+      'text_maximum_chars_ellipsis' => [
+        'description' => 'Display ellipsis if text is shortened.',
+      ],
       'text_maximum_width' => [
         'description' => 'Maximum width, in pixels.',
       ],
diff --git a/src/Plugin/ImageToolkit/Operation/gd/TextToWrapper.php b/src/Plugin/ImageToolkit/Operation/gd/TextToWrapper.php
index 53c4325..4352bc6 100644
--- a/src/Plugin/ImageToolkit/Operation/gd/TextToWrapper.php
+++ b/src/Plugin/ImageToolkit/Operation/gd/TextToWrapper.php
@@ -62,6 +62,18 @@ class TextToWrapper extends GDImageToolkitOperationBase {
       $arguments['layout_padding_bottom'] += ($net_bottom > 0 ? $net_bottom : 0);
     }
 
+    // Limit the maximum number of characters.
+    if ($arguments['text_maximum_chars'] > 0) {
+      if (strlen($arguments['text_string']) > $arguments['text_maximum_chars']) {
+        $shorter_string = substr($arguments['text_string'], 0, $arguments['text_maximum_chars']);
+        if ($arguments['text_maximum_chars_ellipsis'] == TRUE) {
+          $shorter_string = $shorter_string . '...';
+        }
+        $arguments['text_string'] = $shorter_string;
+      }
+
+    }
+
     // Perform text wrapping, if necessary.
     if ($arguments['text_maximum_width'] > 0) {
       $arguments['text_string'] = $this->wrapText(
-- 
2.6.4 (Apple Git-63)

