123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- <?php
- /*
- * This file is part of SwiftMailer.
- * (c) 2004-2009 Chris Corbyn
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Standard factory for creating CharacterReaders.
- *
- * @author Chris Corbyn
- */
- class Swift_CharacterReaderFactory_SimpleCharacterReaderFactory implements Swift_CharacterReaderFactory
- {
- /**
- * A map of charset patterns to their implementation classes.
- *
- * @var array
- */
- private static $_map = array();
- /**
- * Factories which have already been loaded.
- *
- * @var Swift_CharacterReaderFactory[]
- */
- private static $_loaded = array();
- /**
- * Creates a new CharacterReaderFactory.
- */
- public function __construct()
- {
- $this->init();
- }
- public function __wakeup()
- {
- $this->init();
- }
- public function init()
- {
- if (count(self::$_map) > 0) {
- return;
- }
- $prefix = 'Swift_CharacterReader_';
- $singleByte = array(
- 'class' => $prefix . 'GenericFixedWidthReader',
- 'constructor' => array(1)
- );
- $doubleByte = array(
- 'class' => $prefix . 'GenericFixedWidthReader',
- 'constructor' => array(2)
- );
- $fourBytes = array(
- 'class' => $prefix . 'GenericFixedWidthReader',
- 'constructor' => array(4)
- );
- // Utf-8
- self::$_map['utf-?8'] = array(
- 'class' => $prefix . 'Utf8Reader',
- 'constructor' => array()
- );
- //7-8 bit charsets
- self::$_map['(us-)?ascii'] = $singleByte;
- self::$_map['(iso|iec)-?8859-?[0-9]+'] = $singleByte;
- self::$_map['windows-?125[0-9]'] = $singleByte;
- self::$_map['cp-?[0-9]+'] = $singleByte;
- self::$_map['ansi'] = $singleByte;
- self::$_map['macintosh'] = $singleByte;
- self::$_map['koi-?7'] = $singleByte;
- self::$_map['koi-?8-?.+'] = $singleByte;
- self::$_map['mik'] = $singleByte;
- self::$_map['(cork|t1)'] = $singleByte;
- self::$_map['v?iscii'] = $singleByte;
- //16 bits
- self::$_map['(ucs-?2|utf-?16)'] = $doubleByte;
- //32 bits
- self::$_map['(ucs-?4|utf-?32)'] = $fourBytes;
- // Fallback
- self::$_map['.*'] = $singleByte;
- }
- /**
- * Returns a CharacterReader suitable for the charset applied.
- *
- * @param string $charset
- *
- * @return Swift_CharacterReader
- */
- public function getReaderFor($charset)
- {
- $charset = trim(strtolower($charset));
- foreach (self::$_map as $pattern => $spec) {
- $re = '/^' . $pattern . '$/D';
- if (preg_match($re, $charset)) {
- if (!array_key_exists($pattern, self::$_loaded)) {
- $reflector = new ReflectionClass($spec['class']);
- if ($reflector->getConstructor()) {
- $reader = $reflector->newInstanceArgs($spec['constructor']);
- } else {
- $reader = $reflector->newInstance();
- }
- self::$_loaded[$pattern] = $reader;
- }
- return self::$_loaded[$pattern];
- }
- }
- }
- }
|