ldc-groupe/content/plugins/acf-duplicate-repeater/include/ACFDuplicateRepeater/Asset/Asset.php
Vincent BRIDIER 134507db43 - Backup DEV
- Add DotEnv
- Fix Bato
- Etc..
2020-05-04 15:59:02 +02:00

225 lines
4.2 KiB
PHP

<?php
/**
* @package ACFDuplicateRepeater\Asset
* @version 1.0.1
* 2018-09-22
*/
namespace ACFDuplicateRepeater\Asset;
if ( ! defined('ABSPATH') ) {
die('FU!');
}
use ACFDuplicateRepeater\Core;
/**
* Base Class
*/
class Asset {
/**
* @var string relative asset path
*/
private $asset;
/**
* @var string Absolute asset path
*/
private $path;
/**
* @var string Absolute asset url
*/
private $url;
/**
* @var array Dependencies
*/
private $deps = [];
/**
* @var array|boolean Localization
*/
private $in_footer = true;
/**
* @var string css|js
*/
private $type;
/**
* @var array|boolean Localization
*/
private $l10n = false;
/**
* @var string css|js
*/
private $registered = false;
private $core = null;
static function get( $asset ) {
return new self($asset);
}
public function __construct( $asset ) {
$this->core = Core\Core::instance();
$this->asset = preg_replace( '/^(\/+)/', '', $asset ); // unleadingslashit
$this->type = strtolower( pathinfo( $this->asset, PATHINFO_EXTENSION ));
$this->handle = $this->generate_handle();
$this->varname = str_replace( '-', '_', $this->handle );
$this->in_footer = $this->type === 'js';
$this->locate();
}
/**
* Locate asset file
*/
private function locate() {
// !!! must know plugin or theme !!!
$check = $this->core->get_asset_roots();
foreach ( $check as $root_path => $root_url ) {
$root_path = untrailingslashit( $root_path );
$root_url = untrailingslashit( $root_url );
$path = $root_path . '/' . $this->asset;
if ( file_exists( $path ) ) {
$this->path = $path;
$this->url = $root_url . '/' . $this->asset;
return;
}
}
throw new \Exception( sprintf( 'Couldn\'t locate %s', $this->asset ) );
}
/**
* Set Dependencies
*
* @param array $deps Dependencies
*/
public function deps( $deps = [] ) {
$this->deps = $deps;
return $this;
}
/**
* Set Dependencies
*
* @param boolean $in_footer Dependencies
*/
public function footer( $in_footer = true ) {
$this->in_footer = $in_footer;
return $this;
}
/**
* Register asset
* Wrapper for wp_register_[script|style]
*/
public function register( ) {
if ( ! $this->registered ) {
$fn = $this->type === 'js' ? 'wp_register_script' : 'wp_register_style';
$args = [
$this->handle,
$this->url,
$this->deps,
$this->core->version()
];
if ( $this->in_footer ) {
$args[] = $this->in_footer;
}
call_user_func_array(
$fn,
$args
);
$this->registered = true;
}
return $this->_localize();
}
/**
* Enqueue asset
* Wrapper for wp_enqueue_[script|style]
*
* @param array $deps Dependencies
*/
public function enqueue( $deps = [] ) {
$fn = $this->type === 'js' ? 'wp_enqueue_script' : 'wp_enqueue_style';
if ( ! $this->registered ) {
$this->register( $deps );
}
call_user_func( $fn, $this->handle );
return $this;
}
/**
* Localize
* Wrapper for wp_localize_script
*
* @param array $deps Dependencies
*/
public function localize( $l10n = [], $varname = null ) {
if ( $this->type !== 'js' ) {
throw new \Exception( 'Can\'t localize stylesheet' );
}
if ( ! is_null( $varname ) ) {
$this->varname = $varname;
}
if ( is_array( $l10n ) ) {
$this->l10n = $l10n;
}
return $this->_localize();
}
/**
* Maybe call wp_localize_script
*/
private function _localize( ) {
if ( $this->registered && ! $this->localized && is_array( $this->l10n ) ) {
wp_localize_script( $this->handle, $this->varname, $this->l10n );
$this->localized = true;
}
return $this;
}
/**
* magic getter
*/
public function __get( $var ) {
switch ( $var ) {
case 'asset':
case 'handle':
case 'in_footer':
case 'path':
case 'url':
case 'varname':
return $this->$var;
case 'deps':
return array_values( $this->$var );
}
}
/**
* Generate script handle.
*/
private function generate_handle() {
$asset = preg_replace( '/^(js|css)\//', '', $this->asset );
$pi = pathinfo( $asset );
$handle = str_replace( '/', '-', sprintf( '%s-%s', $pi['dirname'], $pi['filename'] ) );
$handle = preg_replace( '/[^a-z0-9_]/','-', $handle );
return $handle;
}
}