PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
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 / lib / Newsletter / Renderer / StylesHelper.php
mailpoet / lib / Newsletter / Renderer Last commit date
Blocks 2 months ago Columns 5 months ago PostProcess 4 days ago BodyRenderer.php 2 months ago EscapeHelper.php 2 years ago Preprocessor.php 1 year ago Renderer.php 1 month ago StylesHelper.php 2 months ago Template.html 2 months ago index.php 3 years ago
StylesHelper.php
210 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Newsletter\Renderer;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 class StylesHelper {
9 public static $cssAttributes = [
10 'backgroundColor' => 'background-color',
11 'fontColor' => 'color',
12 'fontFamily' => 'font-family',
13 'textDecoration' => 'text-decoration',
14 'textAlign' => 'text-align',
15 'fontSize' => 'font-size',
16 'fontWeight' => 'font-weight',
17 'borderWidth' => 'border-width',
18 'borderStyle' => 'border-style',
19 'borderColor' => 'border-color',
20 'borderRadius' => 'border-radius',
21 'lineHeight' => 'line-height',
22 'msoLineHeightAlt' => 'mso-line-height-alt',
23 'msoFontSize' => 'mso-ansi-font-size',
24 ];
25 public static $font = [
26 'Arial' => "Arial, 'Helvetica Neue', Helvetica, sans-serif",
27 'Comic Sans MS' => "'Comic Sans MS', 'Marker Felt-Thin', Arial, sans-serif",
28 'Courier New' => "'Courier New', Courier, 'Lucida Sans Typewriter', 'Lucida Typewriter', monospace",
29 'Georgia' => "Georgia, Times, 'Times New Roman', serif",
30 'Lucida' => "'Lucida Sans Unicode', 'Lucida Grande', sans-serif",
31 'Tahoma' => 'Tahoma, Verdana, Segoe, sans-serif',
32 'Times New Roman' => "'Times New Roman', Times, Baskerville, Georgia, serif",
33 'Trebuchet MS' => "'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif",
34 'Verdana' => 'Verdana, Geneva, sans-serif',
35 'Arvo' => 'arvo, courier, georgia, serif',
36 'Lato' => "lato, 'helvetica neue', helvetica, arial, sans-serif",
37 'Lora' => "lora, georgia, 'times new roman', serif",
38 'Merriweather' => "merriweather, georgia, 'times new roman', serif",
39 'Merriweather Sans' => "'merriweather sans', 'helvetica neue', helvetica, arial, sans-serif",
40 'Noticia Text' => "'noticia text', georgia, 'times new roman', serif",
41 'Open Sans' => "'open sans', 'helvetica neue', helvetica, arial, sans-serif",
42 'Playfair Display' => "'playfair display', georgia, 'times new roman', serif",
43 'Roboto' => "roboto, 'helvetica neue', helvetica, arial, sans-serif",
44 'Source Sans Pro' => "'source sans pro', 'helvetica neue', helvetica, arial, sans-serif",
45 'Oswald' => "Oswald, 'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif",
46 'Raleway' => "Raleway, 'Century Gothic', CenturyGothic, AppleGothic, sans-serif",
47 'Permanent Marker' => "'Permanent Marker', Tahoma, Verdana, Segoe, sans-serif",
48 'Pacifico' => "Pacifico, 'Arial Narrow', Arial, sans-serif",
49 ];
50 public static $customFonts = [
51 'Arvo',
52 'Lato',
53 'Lora',
54 'Merriweather',
55 'Merriweather Sans',
56 'Noticia Text',
57 'Open Sans',
58 'Playfair Display',
59 'Roboto',
60 'Source Sans Pro',
61 'Oswald',
62 'Raleway',
63 'Permanent Marker',
64 'Pacifico',
65 ];
66 public static $defaultLineHeight = 1.6;
67 public static $headingMarginMultiplier = 0.3;
68 public static $paddingWidth = 20;
69
70 public static function getBlockStyles($element, $ignoreSpecificStyles = false) {
71 if (!isset($element['styles']['block'])) {
72 return;
73 }
74 return self::getStyles($element['styles'], 'block', $ignoreSpecificStyles);
75 }
76
77 public static function getStyles($data, $type, $ignoreSpecificStyles = false) {
78 $styles = array_map(function($attribute, $style) use ($ignoreSpecificStyles) {
79 if (!$ignoreSpecificStyles || !in_array($attribute, $ignoreSpecificStyles)) {
80 $style = StylesHelper::applyFontFamily($attribute, $style);
81 return StylesHelper::translateCSSAttribute($attribute) . ': ' . $style . ';';
82 }
83 }, array_keys($data[$type]), $data[$type]);
84 return implode('', $styles);
85 }
86
87 public static function translateCSSAttribute($attribute) {
88 return (array_key_exists($attribute, self::$cssAttributes)) ?
89 self::$cssAttributes[$attribute] :
90 $attribute;
91 }
92
93 public static function setStyle(array $style, string $selector): string {
94 $css = $selector . '{' . PHP_EOL;
95 $style = self::applyHeadingMargin($style, $selector);
96 $style = self::applyLineHeight($style, $selector);
97 foreach ($style as $attribute => $individualStyle) {
98 $individualStyle = self::applyFontFamily($attribute, $individualStyle);
99 $css .= self::translateCSSAttribute($attribute) . ':' . $individualStyle . ';' . PHP_EOL;
100 }
101 $css .= '}' . PHP_EOL;
102 return $css;
103 }
104
105 public static function applyTextAlignment($block, string $defaultAlignment = 'left', string $styleType = 'block') {
106 if (is_array($block)) {
107 if (!isset($block['styles']) || !is_array($block['styles'])) {
108 $block['styles'] = [];
109 }
110 if (!isset($block['styles'][$styleType]) || !is_array($block['styles'][$styleType])) {
111 $block['styles'][$styleType] = [];
112 }
113 $rawTextAlign = $block['styles'][$styleType]['textAlign'] ?? null;
114 $textAlignment = is_string($rawTextAlign) ? trim(strtolower($rawTextAlign)) : '';
115 if (in_array($textAlignment, ['center', 'right', 'justify'], true)) {
116 return $block;
117 }
118 $block['styles'][$styleType]['textAlign'] = $defaultAlignment;
119 return $block;
120 }
121
122 // Check if text-align is already set to center, right, or justify
123 if (preg_match('/text-align\s*:\s*(center|justify|right)\s*(;|$)/i', (string)$block)) {
124 return $block;
125 }
126
127 // Ensure semicolon at the end before appending
128 $block = rtrim((string)$block);
129 if (strlen($block) > 0 && substr($block, -1) !== ';') {
130 $block .= ';';
131 }
132
133 return $block . 'text-align:' . $defaultAlignment . ';';
134 }
135
136 /**
137 * Join styles and makes sure they are separated by ;
138 */
139 public static function joinStyles(?string $styles1, ?string $styles2): string {
140 if ($styles1 === null) $styles1 = '';
141 if ($styles2 === null) $styles2 = '';
142
143 $style = trim($styles1);
144 if (
145 (strlen($style) > 0)
146 && (substr($style, -1) !== ';')
147 ) $style .= ';';
148 $style .= $styles2;
149 return $style;
150 }
151
152 public static function applyFontFamily($attribute, $style) {
153 if ($attribute !== 'fontFamily') return $style;
154 return (isset(self::$font[$style])) ?
155 self::$font[$style] :
156 self::$font['Arial'];
157 }
158
159 public static function applyHeadingMargin(array $style, string $selector): array {
160 if (!preg_match('/h[1-4]/i', $selector)) return $style;
161 $fontSize = (int)$style['fontSize'];
162 $style['margin'] = sprintf('0 0 %spx 0', self::$headingMarginMultiplier * $fontSize);
163 return $style;
164 }
165
166 public static function applyLineHeight(array $style, string $selector): array {
167 if (!preg_match('/mailpoet_paragraph|h[1-4]/i', $selector)) return $style;
168 $lineHeight = isset($style['lineHeight']) ? (float)$style['lineHeight'] : self::$defaultLineHeight;
169 $fontSize = (int)$style['fontSize'];
170 $msoLineHeight = round($lineHeight * $fontSize);
171 if ($msoLineHeight % 2 === 1) {
172 $msoLineHeight++;
173 }
174 $msoFontSize = $fontSize;
175 if ($msoFontSize % 2 === 1) {
176 $msoFontSize++;
177 }
178 $style['msoLineHeightAlt'] = sprintf('%spx', $msoLineHeight);
179 $style = ['msoFontSize' => sprintf('%spx', $msoFontSize)] + $style;
180 $style['lineHeight'] = sprintf('%spx', $lineHeight * $fontSize);
181
182 return $style;
183 }
184
185 private static function getCustomFontsNames($styles) {
186 $fontNames = [];
187 foreach ($styles as $style) {
188 if (isset($style['fontFamily']) && in_array($style['fontFamily'], self::$customFonts)) {
189 $fontNames[$style['fontFamily']] = true;
190 }
191 }
192 return array_keys($fontNames);
193 }
194
195 public static function getCustomFontsLinks($styles) {
196 $links = [];
197 foreach (self::getCustomFontsNames($styles) as $name) {
198 $links[] = urlencode($name) . ':400,400i,700,700i';
199 }
200 if (!count($links)) {
201 return '';
202 }
203
204 // see https://stackoverflow.com/a/48214207
205 return '<!--[if !mso]><!-- --><link href="https://fonts.googleapis.com/css?family='
206 . implode("|", $links)
207 . '" rel="stylesheet"><!--<![endif]-->';
208 }
209 }
210