403Webshell
Server IP : 185.11.201.71  /  Your IP : 192.168.7.18
Web Server : Apache/2.4.29 (Ubuntu)
System : Linux tech-virtual-machine 4.15.0-213-generic #224-Ubuntu SMP Mon Jun 19 13:30:12 UTC 2023 x86_64
User : tech ( 1000)
PHP Version : 7.4.28
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
MySQL : OFF  |  cURL : OFF  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/html/wordpress/wp-content/plugins/editorplus/includes/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/wordpress/wp-content/plugins/editorplus/includes/utils.php
<?php
/**
 * Main file for plugin utilities
 *
 * @package EditorPlus
 */

/**
 * Will minify the given css
 *
 * @param string $input css.
 * @return string Minified css
 */
function editor_plus_minify_css( $input ) {
	if ( trim( $input ) === '' ) {
		return $input;
	}
	return preg_replace(
		array(
			// Remove comment(s).
			'#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')|\/\*(?!\!)(?>.*?\*\/)|^\s*|\s*$#s',
			// Remove unused white-space(s).
			'#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/))|\s*+;\s*+(})\s*+|\s*+([*$~^|]?+=|[{};,>~]|\s(?![0-9\.])|!important\b)\s*+|([[(:])\s++|\s++([])])|\s++(:)\s*+(?!(?>[^{}"\']++|"(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')*+{)|^\s++|\s++\z|(\s)\s+#si',
			// Replace `0(cm|em|ex|in|mm|pc|pt|px|vh|vw|%)` with `0`.
			'#(?<=[\s:])(0)(cm|em|ex|in|mm|pc|pt|px|vh|vw|%)#si',
			// Replace `:0 0 0 0` with `:0`.
			'#:(0\s+0|0\s+0\s+0\s+0)(?=[;\}]|\!important)#i',
			// Replace `background-position:0` with `background-position:0 0`.
			'#(background-position):0(?=[;\}])#si',
			// Replace `0.6` with `.6`, but only when preceded by `:`, `,`, `-` or a white-space.
			'#(?<=[\s:,\-])0+\.(\d+)#s',
			// Minify string value.
			'#(\/\*(?>.*?\*\/))|(?<!content\:)([\'"])([a-z_][a-z0-9\-_]*?)\2(?=[\s\{\}\];,])#si',
			'#(\/\*(?>.*?\*\/))|(\burl\()([\'"])([^\s]+?)\3(\))#si',
			// Minify HEX color code.
			'#(?<=[\s:,\-]\#)([a-f0-6]+)\1([a-f0-6]+)\2([a-f0-6]+)\3#i',
			// Replace `(border|outline):none` with `(border|outline):0`.
			'#(?<=[\{;])(border|outline):none(?=[;\}\!])#',
			// Remove empty selector(s).
			'#(\/\*(?>.*?\*\/))|(^|[\{\}])(?:[^\s\{\}]+)\{\}#s',
		),
		array(
			'$1',
			'$1$2$3$4$5$6$7',
			'$1',
			':0',
			'$1:0 0',
			'.$1',
			'$1$3',
			'$1$2$4$5',
			'$1$2$3',
			'$1:0',
			'$1$2',
		),
		$input
	);
}

/**
 * Checks if the current page has gutenberg editor.
 *
 * @return bool - true if editor exists, otherwise false.
 */
function editorplus_is_gutenberg_page() {

	// available via gutenberg plugin.
	if ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) {
		return true;
	}

	// available since WP 5.0.
	global $current_screen;

	if ( isset( $current_screen ) && method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) {
		return true;
	}

	return false;
}

/**
 * Will convert range to style css
 *
 * @param string $css_property - CSS Property that is used for this range.
 * @param array  $range - Range value.
 * @return string $style css.
 */
function editorplus_range_convert( $css_property, $range, $css_value = false ) {

	if ( ! is_array( $range ) ) {
		return '';
	}

	if ( ! array_key_exists( 'value', $range ) || ! array_key_exists( 'important', $range ) || ! array_key_exists( 'unit', $range ) ) {
		return '';
	}

	if ( empty( $range['value'] ) ) {
		return '';
	}

	$is_important = $range['important'] ? ' !important' : '';
	$css_style    = $range['value'] . $range['unit'];

	if ( is_string( $css_value ) ) {
		$css_style = sprintf( $css_value, $css_style );
	}

	return sprintf( '%1$s:%2$s%3$s;', $css_property, $css_style, $is_important );

}

/**
 * Will convert editorplus dimensions into actual css
 *
 * @param string $css_property - CSS Property that is used for this dimension.
 * @param array  $dimension - Dimension value.
 * @return string $style css.
 */
function editorplus_dimension_convert( $css_property, $dimension ) {

	$unit         = $dimension['unit'] ?? 'px';
	$is_important = $dimension['important'] ?? false;

	$has_top_dimension_val    = isset( $dimension['value']['top'] ) && '' !== $dimension['value']['top'];
	$has_right_dimension_val  = isset( $dimension['value']['right'] ) && '' !== $dimension['value']['right'];
	$has_bottom_dimension_val = isset( $dimension['value']['bottom'] ) && '' !== $dimension['value']['bottom'];
	$has_left_dimension_val   = isset( $dimension['value']['left'] ) && '' !== $dimension['value']['left'];

	if ( ! $has_top_dimension_val && ! $has_right_dimension_val && ! $has_bottom_dimension_val && ! $has_left_dimension_val ) {
		return '';
	}

	$top_dimension    = $has_top_dimension_val ? $dimension['value']['top'] : 0;
	$right_dimension  = $has_right_dimension_val ? $dimension['value']['right'] : 0;
	$bottom_dimension = $has_bottom_dimension_val ? $dimension['value']['bottom'] : 0;
	$left_dimension   = $has_left_dimension_val ? $dimension['value']['left'] : 0;

	// merging units in dimensions.
	if ( 'auto' !== $top_dimension ) {
		$top_dimension .= $unit;
	}

	if ( 'auto' !== $right_dimension ) {
		$right_dimension .= $unit;
	}

	if ( 'auto' !== $bottom_dimension ) {
		$bottom_dimension .= $unit;
	}

	if ( 'auto' !== $left_dimension ) {
		$left_dimension .= $unit;
	}

	$final_dimensions = array();
	$important        = $is_important ? ' !important' : '';

	if ( $has_top_dimension_val ) {
		$final_dimensions[] = sprintf( '%1$s-top:%2$s%3$s;', $css_property, $top_dimension, $important );
	}

	if ( $has_right_dimension_val ) {
		$final_dimensions[] = sprintf( '%1$s-right:%2$s%3$s;', $css_property, $right_dimension, $important );
	}

	if ( $has_bottom_dimension_val ) {
		$final_dimensions[] = sprintf( '%1$s-bottom:%2$s%3$s;', $css_property, $bottom_dimension, $important );
	}

	if ( $has_left_dimension_val ) {
		$final_dimensions[] = sprintf( '%1$s-left:%2$s%3$s;', $css_property, $left_dimension, $important );
	}

	return join( '', $final_dimensions );
}

/**
 * Usefull to convert position values to percentage values.
 *
 * @param int $value - Value to convert.
 * @return string - Percentage value, with percentage unti appended
 */
function editorplus_convert_position_to_percentage( $value ) {

	// Checking if the given string can be converted into an integer.
	if ( ctype_digit( $value ) ) {
		$value = (float) $value;
	}

	return ( $value * 100 ) . '%';

}

/**
 * Will convert editorplus typography (sub attribute) text style into CSS readable style
 *
 * @param array $attribute - Typography attribute.
 * @return string $css - Generated CSS Styles.
 */
function editorplus_convert_text_styles( $attribute ) {

	$text_styles = $attribute['textStyle'];

	$valid_text_decorations = array( 'underline', 'line-through' );
	$valid_text_styles      = array( 'italic' );
	$valid_text_transforms  = array( 'lowercase', 'uppercase', 'capitalize' );

	$generated_text_styles = '';

	// Looping over each text style.
	foreach ( $text_styles as $text_style ) {

		// Checking if it's a valid text-decoration.
		if ( in_array( $text_style, $valid_text_decorations, true ) ) {
			$generated_text_styles .= sprintf( 'text-decoration:%1$s;', $text_style );
			continue;
		}

		// Checking if it's a valid text-style.
		if ( in_array( $text_style, $valid_text_styles, true ) ) {
			$generated_text_styles .= sprintf( 'font-style:%1$s;', $text_style );
			continue;
		}

		// Checking if it's a valid text-transform.
		if ( in_array( $text_style, $valid_text_transforms, true ) ) {
			$generated_text_styles .= sprintf( 'text-transform:%1$s;', $text_style );
			continue;
		}
	}

	// Applying additional linethrough styles, only if it exists in the textstyles.
	if ( in_array( 'line-through', $text_styles, true ) && isset( $attribute['lineThrough'] ) ) {

		$linethrough_color = $attribute['lineThrough']['color'] ?? null;

		if ( ! is_null( $linethrough_color ) ) {
			$generated_text_styles .= sprintf( 'text-decoration-color:%1$s !important;', $linethrough_color );
		}

		$linethrough_style = $attribute['lineThrough']['style'] ?? null;

		if ( ! is_null( $linethrough_style ) ) {
			$generated_text_styles .= sprintf( 'text-decoration-style:%1$s !important;', $linethrough_style );
		}
	}

	// Applying additional underline styles, only if it exists in the textstyles.
	if ( in_array( 'underline', $text_styles, true ) && isset( $attribute['underline'] ) ) {

		$underline_color = $attribute['underline']['color'] ?? null;

		if ( ! is_null( $underline_color ) ) {
			$generated_text_styles .= sprintf( 'text-decoration-color:%1$s !important;', $underline_color );
		}

		$underline_style = $attribute['underline']['style'] ?? null;

		if ( ! is_null( $underline_style ) ) {
			$generated_text_styles .= sprintf( 'text-decoration-style:%1$s !important;', $underline_style );
		}
	}

	return $generated_text_styles;

}

/**
 * Will convert editorplus typography attribute into actual css style.
 *
 * @param array $attribute - Typography attribute.
 * @return string - CSS Styles.
 */
function editorplus_typography_convert( $attribute ) {

	$generated_typography_styles = '';

	if ( isset( $attribute['lineHeight'] ) ) {
		$generated_typography_styles .= editorplus_range_convert( 'line-height', $attribute['lineHeight'] );
	}

	if ( isset( $attribute['letterSpacing'] ) ) {
		$generated_typography_styles .= editorplus_range_convert( 'letter-spacing', $attribute['letterSpacing'] );
	}

	if ( isset( $attribute['fontSize'] ) ) {
		$generated_typography_styles .= editorplus_range_convert( 'font-size', $attribute['fontSize'] );
	}

	if ( isset( $attribute['textAlignment'] ) && '' !== $attribute['textAlignment'] ) {
		$generated_typography_styles .= sprintf( 'text-align:%1$s;', $attribute['textAlignment'] );
	}

	if ( isset( $attribute['textStyle'] ) ) {

		$generated_typography_styles .= editorplus_convert_text_styles( $attribute );

	}

	if ( isset( $attribute['textColor'] ) ) {

		$is_important = $attribute['textColor']['imp'] ?? false;
		$text_color   = $attribute['textColor']['color'] ?? null;

		if ( ! is_null( $text_color ) && '' !== $text_color ) {
			$generated_typography_styles .= sprintf(
				'color:%1$s%2$s;',
				$text_color,
				$is_important ? ' !important' : ''
			);
		}
	}

	if ( isset( $attribute['fontWeight'] ) ) {
		$generated_typography_styles .= sprintf( 'font-weight: %1$s;', $attribute['fontWeight'] );
	}

	return $generated_typography_styles;

}

/**
 * Will convert editorplus background attribute into actual css style.
 *
 * @param array $attribute - Background attribute.
 * @return string - CSS Styles.
 */
function editorplus_background_convert( $attribute ) {
	$generated_background_styles = '';

	$background_image = isset( $attribute['media'] ) && isset( $attribute['media']['background']['url'] ) ? sprintf(
		'url("%1$s")',
		$attribute['media']['background']['url']
	) : '';

	$background_placement = $attribute['media']['backgroundPlacement'] ?? 'back';

	// Checking if only solid background is needed.
	if ( isset( $attribute['solid'] ) && ! empty( $attribute['solid'] ) ) {

		$solid_background = array(
			sprintf( 'linear-gradient(%1$s,%1$s)', $attribute['solid'] ),
			$background_image,
		);

		// Reversing the order based on background placement.
		if ( 'back' !== $background_placement ) {
			$solid_background = array_reverse( $solid_background );
		}

		$solid_background = array_filter( $solid_background, 'strlen' );

		$generated_background_styles .= sprintf( 'background-image:%1$s;', join( ',', $solid_background ) );
	}

	// Checking if only gradient background is needed.
	if ( isset( $attribute['gradient'] ) && ! empty( $attribute['gradient'] ) ) {

		$gradient_background = array( $attribute['gradient'], $background_image );

		// Reversing the order, if the background placement is front.
		if ( 'back' !== $background_placement ) {
			$gradient_background = array_reverse( $gradient_background );
		}

		$gradient_background = array_filter( $gradient_background, 'strlen' );

		$generated_background_styles .= sprintf( 'background-image:%1$s;', join( ',', $gradient_background ) );
	}

	// Checking if only media is needed.
	if ( empty( $attribute['solid'] ) && empty( $attribute['gradient'] ) && ! empty( $background_image ) ) {
		$generated_background_styles .= sprintf( 'background-image:%1$s;', $background_image );
	}

	if ( isset( $attribute['media']['backgroundAttachment'] ) && '' !== $attribute['media']['backgroundAttachment'] ) {
		$generated_background_styles .= sprintf( 'background-attachment:%1$s;', $attribute['media']['backgroundAttachment'] );
	}

	if ( isset( $attribute['media']['backgroundRepeat'] ) && '' !== $attribute['media']['backgroundRepeat'] ) {
		$generated_background_styles .= sprintf( 'background-repeat:%1$s;', $attribute['media']['backgroundRepeat'] );
	}

	if ( isset( $attribute['media']['backgroundSize'] ) && '' !== $attribute['media']['backgroundSize'] ) {
		$generated_background_styles .= sprintf( 'background-size:%1$s;', $attribute['media']['backgroundSize'] );
	}

	if ( isset( $attribute['media']['backgroundPositionX'] ) && '' !== $attribute['media']['backgroundPositionX'] ) {
		$generated_background_styles .= sprintf(
			'background-position-x:%1$s;',
			editorplus_convert_position_to_percentage( $attribute['media']['backgroundPositionX'] )
		);
	}

	if ( isset( $attribute['media']['backgroundPositionY'] ) && '' !== $attribute['media']['backgroundPositionY'] ) {
		$generated_background_styles .= sprintf(
			'background-position-y:%1$s;',
			editorplus_convert_position_to_percentage( $attribute['media']['backgroundPositionY'] )
		);
	}

	return $generated_background_styles;
}

/**
 * Will convert editorplus box shadow attribute into actual css styles.
 *
 * @param array $attribute - Box shadow attributes.
 * @return string - CSS Styles.
 */
function editorplus_box_shadow_convert( $attribute ) {

	$is_important = $attribute['important'] ?? false;
	$important    = $is_important ? ' !important' : '';

	$is_inset = isset( $attribute['inset'] ) && true === $attribute['inset'];

	return sprintf(
		'box-shadow:%1$s %2$spx %3$spx %4$spx %5$spx %6$s%7$s;',
		$is_inset ? 'inset' : '',
		$attribute['horizontal'] ?? 0,
		$attribute['vertical'] ?? 0,
		$attribute['blurRadius'] ?? 0,
		$attribute['spreadRadius'] ?? 0,
		$attribute['shadowColor'] ?? '#000',
		$important
	);

}

/**
 * Will convert editorplus single border attribute into actual CSS.
 *
 * @param string $css_style - Borders CSS Style.
 * @param array  $attribute - Borders to convert.
 * @return string - CSS Styles.
 */
function editorplus_border_convert( $css_style, $attribute ) {

	$is_important = $attribute['important'] ?? false;

	if ( ! array_key_exists( 'area', $attribute ) || '' === $attribute['area'] ) {
		return '';
	}

	return sprintf(
		'%5$s:%1$spx %2$s %3$s%4$s;',
		$attribute['area'],
		$attribute['style'] ?? 'solid',
		$attribute['color'] ?? '#000000',
		$is_important ? ' !important' : '',
		$css_style
	);

}

/**
 * Will convert editorplus borders attribute into actual CSS.
 *
 * @param array $attribute - Borders to convert.
 * @return string - CSS Styles.
 */
function editorplus_borders_convert( $attribute ) {

	$generated_borders_css = array();

	if ( isset( $attribute['borderTop'] ) ) {
		$generated_borders_css[] = editorplus_border_convert( 'border-top', $attribute['borderTop'] );
	}

	if ( isset( $attribute['borderRight'] ) ) {
		$generated_borders_css[] = editorplus_border_convert( 'border-right', $attribute['borderRight'] );
	}

	if ( isset( $attribute['borderBottom'] ) ) {
		$generated_borders_css[] = editorplus_border_convert( 'border-bottom', $attribute['borderBottom'] );
	}

	if ( isset( $attribute['borderLeft'] ) ) {
		$generated_borders_css[] = editorplus_border_convert( 'border-left', $attribute['borderLeft'] );
	}

	// Checking if all borders are same, Merging them at one property of border if all are same.
	$all_borders_same = 1 === count( array_unique( $generated_borders_css ) );

	if ( $all_borders_same ) {
		return editorplus_border_convert( 'border', $attribute['borderAll'] );
	}

	return join( '', $generated_borders_css );
}

/**
 * Will convert editorplus border radius attribute into actual CSS.
 *
 * @param array $attribute - Border Radius to convert.
 * @return string - CSS Styles.
 */
function editorplus_border_radius_convert( $attribute ) {

	$is_important = $attribute['important'] ?? false;

	return sprintf(
		'border-radius:%1$s%5$s %2$s%5$s %3$s%5$s %4$s%5$s%6$s;',
		isset( $attribute['value']['top'] ) && '' !== $attribute['value']['top'] ? $attribute['value']['top'] : 0,
		isset( $attribute['value']['right'] ) && '' !== $attribute['value']['right'] ? $attribute['value']['right'] : 0,
		isset( $attribute['value']['bottom'] ) && '' !== $attribute['value']['bottom'] ? $attribute['value']['bottom'] : 0,
		isset( $attribute['value']['left'] ) && '' !== $attribute['value']['left'] ? $attribute['value']['left'] : 0,
		$attribute['unit'] ?? '%',
		$is_important ? ' !important' : ''
	);

}


/**
 * Will convert editorplus margin attribute into actual CSS.
 *
 * @param array $attribute - Margin to convert.
 * @return string - CSS Styles.
 */
function editorplus_margin_convert( $attribute ) {
	return editorplus_dimension_convert( 'margin', $attribute );
}


/**
 * Will convert editorplus padding attribute into actual CSS.
 *
 * @param array $attribute - padding to convert.
 * @return string - CSS Styles.
 */
function editorplus_padding_convert( $attribute ) {
	return editorplus_dimension_convert( 'padding', $attribute );
}

/**
 * Will convert editorplus sizing attribute into actual CSS.
 *
 * @param array $attribute - sizing to convert.
 * @return string - CSS Styles.
 */
function editorplus_sizing_convert( $attribute ) {

	$generated_sizing_styles = '';

	if ( isset( $attribute['height'] ) ) {
		$generated_sizing_styles .= editorplus_range_convert( 'height', $attribute['height'] );
	}

	if ( isset( $attribute['width'] ) ) {
		$generated_sizing_styles .= editorplus_range_convert( 'width', $attribute['width'] );
	}

	if ( isset( $attribute['maxWidth'] ) ) {
		$generated_sizing_styles .= editorplus_range_convert( 'max-width', $attribute['maxWidth'] );
	}

	if ( isset( $attribute['maxHeight'] ) ) {
		$generated_sizing_styles .= editorplus_range_convert( 'max-height', $attribute['maxHeight'] );
	}

	return $generated_sizing_styles;

}

/**
 * Will convert editorplus transition into actual CSS.
 *
 * @param array $attribute - transition to convert.
 * @return string - CSS Styles.
 */
function editorplus_transition_convert( $attribute ) {

	if ( ! isset( $attribute['duration'] ) ) {
		return '';
	}

	if ( '' === $attribute['duration'] ) {
		return '';
	}

	$is_important = $attribute['important'] ?? false;

	return sprintf(
		'transition:%1$sms %2$sms %3$s%4$s;',
		$attribute['duration'],
		isset( $attribute['delay'] ) && '' !== $attribute['delay'] ? $attribute['delay'] : 0,
		isset( $attribute['speedCurve'] ) && '' !== $attribute['speedCurve'] ? $attribute['speedCurve'] : 'ease',
		$is_important ? ' !important' : ''
	);

}

/**
 * Will convert editorplus extra attribute into actual CSS.
 *
 * @param array $attribute - extras to convert.
 * @return string - CSS Styles.
 */
function editorplus_extras_convert( $attribute ) {

	$generated_extra_styles = '';

	if ( isset( $attribute['zIndex'] ) ) {

		$has_z_index          = '' !== $attribute['zIndex']['value'];
		$is_z_index_important = $attribute['zIndex']['important'] ?? false;

		if ( $has_z_index ) {
			$generated_extra_styles .= sprintf(
				'z-index:%1$s%2$s;',
				$attribute['zIndex']['value'],
				$is_z_index_important ? ' !important' : ''
			);
		}
	}

	if ( isset( $attribute['overflow'] ) ) {

		$has_overflow          = '' !== $attribute['overflow']['value'];
		$is_overflow_important = $attribute['overflow']['important'] ?? false;

		if ( $has_overflow ) {
			$generated_extra_styles .= sprintf(
				'overflow:%1$s%2$s;',
				$attribute['overflow']['value'],
				$is_overflow_important ? ' !important' : ''
			);
		}
	}

	if ( isset( $attribute['hide'] ) ) {

		$has_display          = '' !== $attribute['hide']['property'];
		$is_display_important = $attribute['hide']['important'] ?? false;

		if ( $has_display ) {
			$generated_extra_styles .= sprintf(
				'display:%1$s%2$s;',
				$attribute['hide']['property'],
				$is_display_important ? ' !important' : ''
			);
		}
	}

	if ( isset( $attribute['transition'] ) ) {
		$generated_extra_styles .= editorplus_transition_convert( $attribute['transition'] );
	}

	return $generated_extra_styles;

}

/**
 * Will check if the given extension is enabled or not
 *
 * @param string $extension_slug - Extension to test.
 * @return bool - True if enabled, otherwise false.
 */
function editorplus_is_extension_enabled( $extension_slug ) {

	if ( ! is_string( $extension_slug ) ) {
		return false;
	}

	$option_key       = 'editor_plus_extensions_' . $extension_slug . '__enable';
	$extension_status = get_option( $option_key, true );

	if ( '1' === $extension_status || true === $extension_status ) {
		return true;
	}

	return false;
}

/**
 * Will convert editorplus custom css attribute into actual CSS by replacing the selector.
 *
 * @param array $attribute - custom css.
 * @param array $selector - css selector.
 * @return string - CSS Styles.
 */
function editorplus_customcss_convert( $attribute, $selector ) {

	$with_selector = str_replace( 'selector', '.' . $selector, $attribute );

	return $with_selector;

}

/**
 * Will generate editorplus style tag.
 *
 * @param string $selector - CSS Selector.
 * @param string $desktop_styles - Desktop CSS Style.
 * @param string $tablet_styles - Tablet CSS Style.
 * @param string $mobile_styles - Mobile CSS Style.
 * @param string $hover_styles - Hover CSS Style.
 * @param string $additional_styles - Any additional styles to merge.
 *
 * @return string - CSS Styles.
 */
function editorplus_generate_css_output( $selector, $desktop_styles, $tablet_styles, $mobile_styles, $hover_styles, $additional_styles = '' ) {

	// Generating output for desktop.
	$generated_styles_output = sprintf(
		'.%1$s {%2$s}',
		$selector,
		$desktop_styles
	);

	// Generating output for tablet, if needed.
	if ( '' !== $tablet_styles ) {
		$generated_styles_output .= editorplus_generate_css_output_for( '.' . $selector, 'Tablet', $tablet_styles );
	}

	// Generating output for mobile, if needed.
	if ( '' !== $mobile_styles ) {
		$generated_styles_output .= editorplus_generate_css_output_for( '.' . $selector, 'Mobile', $mobile_styles );
	}

	// Generating output for hover, if needed.
	if ( '' !== $hover_styles ) {
		$generated_styles_output .= editorplus_generate_css_output_for( '.' . $selector, 'Hover', $hover_styles );
	}

	$generated_styles_output .= $additional_styles;

	return $generated_styles_output;
}

/**
 * Will generate editorplus css output for a certain device or breakpoint/hover.
 *
 * @param string $selector - CSS Selector.
 * @param string $type - Style Type.
 * @param string $css_output - CSS Styles.
 */
function editorplus_generate_css_output_for( $selector, $type, $css_output ) {

	if ( '' === $css_output ) {
		return '';
	}

	if ( 'Desktop' === $type ) {
		return sprintf(
			'%1$s {%2$s}',
			$selector,
			$css_output
		);
	}

	if ( 'Tablet' === $type ) {
		return sprintf(
			'@media (max-width: 981px) { %1$s { %2$s } }',
			$selector,
			$css_output
		);
	}

	if ( 'Mobile' === $type ) {
		return sprintf(
			'@media (max-width: 600px) { %1$s { %2$s } }',
			$selector,
			$css_output
		);
	}

	if ( 'Hover' === $type ) {

		$declaration = false !== stripos( $selector, ':hover' ) ? '%1$s{ %2$s }' : '%1$s:hover { %2$s }';

		return sprintf(
			$declaration,
			$selector,
			$css_output
		);
	}

	return '';

}


/**
 * Will generate editorplus raw css output for a certain device or breakpoint/hover.
 *
 * @param string $type - Style Type.
 * @param string $css_output - CSS Styles.
 */
function editorplus_generate_raw_css_output_for( $type, $css_output ) {

	if ( '' === $css_output ) {
		return '';
	}

	if ( 'Desktop' === $type ) {
		return $css_output;
	}

	if ( 'Tablet' === $type ) {
		return sprintf(
			'@media (max-width: 981px) { %1$s }',
			$css_output
		);
	}

	if ( 'Mobile' === $type ) {
		return sprintf(
			'@media (max-width: 600px) { %1$s }',
			$css_output
		);
	}

	return '';

}

/**
 * Will convert editorplus extended list block into css styling.
 *
 * @param array  $block - Block to generate styles.
 * @param string $selector - block selector.
 * @return string - CSS Styles.
 */
function editorplus_convert_extended_list_block( $block, $selector ) {

	if ( ! is_array( $block ) || ! array_key_exists( 'attrs', $block ) ) {
		return '';
	}

	$attributes = $block['attrs'];

	$is_ordered_list = false !== stripos( $block['innerHTML'], '</ol>' );
	$use_icon        = false !== stripos( $block['innerHTML'], 'ep-custom-icon-list' );

	$generated_styles        = '';
	$generated_tablet_styles = '';
	$generated_mobile_styles = '';
	$generated_hover_styles  = '';
	$additional_styles       = '';

	if ( isset( $attributes['columns'] ) && '' !== $attributes['columns'] ) {
		$generated_styles        .= editorplus_range_convert( 'grid-template-columns', $attributes['columns']['desktop'], 'repeat(%1$s, 1fr)' );
		$generated_tablet_styles .= editorplus_range_convert( 'grid-template-columns', $attributes['columns']['tablet'], 'repeat(%1$s, 1fr)' );
		$generated_mobile_styles .= editorplus_range_convert( 'grid-template-columns', $attributes['columns']['mobile'], 'repeat(%1$s, 1fr)' );
		$generated_hover_styles  .= editorplus_range_convert( 'grid-template-columns', $attributes['columns']['hover'], 'repeat(%1$s, 1fr)' );
	}

	if ( isset( $attributes['itemsSpacing'] ) && '' !== $attributes['itemsSpacing'] ) {
		$generated_styles        .= editorplus_range_convert( 'grid-gap', $attributes['itemsSpacing']['desktop'] );
		$generated_tablet_styles .= editorplus_range_convert( 'grid-gap', $attributes['itemsSpacing']['tablet'] );
		$generated_mobile_styles .= editorplus_range_convert( 'grid-gap', $attributes['itemsSpacing']['mobile'] );
		$generated_hover_styles  .= editorplus_range_convert( 'grid-gap', $attributes['itemsSpacing']['hover'] );
	}

	if ( $use_icon && isset( $attributes['icon'] ) ) {

		$use_icon_declaration = '.%1$s li::before { %2$s %3$s %4$s %5$s %6$s %7$s }';

		$additional_styles .= sprintf(
			$use_icon_declaration,
			$selector,
			'' !== $attributes['icon']['desktop']['icon'] ? sprintf( 'content: var(--%1$s);', $attributes['icon']['desktop']['icon'] ) : '',
			'' !== $attributes['iconBackground']['desktop']['color'] ? sprintf( 'background-color:%1$s;', $attributes['iconBackground']['desktop']['color'] ) : '',
			'' !== $attributes['iconColor']['desktop']['color'] ? sprintf( 'color:%1$s;', $attributes['iconColor']['desktop']['color'] ) : '',
			editorplus_range_convert( 'font-size', $attributes['iconSize']['desktop'] ),
			editorplus_range_convert( 'border-radius', $attributes['iconRadius']['desktop'] ),
			editorplus_range_convert( 'padding', $attributes['iconPadding']['desktop'] )
		);

		$additional_styles .= editorplus_generate_raw_css_output_for(
			'Tablet',
			sprintf(
				$use_icon_declaration,
				$selector,
				'' !== $attributes['icon']['tablet']['icon'] ? sprintf( 'content: var(--%1$s);', $attributes['icon']['tablet']['icon'] ) : '',
				'' !== $attributes['iconBackground']['tablet']['color'] ? sprintf( 'background-color:%1$s;', $attributes['iconBackground']['tablet']['color'] ) : '',
				'' !== $attributes['iconColor']['tablet']['color'] ? sprintf( 'color:%1$s;', $attributes['iconColor']['tablet']['color'] ) : '',
				editorplus_range_convert( 'font-size', $attributes['iconSize']['tablet'] ),
				editorplus_range_convert( 'border-radius', $attributes['iconRadius']['tablet'] ),
				editorplus_range_convert( 'padding', $attributes['iconPadding']['tablet'] )
			)
		);

		$additional_styles .= editorplus_generate_raw_css_output_for(
			'Mobile',
			sprintf(
				$use_icon_declaration,
				$selector,
				'' !== $attributes['icon']['mobile']['icon'] ? sprintf( 'content: var(--%1$s);', $attributes['icon']['mobile']['icon'] ) : '',
				'' !== $attributes['iconBackground']['mobile']['color'] ? sprintf( 'background-color:%1$s;', $attributes['iconBackground']['mobile']['color'] ) : '',
				'' !== $attributes['iconColor']['mobile']['color'] ? sprintf( 'color:%1$s;', $attributes['iconColor']['mobile']['color'] ) : '',
				editorplus_range_convert( 'font-size', $attributes['iconSize']['mobile'] ),
				editorplus_range_convert( 'border-radius', $attributes['iconRadius']['mobile'] ),
				editorplus_range_convert( 'padding', $attributes['iconPadding']['mobile'] )
			)
		);

		if ( '' !== $attributes['icon']['hover']['icon'] ) {
			$additional_styles .= sprintf(
				'.%1$s li:hover:before { %2$s %3$s %4$s %5$s %6$s %7$s }',
				$selector,
				'' !== $attributes['icon']['hover']['icon'] ? sprintf( 'content: var(--%1$s);', $attributes['icon']['hover']['icon'] ) : '',
				$attributes['iconBackground']['hover']['color'] ? sprintf( 'background-color:%1$s;', $attributes['iconBackground']['hover']['color'] ) : '',
				$attributes['iconColor']['hover']['color'] ? sprintf( 'color:%1$s;', $attributes['iconColor']['hover']['color'] ) : '',
				editorplus_range_convert( 'font-size', $attributes['iconSize']['hover'] ),
				editorplus_range_convert( 'border-radius', $attributes['iconRadius']['hover'] ),
				editorplus_range_convert( 'padding', $attributes['iconPadding']['hover'] )
			);
		}
	}

	if ( ! $is_ordered_list && false === $use_icon ) {
		if ( isset( $attributes['unorderListStyle'] ) && '' !== $attributes['unorderListStyle'] ) {
			$generated_styles        .= sprintf( 'list-style-type:%1$s;', $attributes['unorderListStyle']['desktop'] );
			$generated_tablet_styles .= sprintf( 'list-style-type:%1$s;', $attributes['unorderListStyle']['tablet'] );
			$generated_mobile_styles .= sprintf( 'list-style-type:%1$s;', $attributes['unorderListStyle']['mobile'] );
			$generated_hover_styles  .= sprintf( 'list-style-type:%1$s;', $attributes['unorderListStyle']['hover'] );
		}
	} elseif ( $is_ordered_list && false === $use_icon ) {
		if ( isset( $attributes['orderListStyle'] ) && '' !== $attributes['orderListStyle'] ) {
			$generated_styles        .= sprintf( 'list-style-type:%1$s;', $attributes['orderListStyle']['desktop'] );
			$generated_tablet_styles .= sprintf( 'list-style-type:%1$s;', $attributes['orderListStyle']['tablet'] );
			$generated_mobile_styles .= sprintf( 'list-style-type:%1$s;', $attributes['orderListStyle']['mobile'] );
			$generated_hover_styles  .= sprintf( 'list-style-type:%1$s;', $attributes['orderListStyle']['hover'] );
		}
	}

	return editorplus_generate_css_output(
		$selector,
		$generated_styles,
		$generated_tablet_styles,
		$generated_mobile_styles,
		$generated_hover_styles,
		$additional_styles
	);

}

/**
 * Will convert editorplus extended columns block into css styling.
 *
 * @param array  $block - Block to generate styles.
 * @param string $selector - block selector.
 * @return string - CSS Styles.
 */
function editorplus_convert_extended_columns_block( $block, $selector ) {

	if ( ! is_array( $block ) || ! array_key_exists( 'attrs', $block ) ) {
		return '';
	}

	$is_disabled = false === stripos( $block['innerHTML'], 'ep-custom-column' );

	if ( $is_disabled ) {
		return '';
	}

	$attributes = $block['attrs'];

	$generated_styling        = '';
	$generated_tablet_styling = '';
	$generated_mobile_styling = '';
	$generated_hover_styling  = '';

	if ( isset( $attributes['epCustomColumnsSpacing'] ) && '' !== $attributes['epCustomColumnsSpacing'] ) {
		$generated_styling        .= editorplus_range_convert( 'gap', $attributes['epCustomColumnsSpacing']['desktop'] );
		$generated_tablet_styling .= editorplus_range_convert( 'gap', $attributes['epCustomColumnsSpacing']['tablet'] );
		$generated_mobile_styling .= editorplus_range_convert( 'gap', $attributes['epCustomColumnsSpacing']['mobile'] );
	}

	if ( isset( $attributes['epCustomColumnsReverse'] ) && '' !== $attributes['epCustomColumnsReverse'] ) {
		$generated_styling        .= sprintf( 'flex-direction:%1$s;', $attributes['epCustomColumnsReverse']['desktop'] );
		$generated_tablet_styling .= sprintf( 'flex-direction:%1$s;', $attributes['epCustomColumnsReverse']['tablet'] );
		$generated_mobile_styling .= sprintf( 'flex-direction:%1$s;', $attributes['epCustomColumnsReverse']['mobile'] );
	}

	return editorplus_generate_css_output(
		$selector,
		$generated_styling,
		$generated_tablet_styling,
		$generated_mobile_styling,
		$generated_hover_styling
	);
}

/**
 * Will generate icon styles.
 *
 * @param string $viewport - Viewport.
 * @param string $attributes - Attributes.
 */
function editorplus_get_icon_with_styles( $viewport, $attributes ) {

	$icon_alignment = '' !== $attributes['epCustomButtonsAlignment'][ $viewport ] ? $attributes['epCustomButtonsAlignment'][ $viewport ] : $attributes['epCustomButtonsAlignment']['desktop'];
	$pseudo         = 'right' !== $icon_alignment ? 'epCustomButtonIconBefore' : 'epCustomButtonIconAfter';

	$icon_background_color = $attributes['epCustomIconBackground'][ $viewport ]['color'] ?? '';
	$icon_color            = $attributes['epCustomIconColor'][ $viewport ]['color'] ?? '';
	$icon_radius           = $attributes['epCustomIconRadius'][ $viewport ];
	$icon_padding          = $attributes['epCustomIconPadding'][ $viewport ];
	$icon_spacing          = 'epCustomButtonIconAfter' === $pseudo ? $attributes['epCustomAfterIconSpace'][ $viewport ] : $attributes['epCustomBeforeIconSpace'][ $viewport ];

	return sprintf(
		'%1$s %2$s %3$s %4$s %5$s %6$s',
		'' !== $attributes[ $pseudo ][ $viewport ]['icon'] ? sprintf( 'content: var(--%1$s);', $attributes[ $pseudo ][ $viewport ]['icon'] ) : '',
		'' !== $icon_background_color ? sprintf( 'background-color:%1$s;', $icon_background_color ) : '',
		'' !== $icon_color ? sprintf( 'color:%1$s;', $icon_color ) : '',
		editorplus_range_convert( 'border-radius', $icon_radius ),
		editorplus_range_convert( 'padding', $icon_padding ),
		editorplus_range_convert( 'epCustomButtonIconAfter' === $pseudo ? 'margin-left' : 'margin-right', $icon_spacing )
	);
}


/**
 * Will convert editorplus extended button block into css styling.
 *
 * @param array  $block - Block to generate styles.
 * @param string $selector - block selector.
 * @return string - CSS Styles.
 */
function editorplus_convert_extended_button_block( $block, $selector ) {

	// TODO: This is a little buggy 🐞.

	if ( ! is_array( $block ) || ! array_key_exists( 'attrs', $block ) ) {
		return '';
	}

	$attributes = $block['attrs'];
	$use_icon   = false !== stripos( $block['innerHTML'], 'ep-custom-buttons-icon' );

	$generated_styling = '';

	if ( false === $use_icon ) {
		return '';
	}

	$generated_icon_desktop_styling = editorplus_get_icon_with_styles( 'desktop', $attributes );

	if ( '' !== trim( $generated_icon_desktop_styling ) ) {
		$generated_styling .= editorplus_generate_raw_css_output_for(
			'Desktop',
			sprintf(
				'.%1$s .wp-block-button__link:%2$s { %3$s }',
				$selector,
				'right' !== $attributes['epCustomButtonsAlignment']['desktop'] ? 'before' : 'after',
				$generated_icon_desktop_styling
			)
		);
	}

	$generated_icon_tablet_styling = editorplus_get_icon_with_styles( 'tablet', $attributes );

	if ( '' !== trim( $generated_icon_tablet_styling ) ) {
		$generated_styling .= editorplus_generate_raw_css_output_for(
			'Tablet',
			sprintf(
				'.%1$s .wp-block-button__link:%2$s { %3$s }',
				$selector,
				'right' !== $attributes['epCustomButtonsAlignment']['tablet'] ? 'before' : 'after',
				$generated_icon_tablet_styling
			)
		);
	}

	$generated_icon_mobile_styling = editorplus_get_icon_with_styles( 'mobile', $attributes );

	if ( '' !== trim( $generated_icon_mobile_styling ) ) {
		$generated_styling .= editorplus_generate_raw_css_output_for(
			'Mobile',
			sprintf(
				'.%1$s .wp-block-button__link:%2$s { %3$s }',
				$selector,
				'right' !== $attributes['epCustomButtonsAlignment']['mobile'] ? 'before' : 'after',
				$generated_icon_mobile_styling
			)
		);
	}

	$generated_icon_hover_styling = editorplus_get_icon_with_styles( 'desktop', $attributes );

	if ( '' !== trim( $generated_icon_hover_styling ) ) {
		$generated_styling .= sprintf(
			'.%1$s .wp-block-button__link:hover:%2$s { %3$s }',
			$selector,
			'right' !== $attributes['epCustomButtonsAlignment']['hover'] ? 'before' : 'after',
			$generated_icon_hover_styling
		);
	}

	return $generated_styling;

}

/**
 * Will convert editorplus animation.
 *
 * @param array  $block - block to apply.
 * @param string $selector - block selector.
 * @return string - CSS Styles.
 */
function editorplus_animation_convert( $block, $selector ) {

	if ( ! is_array( $block ) || ! isset( $block['attrs'] ) ) {
		return '';
	}

	$attributes         = $block['attrs']['epCustomAnimation'];
	$animation_selector = $block['attrs']['epAnimationGeneratedClass'] ?? '';

	if ( '' !== $attributes['type'] ) {

		$animation_direction                   = 'center' === $attributes['direction'] ? '' : ucfirst( $attributes['direction'] );
		$animation_iteration_count             = 'repeat' === $attributes['repeat'] ? 'Infinite' : '1';
		$animation_with_unsupported_directions = array( 'fade', 'roll', 'zoom' );

		if ( in_array( $attributes['type'], $animation_with_unsupported_directions, true ) ) {
			$animation_direction = '';
		}

		return sprintf(
			'.%6$s {animation: editor-plus-%1$s %2$ss %3$s %4$ss %5$s forwards}',
			$attributes['type'] . $animation_direction,
			$attributes['duration'],
			$attributes['speedCurve'] ?? 'ease',
			$attributes['delay'] ?? 0,
			$animation_iteration_count,
			join( '.', array( $selector, $animation_selector ) )
		);
	}

	return '';
}

/**
 * Will provide editorplus block selector based on the block name.
 *
 * @param string $selector - CSS Selector.
 * @param string $block_name - Block name which is being selected.
 *
 * @return string - block selector.
 */
function editorplus_get_block_selector( $selector, $block_name ) {

	switch ( $block_name ) {

		case 'core/button':
			return sprintf( '%1$s a', $selector );

		case 'core/image':
			return sprintf( '%1$s img', $selector );

		default:
			return $selector;

	}

}

/**
 * Will convert editorplus shape divider for before pseudo.
 *
 * @param array  $block - Block to apply shape divider to.
 * @param string $selector - block selector.
 * @return string CSS Styles - Shape divider in a css string.
 */
function editorplus_shape_divider_convert( $block, $selector ) {

	if ( ! is_array( $block ) || ! isset( $block['attrs'] ) ) {
		return '';
	}

	$attributes    = $block['attrs'];
	$shape_divider = $attributes['epCustomShapeDividerBefore'];

	$position    = $shape_divider['position'] ?? 'top';
	$flip        = $shape_divider['flip'] ?? false;
	$arrangement = $shape_divider['arrangement'] ?? 'top';
	$color       = $shape_divider['color'] ?? '#000000';
	$style       = $shape_divider['style'] ?? '';

	if ( '' === $style ) {
		return '';
	}

	$generated_divider_styles = 'content:"";background-size:100% 100%;position:absolute;';

	if ( isset( $shape_divider['height'] ) && '' !== $shape_divider['height'] ) {
		$generated_divider_styles .= editorplus_range_convert( 'height', $shape_divider['height'] );
	}

	if ( isset( $shape_divider['width'] ) && '' !== $shape_divider['width'] ) {
		$generated_divider_styles .= editorplus_range_convert( 'width', $shape_divider['width'] );
	}

	if ( 'top' === $position ) {
		$generated_divider_styles .= 'top:0!important;left:0!important;';
	} else {
		$generated_divider_styles .= 'bottom:0!important;left:0!important;';
	}

	// Updating the selected color in svg code.
	$style = preg_replace( '/fill="#\w+"/', sprintf( 'fill="%1$s"', $color ), $style );

	// For flipping the divider.
	$transforms  = '';
	$transforms .= $flip ? 'rotateY(180deg)' : '';
	$transforms .= 'bottom' === $position ? 'rotateX(180deg)' : '';

	if ( '' !== $transforms ) {
		$generated_divider_styles .= sprintf( 'transform:%1$s;', $transforms );
	}

	// For pushing the divider back.
	$generated_divider_styles .= 'underneath' === $arrangement ? 'z-index:-1;' : 'z-index:99;';

	$encoded_svg = rawurlencode( str_replace( array( "\r", "\n" ), ' ', $style ) );

	return sprintf(
		'%1$s {position:relative;} %1$s:before { %2$s background-image:url(%3$s); }',
		'.' . $selector,
		$generated_divider_styles,
		'data:image/svg+xml;utf8,' . $encoded_svg
	);

}

/**
 * Will provide a unique selector for the given block.
 *
 * @param array $block - block to find unique selector in.
 *
 * @return string - Selector.
 */
function editorplus_get_block_unique_selector( $block ) {

	if ( ! isset( $block['innerHTML'] ) ) {
		return isset( $block['attrs']['epGeneratedClass'] ) ? $block['attrs']['epGeneratedClass'] : '';
	}

	$block = apply_filters( 'render_block', $block['innerHTML'], $block );

	$matched_selector = array();

	preg_match( '(eplus-styles-uid-\w+)', $block, $matched_selector );

	return reset( $matched_selector );
}


/**
 * Will generate editorplus unique classname for the block.
 *
 * @param array $block - Block to generate unique id for.
 * @return string - Unique id for the block.
 */
function editorplus_generate_unique_uid_for_block( $block ) {

	// Editorplus styling attributes.
	$styling_attributes = editorplus_get_block_styling_attributes( $block );

	// Creating a unique hash from these attributes.
	// This id will only be changed if the user changes the editorplus attributes.
	// Doing so, will allow us to group multiple same styles attributes into one css declaration.
	$unique_block_id = md5( wp_json_encode( $styling_attributes ) );

	// Providing the first 5 unique hash characters.
	if ( strlen( $unique_block_id ) > 5 ) {
		$unique_block_id = substr( $unique_block_id, 0, 6 );
	}

	return $unique_block_id;
}

Youez - 2016 - github.com/yon3zu
LinuXploit