You are here

class FeedsExTextEncoder in Feeds extensible parsers 7

Generic text encoder.

Hierarchy

Expanded class hierarchy of FeedsExTextEncoder

File

src/Text/Utility.php, line 58
Contains FeedsExEncoderInterface and FeedsExTextEncoder.

View source
class FeedsExTextEncoder implements FeedsExEncoderInterface {

  /**
   * Whether the current system handles mb_* functions.
   *
   * @var bool
   */
  protected $isMultibyte = FALSE;

  /**
   * The set of encodings compatible with UTF-8.
   *
   * @var array
   */
  protected static $utf8Compatible = array(
    'utf-8',
    'utf8',
    'us-ascii',
    'ascii',
  );

  /**
   * The list of encodings to search for.
   *
   * @var array
   */
  protected $encodingList;

  /**
   * {@inheritdoc}
   */
  public function __construct(array $encoding_list) {
    $this->encodingList = $encoding_list;
    $this->isMultibyte = $GLOBALS['multibyte'] == UNICODE_MULTIBYTE;
  }

  /**
   * {@inheritdoc}
   */
  public function convertEncoding($data) {
    if (!($detected = $this
      ->detectEncoding($data))) {
      return $data;
    }
    return $this
      ->doConvert($data, $detected);
  }

  /**
   * {@inheritdoc}
   */
  public function configForm(array $form, array &$form_state) {
    if (!$this->isMultibyte) {
      return $form;
    }
    $args = array(
      '%encodings' => implode(', ', mb_detect_order()),
    );
    $form['source_encoding'] = array(
      '#type' => 'textfield',
      '#title' => t('Source encoding'),
      '#description' => t('The possible encodings of the source files. auto: %encodings', $args),
      '#default_value' => implode(', ', $this->encodingList),
      '#autocomplete_path' => '_feeds_ex/encoding_autocomplete',
      '#maxlength' => 1024,
    );
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function configFormValidate(array &$values) {
    if (!$this->isMultibyte) {
      return;
    }

    // Normalize encodings. Make them exactly as they are defined in
    // mb_list_encodings(), but maintain user-defined order.
    $encodings = array_map('strtolower', array_map('trim', explode(',', $values['source_encoding'])));
    $values['source_encoding'] = array();
    foreach (mb_list_encodings() as $encoding) {

      // Maintain order.
      $pos = array_search(strtolower($encoding), $encodings);
      if ($pos !== FALSE) {
        $values['source_encoding'][$pos] = $encoding;
      }
    }
    ksort($values['source_encoding']);

    // Make sure there's some value set.
    if (!$values['source_encoding']) {
      $values['source_encoding'][] = 'auto';
    }
  }

  /**
   * Detects the encoding of a string.
   *
   * @param string $data
   *   The string to guess the encoding for.
   *
   * @return string|bool
   *   Returns the encoding, or false if one could not be detected.
   */
  protected function detectEncoding($data) {
    if (!$this->isMultibyte) {
      return FALSE;
    }
    if ($detected = mb_detect_encoding($data, $this->encodingList, TRUE)) {
      return $detected;
    }
    return mb_detect_encoding($data, $this->encodingList);
  }

  /**
   * Performs the actual encoding conversion.
   *
   * @param string $data
   *   The data to convert.
   * @param string $source_encoding
   *   The detected encoding.
   *
   * @return string
   *   The encoded string.
   */
  protected function doConvert($data, $source_encoding) {
    if (in_array(strtolower($source_encoding), self::$utf8Compatible)) {
      return $data;
    }
    $converted = drupal_convert_to_utf8($data, $source_encoding);
    if ($converted === FALSE) {
      return $data;
    }
    return $converted;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
FeedsExTextEncoder::$encodingList protected property The list of encodings to search for.
FeedsExTextEncoder::$isMultibyte protected property Whether the current system handles mb_* functions.
FeedsExTextEncoder::$utf8Compatible protected static property The set of encodings compatible with UTF-8.
FeedsExTextEncoder::configForm public function Returns the configuration form to select encodings. Overrides FeedsExEncoderInterface::configForm
FeedsExTextEncoder::configFormValidate public function Validates the encoding configuration form. Overrides FeedsExEncoderInterface::configFormValidate
FeedsExTextEncoder::convertEncoding public function Converts a string to UTF-8. Overrides FeedsExEncoderInterface::convertEncoding 1
FeedsExTextEncoder::detectEncoding protected function Detects the encoding of a string.
FeedsExTextEncoder::doConvert protected function Performs the actual encoding conversion.
FeedsExTextEncoder::__construct public function Constructs a FeedsExEncoderInterface object. Overrides FeedsExEncoderInterface::__construct