126 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Sphere\Debloat\Util;
 | 
						|
use Sphere\Debloat\Plugin;
 | 
						|
 | 
						|
/**
 | 
						|
 * Convert an option value to array format, and clean it.
 | 
						|
 *
 | 
						|
 * @param string|array $value
 | 
						|
 * @return array
 | 
						|
 */
 | 
						|
function option_to_array($value, $separator = "\n")
 | 
						|
{
 | 
						|
	$value = $value ?: [];
 | 
						|
 | 
						|
	if (is_string($value)) {
 | 
						|
		$value = array_map('trim', explode($separator, $value));
 | 
						|
	}
 | 
						|
 | 
						|
	if (!is_array($value)) {
 | 
						|
		throw new \Exception('A string or array is expected.');
 | 
						|
	}
 | 
						|
 | 
						|
	$value = array_filter($value);
 | 
						|
	return $value;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Get attributes given an HTML tag.
 | 
						|
 *
 | 
						|
 * @param string $tag
 | 
						|
 * @return array
 | 
						|
 */
 | 
						|
function parse_attrs($tag)
 | 
						|
{
 | 
						|
	// Should be a valid html tag with attributes.	
 | 
						|
	preg_match('#<\w+\s*([^>]*)/?>#', $tag, $match);
 | 
						|
	if (!$match) {
 | 
						|
		return [];
 | 
						|
	}
 | 
						|
 | 
						|
	$attr_string = $match[1];
 | 
						|
 | 
						|
	$regex = '(?P<keys>[_a-zA-Z][-\w:.]*)'
 | 
						|
	. '(?:'               // Attribute value.
 | 
						|
	.     '\s*=\s*'       // All values begin with '='.
 | 
						|
	.     '(?:'
 | 
						|
	.         '"([^"]*)"'   // Double-quoted.
 | 
						|
	.     '|'
 | 
						|
	.         "'([^']*)'"   // Single-quoted.
 | 
						|
	.     '|'
 | 
						|
	.         '([^\s"\']+)' // Non-quoted.
 | 
						|
	.         '(?:\s|$)'  // Must have a space.
 | 
						|
	.     ')'
 | 
						|
	. '|'
 | 
						|
	.     '(?:\s|$)'      // If attribute has no value, space is required.
 | 
						|
	. ')';
 | 
						|
 | 
						|
	preg_match_all('#' . $regex . '#i', $attr_string, $matches);
 | 
						|
 | 
						|
	$attrs = [];
 | 
						|
	foreach ((array) $matches['keys'] as $i => $key) {
 | 
						|
 | 
						|
		// Any of the capturing groups for double-quoted, single-quoted or non-quoted.
 | 
						|
		$value = $matches[2][$i] ?: $matches[3][$i] ?: $matches[4][$i];
 | 
						|
		$attrs[$key] = $value;
 | 
						|
	}
 | 
						|
 | 
						|
	return $attrs;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Match an asset against a string based search.
 | 
						|
 *
 | 
						|
 * @param string $match        Search string.
 | 
						|
 * @param object $asset        Asset object. 
 | 
						|
 * @param string $search_prop  Property to search in.
 | 
						|
 * @return boolean
 | 
						|
 */
 | 
						|
function asset_match($match, $asset, $search_prop = 'url')
 | 
						|
{
 | 
						|
	$search_prop = $search_prop ?: 'url';
 | 
						|
	$search      = trim($match);
 | 
						|
 | 
						|
	// Starts with id: or url: - search in specific properties.
 | 
						|
	if (preg_match('/^(id|url):\s*(.+?)$/', $search, $matches)) {
 | 
						|
		$search_prop = $matches[1];
 | 
						|
		$search      = $matches[2];
 | 
						|
	}
 | 
						|
 | 
						|
	$search = preg_quote(trim($search));
 | 
						|
	$search = str_replace('\*', '(.+?)', $search);
 | 
						|
 | 
						|
	return preg_match('#' . $search . '#i', $asset->{$search_prop});
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Check if it's a call from Elementor Page Builder preview.
 | 
						|
 *
 | 
						|
 * @return boolean
 | 
						|
 */
 | 
						|
function is_elementor($preview_check = true)
 | 
						|
{
 | 
						|
	// Elmentor may use AJAX to get widget configs etc.
 | 
						|
	if (isset($_REQUEST['action']) && $_REQUEST['action'] === 'elementor_ajax') {
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
	
 | 
						|
	if (!class_exists('\Elementor\Plugin', false)) {
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	if ($preview_check && isset($_REQUEST['elementor-preview'])) {
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	return \Elementor\Plugin::$instance->editor->is_edit_mode();
 | 
						|
}
 | 
						|
 | 
						|
function debug_log($message)
 | 
						|
{
 | 
						|
	if (Plugin::get_instance()->env === 'dev') {
 | 
						|
		echo wp_kses_post($message); // phpcs:ignore WordPress.Security.EscapeOutput - Hardcoded debug output only enabled when environment is set to 'dev'.
 | 
						|
	}
 | 
						|
} |