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'.
 | |
| 	}
 | |
| } |