Files
roi-theme/wp-content/plugins/wp-marketing-automations-pro/crm/includes/class-bwfcrm-block-editor.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

383 lines
14 KiB
PHP
Executable File

<?php
/**
* Block editor Controller Class
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* BWFCRM_Block_Editor class
*/
class BWFCRM_Block_Editor {
/**
* Email editor global settings data
* @assign value by BWFCRM_Block_Editor::get_prepared_email_data
*/
public static $global_settings = [];
/**
* Email editor global var settings data
* @var array
*/
public static $global_settings_var = [];
/**
* Class constructor
*/
public function __construct() {
$this->load_modules();
self::set_global_css_variables();
add_shortcode( 'bwfbe_email_block_visibility', [ $this, 'bwfan_email_block_visibility' ] );
add_shortcode( 'bwfan_email_block_visibility', [ $this, 'bwfan_email_block_visibility' ] );
}
/**
* Validates block editor rules and returns blocks content
*
* @param $atts
* @param $content
*
* @return mixed|string
*/
public function bwfan_email_block_visibility( $atts, $content ) {
$rules = [];
if ( isset( $atts['rules'] ) ) {
$rules = json_decode( mb_convert_encoding( urldecode( $atts['rules'] ), 'ISO-8859-1', 'UTF-8' ), true );
}
if ( ! class_exists( 'BWFAN_Generic_Rule_Controller' ) ) {
return BWFAN_Common::decode_merge_tags( $content );
}
$generic_rule_ins = new BWFAN_Generic_Rule_Controller( $rules );
if ( $generic_rule_ins->is_match() ) {
// Check for conditional content includes block shortcodes
$content2 = urldecode( str_replace( "%u", "\u", $content ) );
$pattern = '/\\[bwfbe_.*?\\](.*?)\\[\\/bwfbe_.*?\\]/s';
preg_match_all( $pattern, $content2, $closing_merge_tags );
$closetags = $closing_merge_tags[0] ?? [];
// If conditional content includes block shortcodes do conditional decoding
if( ! empty( $closetags ) ) {
$new_content = self::handle_conditional_decoding( $content );
} else { // If conditional content does not include block shortcodes do normal decoding
$new_content = self::decode_content( $content, true );
}
// fallback if decoding fails
if ( empty( $new_content ) ) {
$new_content = self::decode_content( $content, true );
}
$content = html_entity_decode( $new_content );
$content = method_exists( 'BWFAN_Common', 'correct_shortcode_string' ) ? BWFAN_Common::correct_shortcode_string( $content, 5 ) : $content;
$content = do_shortcode( $content );
$content = BWFAN_Common::decode_merge_tags( $content );
return $content;
}
return '';
}
/**
* Load blocks data
*
* @return void
*/
public function load_modules() {
if( ! class_exists( 'BWF_EMAILBLOCKS_CSS' ) ) {
require_once BWFAN_PRO_PLUGIN_DIR . '/crm/includes/block-editor/email-editor/class-css-functions.php';
}
if ( bwfan_is_woocommerce_active() && ! class_exists( 'BWFBE_WC_BLOCKS' ) ) {
require_once BWFAN_PRO_PLUGIN_DIR . '/crm/includes/block-editor/modules/wcblocks/wc-blocks.php';
}
}
public static function get_product_placeholder() {
return BWFAN_PRO_PLUGIN_URL . '/crm/includes/block-editor/img/placeholder.png';
}
/**
* Handle block editor attributes
*
* @param $content
* @param $decode
* @param $is_attribute
*
* @return array|false|mixed|string|string[]|null
*/
public static function decode_content( $content = '', $decode = false, $is_attribute = true ) {
$content = $is_attribute ? urldecode( str_replace( "%u", "\u", $content ) ) : urldecode( $content );
// for decoding utf-16 character
$content = preg_replace_callback( '/%u([0-9A-F]{4})%u([0-9A-F]{4})/', function ( $matches ) {
$surrogate1 = hexdec( $matches[1] );
$surrogate2 = hexdec( $matches[2] );
if ( $surrogate1 >= 0xD800 && $surrogate1 <= 0xDBFF && $surrogate2 >= 0xDC00 && $surrogate2 <= 0xDFFF ) {
$codePoint = 0x10000 + ( ( $surrogate1 - 0xD800 ) << 10 ) + ( $surrogate2 - 0xDC00 );
return mb_convert_encoding( pack( 'N', $codePoint ), 'UTF-8', 'UTF-32BE' );
} else {
return '';
}
}, $content );
// decode unicode
$content = preg_replace_callback( "/%u([0-9a-fA-F]{4})/", function ( $match ) {
return mb_convert_encoding( pack( 'H*', $match[1] ), 'UTF-8', 'UCS-2BE' );
}, $content );
if ( mb_detect_encoding($content, 'UTF-8', true ) !== 'UTF-8' ) {
$content = mb_convert_encoding( $content, 'UTF-8', 'ISO-8859-1' );
}
return $decode ? json_decode( $content ) : $content;
}
/**
* Handle conditional decoding
*
* @param $content
*
* @return mixed
*/
public static function handle_conditional_decoding( $content ) {
// decode unicode
$content = preg_replace_callback( "/%u([0-9a-fA-F]{4})/", function ( $match ) {
return mb_convert_encoding( pack( 'H*', $match[1] ), 'UTF-8', 'UCS-2BE' );
}, $content );
// for decoding utf-16 character
$content = preg_replace_callback( '/%u([0-9A-F]{4})%u([0-9A-F]{4})/', function ( $matches ) {
$surrogate1 = hexdec( $matches[1] );
$surrogate2 = hexdec( $matches[2] );
if ( $surrogate1 >= 0xD800 && $surrogate1 <= 0xDBFF && $surrogate2 >= 0xDC00 && $surrogate2 <= 0xDFFF ) {
$codePoint = 0x10000 + ( ( $surrogate1 - 0xD800 ) << 10 ) + ( $surrogate2 - 0xDC00 );
return mb_convert_encoding( pack( 'N', $codePoint ), 'UTF-8', 'UTF-32BE' );
} else {
return '';
}
}, $content );
if ( mb_detect_encoding($content, 'UTF-8', true ) !== 'UTF-8' ) {
$content = mb_convert_encoding( $content, 'UTF-8', 'ISO-8859-1' );
}
$content = urldecode( str_replace( "%u", "\u", $content ) );
return json_decode( $content );
}
public static function getGlobalConstValue( $settings = [], $attr = '', $screen = 'desktop', $subattr = '' ) {
if ( empty( $settings ) || empty( $attr ) ) {
return '';
}
$exists = isset( $settings[ $attr ][ $screen ] ) ? $settings[ $attr ][ $screen ] : [];
if ( ! $exists ) {
return '';
}
switch ( $attr ) {
case 'background':
case 'contentBackground':
case 'buttonBackground':
return isset( $exists['color'] ) ? $exists['color'] : '';
case 'width':
$unit = isset( $exists['unit'] ) ? $exists['unit'] : 'px';
return isset( $exists['value'] ) ? $exists['value'] . $unit : '';
case 'color':
case 'linkColor':
case 'buttonColor':
case 'linkLineType':
case 'align':
return $exists;
case 'buttonFont':
case 'font':
case 'fontH1':
case 'fontH2':
case 'fontH3':
case 'fontH4':
case 'fontH5':
case 'fontH6':
case 'backupFont':
if ( ! empty( $subattr ) ) {
$unit = $subattr === 'size' ? 'px' : '';
return isset( $exists[ $subattr ] ) ? $exists[ $subattr ] . $unit : '';
}
return '';
case 'buttonSize':
if ( isset( $settings['buttonAuto'] ) && isset( $settings['buttonAuto'][ $screen ] ) && $settings['buttonAuto'][ $screen ] ) {
return 'auto';
}
return isset( $exists['value'] ) ? $exists['value'] . '%' : '';
case 'buttonBorder':
$default = '';
$borderSetting = isset( $settings['buttonBorder'][ $screen ] ) ? $settings['buttonBorder'][ $screen ] : [
'top_left' => '8',
'top_right' => '8',
'bottom_left' => '8',
'bottom_right' => '8',
'radius_unit' => 'px',
];
$getValue = function ( $attributeKey ) use ( $borderSetting ) {
return isset( $borderSetting[ $attributeKey ] ) && $borderSetting[ $attributeKey ] !== '' ? $borderSetting[ $attributeKey ] : null;
};
$topLeft = $getValue( 'top-left' );
$topRight = $getValue( 'top-right' );
$bottomLeft = $getValue( 'bottom-left' );
$bottomRight = $getValue( 'bottom-right' );
$unit = isset( $borderSetting['radius_unit'] ) ? $borderSetting['radius_unit'] : 'px';
if ( $topLeft === null && $topRight === null && $bottomLeft === null && $bottomRight === null ) {
return $default;
}
$borderRadius = sprintf( '%s%s %s%s %s%s %s%s', $topLeft !== null ? $topLeft : '8', $unit, $topRight !== null ? $topRight : '8', $unit, $bottomRight !== null ? $bottomRight : '8', $unit, $bottomLeft !== null ? $bottomLeft : '8', $unit );
return $borderRadius;
case 'buttonPadding':
$default = '';
$borderSetting = isset( $settings['buttonPadding'][ $screen ] ) ? $settings['buttonPadding'][ $screen ] : [];
$getValue = function ( $attributeKey ) use ( $borderSetting ) {
return isset( $borderSetting[ $attributeKey ] ) && $borderSetting[ $attributeKey ] !== '' ? $borderSetting[ $attributeKey ] : null;
};
$top = $getValue( 'top' );
$right = $getValue( 'right' );
$bottom = $getValue( 'bottom' );
$left = $getValue( 'left' );
$unit = isset( $borderSetting['unit'] ) ? $borderSetting['unit'] : 'px';
if ( $top === null && $right === null && $bottom === null && $left === null ) {
return $default;
}
$padding = sprintf( '%s%s %s%s %s%s %s%s', $top !== null ? $top : '0', $unit, $right !== null ? $right : '0', $unit, $bottom !== null ? $bottom : '0', $unit, $left !== null ? $left : '0', $unit );
return $padding;
default:
return '';
}
}
public static function set_global_css_variables() {
$setting = BWFAN_Common::get_block_editor_settings();
if ( ! isset( $setting['setting'] ) ) {
return;
}
$global_settings = $setting['setting'];
self::$global_settings = $global_settings;
$backupfont = self::getGlobalConstValue( $global_settings, 'font', 'desktop', 'family' );
self::$global_settings_var = [
'var(--bwfbe-linkLineType-desktop)' => self::getGlobalConstValue( $global_settings, 'linkLineType' ),
'var(--bwfbe-linkColor-desktop)' => self::getGlobalConstValue( $global_settings, 'linkColor' ),
'var(--bwfbe-font-desktop-family)' => self::getGlobalConstValue( $global_settings, 'font', 'desktop', 'family' ) . ( ! empty( $backupfont ) ? ",$backupfont" : '' ),
'var(--bwfbe-font-desktop-size)' => self::getGlobalConstValue( $global_settings, 'font', 'desktop', 'size' ),
'var(--bwfbe-color-desktop)' => self::getGlobalConstValue( $global_settings, 'color' ),
'var(--bwfbe-buttonColor-desktop)' => self::getGlobalConstValue( $global_settings, 'buttonColor' ),
'var(--bwfbe-buttonBackground-desktop)' => self::getGlobalConstValue( $global_settings, 'buttonBackground' ),
'var(--bwfbe-buttonFont-desktop-size)' => self::getGlobalConstValue( $global_settings, 'buttonFont', 'desktop', 'size' ),
'var(--bwfbe-width-desktop-value)' => self::getGlobalConstValue( $global_settings, 'width' ),
'var(--bwfbe-align-desktop)' => self::getGlobalConstValue( $global_settings, 'align' ),
'var(--bwfbe-background-desktop-color)' => self::getGlobalConstValue( $global_settings, 'background' ),
'var(--bwfbe-contentBackground-desktop-color)' => self::getGlobalConstValue( $global_settings, 'contentBackground' ),
'var(--bwfbe-buttonWidth-desktop-value)' => self::getGlobalConstValue( $global_settings, 'buttonSize', 'desktop' ),
'var(--bwfbe-buttonBorder-desktop-radius)' => self::getGlobalConstValue( $global_settings, 'buttonBorder', 'desktop' ),
'var(--bwfbe-buttonPadding-desktop)' => self::getGlobalConstValue( $global_settings, 'buttonPadding', 'desktop' ),
'var(--bwfbe-fontH1-desktop-size)' => self::getGlobalConstValue( $global_settings, 'fontH1', 'desktop', 'size' ),
'var(--bwfbe-fontH3-desktop-size)' => self::getGlobalConstValue( $global_settings, 'fontH3', 'desktop', 'size' ),
'var(--bwfbe-fontH4-desktop-size)' => self::getGlobalConstValue( $global_settings, 'fontH4', 'desktop', 'size' ),
'var(--bwfbe-fontH5-desktop-size)' => self::getGlobalConstValue( $global_settings, 'fontH5', 'desktop', 'size' ),
'var(--bwfbe-fontH2-desktop-size)' => self::getGlobalConstValue( $global_settings, 'fontH2', 'desktop', 'size' ),
'var(--bwfbe-fontH6-desktop-size)' => self::getGlobalConstValue( $global_settings, 'fontH6', 'desktop', 'size' ),
];
}
/**
* Decode specific block
*/
public static function decode_specific_blocks_before( $block_content = '', $shortcodes = [] ) {
if ( empty( $block_content ) || empty( $shortcodes ) ) {
return $block_content;
}
BWFAN_Merge_Tag_Loader::set_data( [
'body_pre_decoding' => true,
] );
foreach ( $shortcodes as $codes ) {
$pattern = '/\\[' . $codes . '.*?\\](.*?)\\[\\/' . $codes . '.*?\\]/s';
preg_match_all( $pattern, $block_content, $closing_merge_tags );
$closetags = $closing_merge_tags[0] ?? [];
foreach ( $closetags as $s ) {
$decode_val = do_shortcode( $s );
$block_content = str_ireplace( $s, $decode_val ?: '', $block_content );
}
}
BWFAN_Merge_Tag_Loader::set_data( [
'body_pre_decoding' => false,
] );
return $block_content;
}
/**
* Emogrify parsed output
*
* @param string $css
* @param string $email_body
* @param bool $return_dom
*
* @return string
*/
public static function emogrifier_parsed_output( $css, $email_body, $return_dom = false ) {
if ( empty( $email_body ) || empty( $css ) ) {
return $email_body;
}
if ( ! BWFAN_Common::supports_emogrifier() ) {
$email_body = '<style type="text/css">' . $css . '</style>' . $email_body;
return $email_body;
}
$emogrifier_class = '\\BWF_Pelago\\Emogrifier';
if ( ! class_exists( $emogrifier_class ) ) {
include_once BWFAN_PLUGIN_DIR . '/libraries/class-emogrifier.php';
}
try {
/** @var \BWF_Pelago\Emogrifier $emogrifier */
$emogrifier = new $emogrifier_class( $email_body, $css );
if ( $return_dom ) {
$email_body = $emogrifier->emogrify();
} else {
$email_body = $emogrifier->emogrifyBodyContent();
}
} catch ( Exception $e ) {
BWFAN_Core()->logger->log( $e->getMessage(), 'send_email_emogrifier' );
}
return $email_body;
}
}
new BWFCRM_Block_Editor();