286 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			286 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * Fontpack
 | |
|  *
 | |
|  * @package Icon_Picker
 | |
|  * @version 0.1.0
 | |
|  * @author  Dzikri Aziz <kvcrvt@gmail.com>
 | |
|  */
 | |
| 
 | |
| final class Icon_Picker_Fontpack {
 | |
| 
 | |
| 	/**
 | |
| 	 * Icon_Picker_Fontpack singleton
 | |
| 	 *
 | |
| 	 * @static
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    Icon_Picker_Fontpack
 | |
| 	 */
 | |
| 	protected static $instance;
 | |
| 
 | |
| 	/**
 | |
| 	 * Fontpack directory path
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    string
 | |
| 	 */
 | |
| 	protected $dir;
 | |
| 
 | |
| 	/**
 | |
| 	 * Fontpack directory url path
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    string
 | |
| 	 */
 | |
| 	protected $url;
 | |
| 
 | |
| 	/**
 | |
| 	 * Error messages
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    array
 | |
| 	 */
 | |
| 	protected $messages = array();
 | |
| 
 | |
| 	/**
 | |
| 	 * Icon packs
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    array
 | |
| 	 */
 | |
| 	protected $packs = array();
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Get instance
 | |
| 	 *
 | |
| 	 * @static
 | |
| 	 * @since  0.1.0
 | |
| 	 * @return Icon_Picker_Fontpack
 | |
| 	 */
 | |
| 	public static function instance() {
 | |
| 		if ( is_null( self::$instance ) ) {
 | |
| 			self::$instance = new self();
 | |
| 		}
 | |
| 
 | |
| 		return self::$instance;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Getter magic
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @param  string $name Property name.
 | |
| 	 * @return mixed  NULL if attribute doesn't exist.
 | |
| 	 */
 | |
| 	public function __get( $name ) {
 | |
| 		if ( isset( $this->$name ) ) {
 | |
| 			return $this->$name;
 | |
| 		}
 | |
| 
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Setter magic
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public function __isset( $name ) {
 | |
| 		return isset( $this->$name );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @return Icon_Picker_Fontpack
 | |
| 	 */
 | |
| 	protected function __construct() {
 | |
| 		/**
 | |
| 		 * Allow different system path for fontpacks
 | |
| 		 *
 | |
| 		 * @since 0.1.0
 | |
| 		 * @param string $dir Directory path, defaults to /wp-content/fontpacks.
 | |
| 		 */
 | |
| 		$this->dir = apply_filters( 'icon_picker_fontpacks_dir_path', WP_CONTENT_DIR . '/fontpacks' );
 | |
| 
 | |
| 		if ( ! is_readable( $this->dir ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * Allow different URL path for fontpacks
 | |
| 		 *
 | |
| 		 * @since 0.4.0
 | |
| 		 * @param string $url URL path, defaults to /wp-content/fontpacks
 | |
| 		 */
 | |
| 		$this->url = apply_filters( 'icon_picker_fontpacks_dir_url', WP_CONTENT_URL . '/fontpacks' );
 | |
| 
 | |
| 		$this->messages = array(
 | |
| 			'no_config'    => __( 'Icon Picker: %1$s was not found in %2$s.', 'icon-picker' ),
 | |
| 			'config_error' => __( 'Icon Picker: %s contains an error or more.', 'icon-picker' ),
 | |
| 			'invalid'      => __( 'Icon Picker: %1$s is not set or invalid in %2$s.', 'icon-picker' ),
 | |
| 			'duplicate'    => __( 'Icon Picker: %1$s is already registered. Please check your font pack config file: %2$s.', 'icon-picker' ),
 | |
| 		);
 | |
| 
 | |
| 		$this->collect_packs();
 | |
| 		$this->register_packs();
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Collect icon packs
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	protected function collect_packs() {
 | |
| 		$iterator = new DirectoryIterator( $this->dir );
 | |
| 
 | |
| 		foreach ( $iterator as $pack_dir ) {
 | |
| 			if ( $pack_dir->isDot() || ! $pack_dir->isDir() || ! $pack_dir->isReadable() ) {
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			$pack_dirname = $pack_dir->getFilename();
 | |
| 			$pack_data    = $this->get_pack_data( $pack_dir );
 | |
| 
 | |
| 			if ( ! empty( $pack_data ) ) {
 | |
| 				$this->packs[ $pack_dirname ] = $pack_data;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Register icon packs
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	protected function register_packs() {
 | |
| 		if ( empty( $this->packs ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$icon_picker = Icon_Picker::instance();
 | |
| 		require_once "{$icon_picker->dir}/includes/types/fontello.php";
 | |
| 
 | |
| 		foreach ( $this->packs as $pack_data ) {
 | |
| 			$icon_picker->registry->add( new Icon_Picker_Type_Fontello( $pack_data ) );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Get icon pack data
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @param  DirectoryIterator $pack_dir Icon pack directory object.
 | |
| 	 * @return array Icon pack data array or FALSE.
 | |
| 	 */
 | |
| 	protected function get_pack_data( DirectoryIterator $pack_dir ) {
 | |
| 		$pack_dirname  = $pack_dir->getFilename();
 | |
| 		$pack_path     = $pack_dir->getPathname();
 | |
| 		$cache_id      = "icon_picker_fontpack_{$pack_dirname}";
 | |
| 		$cache_data    = get_transient( $cache_id );
 | |
| 		$config_file   = "{$pack_path}/config.json";
 | |
| 
 | |
| 		if ( false !== $cache_data && $cache_data['version'] === $pack_dir->getMTime() ) {
 | |
| 			return $cache_data;
 | |
| 		}
 | |
| 
 | |
| 		// Make sure the config file exists and is readable.
 | |
| 		if ( ! is_readable( $config_file ) ) {
 | |
| 			trigger_error(
 | |
| 				sprintf(
 | |
| 					esc_html( $this->messages['no_config'] ),
 | |
| 					'<code>config.json</code>',
 | |
| 					sprintf( '<code>%s</code>', esc_html( $pack_path ) )
 | |
| 				)
 | |
| 			);
 | |
| 
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$config = json_decode( file_get_contents( $config_file ), true );
 | |
| 		$errors = json_last_error();
 | |
| 
 | |
| 		if ( ! empty( $errors ) ) {
 | |
| 			trigger_error(
 | |
| 				sprintf(
 | |
| 					esc_html( $this->messages['config_error'] ),
 | |
| 					sprintf( '<code>%s/config.json</code>', esc_html( $pack_path ) )
 | |
| 				)
 | |
| 			);
 | |
| 
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$keys   = array( 'name', 'glyphs', 'css_prefix_text' );
 | |
| 		$items  = array();
 | |
| 
 | |
| 		// Check each required config.
 | |
| 		foreach ( $keys as $key ) {
 | |
| 			if ( empty( $config[ $key ] ) ) {
 | |
| 				trigger_error(
 | |
| 					sprintf(
 | |
| 						esc_html( $this->messages['invalid'] ),
 | |
| 						sprintf( '<code><em>%s</em></code>', esc_html( $key ) ),
 | |
| 						esc_html( $config_file )
 | |
| 					)
 | |
| 				);
 | |
| 
 | |
| 				return false;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Bail if no glyphs found.
 | |
| 		if ( ! is_array( $config['glyphs'] ) || empty( $config['glyphs'] ) ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		foreach ( $config['glyphs'] as $glyph ) {
 | |
| 			if ( ! empty( $glyph['css'] ) ) {
 | |
| 				$items[] = array(
 | |
| 					'id'   => $config['css_prefix_text'] . $glyph['css'],
 | |
| 					'name' => $glyph['css'],
 | |
| 				);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( empty( $items ) ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$pack_data = array(
 | |
| 			'id'             => "pack-{$config['name']}",
 | |
| 			'name'           => sprintf( __( 'Pack: %s', 'icon-picker' ), $config['name'] ),
 | |
| 			'version'        => $pack_dir->getMTime(),
 | |
| 			'items'          => $items,
 | |
| 			'stylesheet_uri' => "{$this->url}/{$pack_dirname}/css/{$config['name']}.css",
 | |
| 			'dir'            => "{$this->dir}/{$pack_dirname}",
 | |
| 			'url'            => "{$this->url}/{$pack_dirname}",
 | |
| 		);
 | |
| 
 | |
| 		set_transient( $cache_id, $pack_data, DAY_IN_SECONDS );
 | |
| 
 | |
| 		return $pack_data;
 | |
| 	}
 | |
| }
 |