PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor / woocommerce / email-editor / src / Engine / class-theme-controller.php
mailpoet / vendor / woocommerce / email-editor / src / Engine Last commit date
Logger 11 months ago Patterns 11 months ago PersonalizationTags 2 days ago Renderer 2 days ago Templates 4 months ago class-assets-manager.php 5 months ago class-dependency-check.php 11 months ago class-email-api-controller.php 6 months ago class-email-editor.php 2 days ago class-email-styles-schema.php 11 months ago class-personalizer.php 2 days ago class-send-preview-email.php 5 months ago class-settings-controller.php 3 months ago class-site-style-sync-controller.php 4 months ago class-theme-controller.php 3 months ago class-user-theme.php 11 months ago content-editor.css 2 weeks ago content-shared.css 11 months ago index.php 11 months ago theme.json 3 months ago
class-theme-controller.php
186 lines
1 <?php
2 declare(strict_types = 1);
3 namespace Automattic\WooCommerce\EmailEditor\Engine;
4 if (!defined('ABSPATH')) exit;
5 use Automattic\WooCommerce\EmailEditor\Engine\Renderer\ContentRenderer\Preset_Variable_Resolver;
6 use WP_Block_Template;
7 use WP_Post;
8 use WP_Theme_JSON;
9 use WP_Theme_JSON_Resolver;
10 class Theme_Controller {
11 private WP_Theme_JSON $core_theme;
12 private WP_Theme_JSON $base_theme;
13 private User_Theme $user_theme;
14 private Site_Style_Sync_Controller $site_style_sync_controller;
15 public function __construct() {
16 $this->core_theme = WP_Theme_JSON_Resolver::get_core_data();
17 $this->base_theme = new WP_Theme_JSON( (array) json_decode( (string) file_get_contents( __DIR__ . '/theme.json' ), true ), 'default' );
18 $this->user_theme = new User_Theme();
19 $this->site_style_sync_controller = new Site_Style_Sync_Controller();
20 }
21 public function get_theme(): WP_Theme_JSON {
22 $theme = $this->get_base_theme();
23 $theme->merge( $this->user_theme->get_theme() );
24 return $theme;
25 }
26 public function get_base_theme(): WP_Theme_JSON {
27 $theme = new WP_Theme_JSON();
28 $theme->merge( $this->core_theme );
29 $theme->merge( $this->base_theme );
30 // Merge synced styles from current active theme.
31 if ( $this->site_style_sync_controller->is_sync_enabled() ) {
32 // phpcs:ignore Generic.Commenting.DocComment.MissingShort
33 $site_theme = $this->site_style_sync_controller->get_theme( $theme );
34 $theme->merge( $site_theme );
35 }
36 return apply_filters( 'woocommerce_email_editor_theme_json', $theme );
37 }
38 private function recursive_replace_presets( $values, $presets ) {
39 foreach ( $values as $key => $value ) {
40 if ( is_array( $value ) ) {
41 $values[ $key ] = $this->recursive_replace_presets( $value, $presets );
42 } elseif ( is_string( $value ) ) {
43 $values[ $key ] = preg_replace( array_keys( $presets ), array_values( $presets ), $value );
44 } else {
45 $values[ $key ] = $value;
46 }
47 }
48 return $values;
49 }
50 private function recursive_extract_preset_variables( $styles ) {
51 foreach ( $styles as $key => $style_value ) {
52 if ( is_array( $style_value ) ) {
53 $styles[ $key ] = $this->recursive_extract_preset_variables( $style_value );
54 } elseif ( is_string( $style_value ) && Preset_Variable_Resolver::is_preset_reference( $style_value ) ) {
55 $styles[ $key ] = Preset_Variable_Resolver::to_css_var( $style_value );
56 } else {
57 $styles[ $key ] = $style_value;
58 }
59 }
60 return $styles;
61 }
62 public function get_styles(): array {
63 $theme_styles = $this->get_theme()->get_data()['styles'];
64 // Extract preset variables.
65 $theme_styles = $this->recursive_extract_preset_variables( $theme_styles );
66 // Replace preset values.
67 $variables = $this->get_variables_values_map();
68 $presets = array();
69 foreach ( $variables as $name => $value ) {
70 $pattern = '/var\(' . preg_quote( $name, '/' ) . '\)/i';
71 $presets[ $pattern ] = $value;
72 }
73 return $this->recursive_replace_presets( $theme_styles, $presets );
74 }
75 public function get_settings(): array {
76 return $this->get_theme()->get_settings();
77 }
78 public function get_layout_settings(): array {
79 return $this->get_theme()->get_settings()['layout'];
80 }
81 public function get_stylesheet_from_context( $context, $options = array() ): string {
82 return function_exists( 'gutenberg_style_engine_get_stylesheet_from_context' ) ? gutenberg_style_engine_get_stylesheet_from_context( $context, $options ) : wp_style_engine_get_stylesheet_from_context( $context, $options );
83 }
84 public function get_stylesheet_for_rendering( ?WP_Post $post = null, $template = null ): string {
85 $email_theme_settings = $this->get_settings();
86 $css_presets = '';
87 // Font family classes.
88 foreach ( $email_theme_settings['typography']['fontFamilies']['default'] as $font_family ) {
89 $css_presets .= ".has-{$font_family['slug']}-font-family { font-family: {$font_family['fontFamily']}; } \n";
90 }
91 // Font size classes.
92 foreach ( $email_theme_settings['typography']['fontSizes']['default'] as $font_size ) {
93 $css_presets .= ".has-{$font_size['slug']}-font-size { font-size: {$font_size['size']}; } \n";
94 }
95 // Color palette classes.
96 $color_definitions = array_merge( $email_theme_settings['color']['palette']['theme'] ?? array(), $email_theme_settings['color']['palette']['default'] ?? array() );
97 foreach ( $color_definitions as $color ) {
98 $css_presets .= ".has-{$color['slug']}-color { color: {$color['color']}; } \n";
99 $css_presets .= ".has-{$color['slug']}-background-color { background-color: {$color['color']}; } \n";
100 $css_presets .= ".has-{$color['slug']}-border-color { border-color: {$color['color']}; } \n";
101 }
102 // Block specific styles.
103 $css_blocks = '';
104 $blocks = $this->get_theme()->get_styles_block_nodes();
105 foreach ( $blocks as $block_metadata ) {
106 $css_blocks .= $this->get_theme()->get_styles_for_block( $block_metadata );
107 }
108 // Remove `:root :where(...)` selectors since they are not supported in the CSS inliner.
109 $css_blocks = preg_replace( '/:root\s:where\((.*?)\)/', '$1', $css_blocks );
110 // Element specific styles.
111 $elements_styles = $this->get_theme()->get_raw_data()['styles']['elements'] ?? array();
112 // Because the section styles is not a part of the output the `get_styles_block_nodes` method, we need to get it separately.
113 if ( $template && $template->wp_id ) {
114 $template_theme = (array) get_post_meta( $template->wp_id, Email_Editor::WOOCOMMERCE_EMAIL_META_THEME_TYPE, true );
115 $template_styles = (array) ( $template_theme['styles'] ?? array() );
116 $template_elements = $template_styles['elements'] ?? array();
117 $elements_styles = array_replace_recursive( (array) $elements_styles, (array) $template_elements );
118 }
119 if ( $post ) {
120 $post_theme = (array) get_post_meta( $post->ID, 'woocommerce_email_theme', true );
121 $post_styles = (array) ( $post_theme['styles'] ?? array() );
122 $post_elements = $post_styles['elements'] ?? array();
123 $elements_styles = array_replace_recursive( (array) $elements_styles, (array) $post_elements );
124 }
125 $css_elements = '';
126 foreach ( $elements_styles as $key => $elements_style ) {
127 $selector = $key;
128 if ( 'button' === $key ) {
129 $selector = '.wp-block-button';
130 $css_elements .= wp_style_engine_get_styles( $elements_style, array( 'selector' => '.wp-block-button' ) )['css'] ?? '';
131 // Add color to link element.
132 $css_elements .= wp_style_engine_get_styles( array( 'color' => array( 'text' => $elements_style['color']['text'] ?? '' ) ), array( 'selector' => '.wp-block-button a' ) )['css'] ?? '';
133 continue;
134 }
135 switch ( $key ) {
136 case 'heading':
137 $selector = 'h1, h2, h3, h4, h5, h6';
138 break;
139 case 'link':
140 $selector = 'a:not(.button-link)';
141 break;
142 }
143 $css_elements .= wp_style_engine_get_styles( $elements_style, array( 'selector' => $selector ) )['css'] ?? '';
144 }
145 $result = $css_presets . $css_blocks . $css_elements;
146 // Because font-size can by defined by the clamp() function that is not supported in the e-mail clients, we need to replace it to the value.
147 // Regular expression to match clamp() function and capture its max value.
148 $pattern = '/clamp\([^,]+,\s*[^,]+,\s*([^)]+)\)/';
149 // Replace clamp() with its maximum value.
150 $result = (string) preg_replace( $pattern, '$1', $result );
151 return $result;
152 }
153 public function translate_slug_to_font_size( string $font_size ): string {
154 $settings = $this->get_settings();
155 foreach ( $settings['typography']['fontSizes']['default'] as $font_size_definition ) {
156 if ( $font_size_definition['slug'] === $font_size ) {
157 return $font_size_definition['size'];
158 }
159 }
160 return $font_size;
161 }
162 public function translate_slug_to_color( string $color_slug ): string {
163 $settings = $this->get_settings();
164 $color_definitions = array_merge( $settings['color']['palette']['theme'] ?? array(), $settings['color']['palette']['default'] ?? array() );
165 foreach ( $color_definitions as $color_definition ) {
166 if ( $color_definition['slug'] === $color_slug ) {
167 return strtolower( $color_definition['color'] );
168 }
169 }
170 return $color_slug;
171 }
172 public function get_variables_values_map(): array {
173 $variables_css = $this->get_theme()->get_stylesheet( array( 'variables' ) );
174 $map = array();
175 // Regular expression to match CSS variable definitions.
176 $pattern = '/--(.*?):\s*(.*?);/';
177 if ( preg_match_all( $pattern, $variables_css, $matches, PREG_SET_ORDER ) ) {
178 foreach ( $matches as $match ) {
179 // '--' . $match[1] is the variable name, $match[2] is the variable value.
180 $map[ '--' . $match[1] ] = $match[2];
181 }
182 }
183 return $map;
184 }
185 }
186