HtmlHeadBuilder::getMeta()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 6
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 8
rs 10
1
<?php
2
3
/**
4
 *  ____  _     _                       _ _
5
 * |  _ \| |__ | |_ ___ _ __ ___   __ _(_) |
6
 * | |_) | '_ \| __/ _ \ '_ ` _ \ / _` | | |
7
 * |  __/| | | | ||  __/ | | | | | (_| | | |
8
 * |_|   |_| |_|\__\___|_| |_| |_|\__,_|_|_|
9
 *
10
 * This file is part of Kristuff\Phtemail.
11
 *
12
 * (c) Kristuff <[email protected]>
13
 *
14
 * For the full copyright and license information, please view the LICENSE
15
 * file that was distributed with this source code.
16
 *
17
 * @version    0.2.0
18
 * @copyright  2017-2020 Kristuff
19
 */
20
21
namespace Kristuff\Phtemail\Core;
22
23
/** 
24
 *  Extends the HtmlBuilder with html head helper functions
25
 */
26
abstract class HtmlHeadBuilder extends HtmlBuilder
27
{
28
    /** 
29
     * Gets html meta tags as string
30
     * 
31
     * @access protected
32
     * @return string 
33
     */
34
    protected function getMeta()
35
    {
36
        $html  = '  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'.PHP_EOL;
37
        $html .= '  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">'.PHP_EOL;
38
        $html .= '  <meta name="viewport" content="width=device-width, initial-scale=1.0">'.PHP_EOL;
39
        $html .= $this->getHtmlComment('Disable auto telephone linking in iOS', '  ');
40
        $html .= '  <meta name="format-detection" content="telephone=no" />'.PHP_EOL;
41
        return $html;
42
    }
43
44
    /** 
45
     * Gets html title tag as string
46
     * 
47
     * @access protected
48
     * @param string    $title      The email meta title
49
     *  
50
     * @return string 
51
     */
52
    protected function getTitle(string $title)
53
    {
54
        return '  <title>' . $title . '</title>'  . PHP_EOL;
55
    }
56
57
    /** 
58
     * Gets the html styles as string
59
     * 
60
     * @access protected
61
     *  
62
     * @return string 
63
     */
64
    protected function getStyles()
65
    {
66
        // start style tag
67
        $html  = '  <style type="text/css">'.PHP_EOL;
68
        $html .= PHP_EOL;
69
70
        // -- reset styles ----------------------------------------
71
        $html .= $this->getCssComment('--- RESET STYLES ---', '    ');
72
        $html .= '    html { background-color:'. $this->backsideBackgroundColor . '; margin:0; padding:0; }'.PHP_EOL;
73
        $html .= '    body, #bodyTable, #bodyCell, #bodyCell{height:100% !important; margin:0; padding:0;';
74
        $html .= '    width:100% !important; font-family:'. $this->emailBodyFont .';}'.PHP_EOL;
75
        $html .= '    table{border-collapse:collapse;}'.PHP_EOL;
76
        $html .= '    table[id=bodyTable] {width:100%!important;margin:auto;max-width:500px!important; color:'. $this->emailBodyColor . ';font-weight:normal;}'.PHP_EOL; 
77
        $html .= '    img, a img{border:0; outline:none; text-decoration:none;height:auto; line-height:100%;}'.PHP_EOL;
78
        $html .= '    a {text-decoration:none !important;border-bottom: 1px solid;}'.PHP_EOL;
79
        
80
        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
81
        //       todo custom COLOR !!!!!!!!!!!!!! font size ? line height ? margin ? see 
82
        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
83
        $html .= '    h1, h2, h3, h4, h5, h6 {color:#5F5F5F; font-weight:normal; font-family:'. $this->emailBodyFont .';'.PHP_EOL;
84
        $html .= '     font-size:20px; line-height:125%; text-align:Left; letter-spacing:normal;'.PHP_EOL;
85
        $html .= '     margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;'.PHP_EOL;
86
        $html .= '     padding-top:0;padding-bottom:10px;padding-left:0;padding-right:0;}'.PHP_EOL;
87
        // custom    
88
        $html .= '    p {margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;';
89
        $html .=        'padding-top:0;padding-bottom:0;padding-left:0;padding-right:0;}'.PHP_EOL;
90
        $html .= '    p + p {padding-top:10px;}'.PHP_EOL;
91
        $html .= PHP_EOL;
92
93
        // -- client specific styles -------------------------------------------
94
        $html .= $this->getCssComment('--- CLIENT-SPECIFIC STYLES ---', '    ');
95
        $html .= '    .ReadMsgBody{width:100%;} .ExternalClass{width:100%;}'. $this->getCssComment(' Force Hotmail/Outlook.com to display emails at full width.');
96
        $html .= '    .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div{line-height:100%;}' . $this->getCssComment(' Force Hotmail/Outlook.com to display line heights normally.');
97
        $html .= '    table, td{mso-table-lspace:0pt; mso-table-rspace:0pt;}' . $this->getCssComment(' Remove spacing between tables in Outlook 2007 and up.');
98
        $html .= '    #outlook a{padding:0;}'. $this->getCssComment(' Force Outlook 2007 and up to provide a "view in browser" message.');
99
        $html .= '    img{-ms-interpolation-mode: bicubic;display:block;outline:none; text-decoration:none;}'. $this->getCssComment(' Force IE to smoothly render resized images.');
100
        $html .= '    body, table, td, p, a, li, blockquote{-ms-text-size-adjust:100%; -webkit-text-size-adjust:100%; font-weight:normal!important;}'. $this->getCssComment(' Prevent Windows- and Webkit-based mobile platforms from changing declared text sizes. ');
101
        $html .= '    .ExternalClass td[class="ecxflexibleContainerBox"] h3 {padding-top: 10px !important;} '. $this->getCssComment(' Force hotmail to push 2-grid sub headers down');
102
        $html .= PHP_EOL;
103
104
        // -- our styles --------------------------------------------------------
105
        $html .= $this->getCssComment('--- FRAMEWORK HACKS & OVERRIDES ---', '    ');
106
        
107
        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
108
        //       todo custom font size ? line height ? colors ..
109
        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#3497D9!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
110
        $html .= '    h1{display:block;font-size:32px;font-style:normal;font-weight:200!important;line-height:100%;}'.PHP_EOL;
111
        $html .= '    h2{display:block;font-size:27px;font-style:normal;font-weight:200!important;line-height:120%;}'.PHP_EOL;
112
        $html .= '    h3{display:block;font-size:24px;font-style:normal;font-weight:200!important;line-height:110%;}'.PHP_EOL;
113
        $html .= '    h4{display:block;font-size:22px;font-style:normal;font-weight:200!important;line-height:100%;}'.PHP_EOL;
114
        $html .= '    h5{display:block;font-size:20px;font-style:normal;font-weight:200!important;line-height:110%;}'.PHP_EOL;
115
        $html .= '    h6{display:block;font-size:18px;font-style:normal;font-weight:200!important;line-height:110%;}'.PHP_EOL;
116
   
117
        $html .= '    .flexibleImage{height:auto;}'.PHP_EOL;
118
        $html .= '    .linkRemoveBorder{border-bottom:0 !important;}'.PHP_EOL;
119
        $html .= '    table[class=flexibleContainerCellDivider] {padding-bottom:0 !important;padding-top:0 !important;}'.PHP_EOL;
120
121
        $html .= '    body, #bodyTable{background-color:'. $this->backsideBackgroundColor       . ';}'.PHP_EOL;
122
        $html .= '    #emailHeader{background-color:'    . $this->backsideBackgroundColor       . ';}'.PHP_EOL;
123
        $html .= '    #emailBody{background-color:'      . $this->emailBodyBackgroundColor  . ';}'.PHP_EOL;
124
        $html .= '    #emailFooter{background-color:'    . $this->backsideBackgroundColor       . ';}'.PHP_EOL;
125
        $html .= '    .emailButton{background-color:#3497D9; border-collapse:separate;}'.PHP_EOL;
126
        $html .= '    .buttonContent{color:#FFFFFF; font-family:Helvetica; font-size:18px; font-weight:200; line-height:100%; padding:15px; text-align:center;}'.PHP_EOL;
127
        $html .= '    .buttonContent a{color:#FFFFFF; display:block; text-decoration:none!important; border:0!important;}'.PHP_EOL;
128
        $html .= PHP_EOL;
129
                    
130
131
        // -------------------------------------------------------------
132
        // -- mobiles styles -------------------------------------------
133
        // -------------------------------------------------------------
134
        $html .= $this->getCssComment('--- MOBILE STYLES ---', '    ');
135
        $html .= '    @media only screen and (max-width: '. strval($this->emailBodyWidth - 20) . 'px) {'.PHP_EOL;
136
        $html .= PHP_EOL;
137
138
        // -- client specific styles -------------------------------------------
139
        $html .= $this->getCssComment('--- CLIENT-SPECIFIC STYLES ---', '      ');
140
        $html .= '      body{width:100% !important; min-width:100% !important;}'. $this->getCssComment(' Force iOS Mail to render the email at full width.');
141
        $html .= PHP_EOL;
142
143
        //todo
144
        $html .= $this->getCssComment('--- FRAMEWORK STYLES ---', '      ');
145
        $html .= '      table[id="emailHeader"],'.PHP_EOL;
146
        $html .= '      table[id="emailBody"],'.PHP_EOL;
147
        $html .= '      table[id="emailFooter"],'.PHP_EOL;
148
        $html .= '      table[class="flexibleContainer"],'.PHP_EOL;
149
        $html .= '      td[class="flexibleContainerCell"] {width:100% !important;}'.PHP_EOL;
150
        $html .= '      td[class="flexibleContainerBox"], '.PHP_EOL;
151
        $html .= '      td[class="flexibleContainerBox"] table {display: block;width: 100%;text-align: left;}'.PHP_EOL;
152
153
        //todo
154
155
        $html .= $this->getCssComment('The following style rule makes any image classed with \'flexibleImage\'fluid' . PHP_EOL
156
                                    . '      when the query activates. Make sure you add an inline max-width to those '. PHP_EOL
157
                                    . '      to prevent them from blowing out.', '      ');
158
                    
159
        $html .= '      td[class="imageContent"] img {height:auto !important; width:100% !important; max-width:100% !important; }'. PHP_EOL;
160
        $html .= '      img[class="flexibleImage"]{height:auto !important; width:100% !important;max-width:100% !important;}'. PHP_EOL;
161
        $html .= '      img[class="flexibleImageSmall"]{height:auto !important; width:auto !important;}'. PHP_EOL;
162
        
163
        $html .= $this->getCssComment('Create top space for every second element in a block', '      ');
164
        $html .= '      table[class="flexibleContainerBoxNext"]{padding-top: 10px !important;}'. PHP_EOL;
165
        
166
        $html .= $this->getCssComment('Make buttons in the email span the full width of their container, allowing'
167
                                    . 'for left- or right-handed ease of use.', '      ');
168
169
        $html .= '      table[class="emailButton"]{width:100% !important;}'. PHP_EOL;
170
        $html .= '      td[class="buttonContent"]{padding:0 !important;}'. PHP_EOL;
171
        $html .= '      td[class="buttonContent"] a{padding:15px !important;}'. PHP_EOL;
172
        $html .= '    }'.PHP_EOL;
173
174
        //todo more ... 
175
176
        // close style tag
177
        $html  .= '    </style>'.PHP_EOL;
178
179
        // ------- conditional formatting for outlook --------------------
180
        $html .= $this->getHtmlComment('Outlook Conditional CSS. ' . PHP_EOL
181
                   . '      These two style blocks target Outlook 2007 & 2010 specifically, forcing' . PHP_EOL
182
                   . '      columns into a single vertical stack as on mobile clients. This is' . PHP_EOL
183
                   . '      primarily done to avoid the \'page break bug\' and is optional.' . PHP_EOL
184
                   . '      More information here: https://templates.mailchimp.com/development/css/outlook-conditional-css' . PHP_EOL
185
                   . '   ','    ');
186
187
        $html .= '    <!--[if mso 12]>'.PHP_EOL;
188
        $html .= '    <style type="text/css">'.PHP_EOL;
189
        $html .= '        .flexibleContainer{display:block !important; width:100% !important;}'.PHP_EOL;
190
        $html .= '    </style>'.PHP_EOL;
191
        $html .= '    <![endif]-->'.PHP_EOL;
192
        $html .= '    <!--[if mso 14]>'.PHP_EOL;
193
        $html .= '    <style type="text/css">'.PHP_EOL;
194
        $html .= '        .flexibleContainer{display:block !important; width:100% !important;}'.PHP_EOL;
195
        $html .= '    </style>'.PHP_EOL;
196
        $html .= '    <![endif]-->'.PHP_EOL;
197
198
        // done
199
        return $html;
200
    }
201
202
    /**
203
     * Get a formatted CSS comment for given string if $renderCssComments is true,
204
     * otherwise an empty string or just a break line.
205
     * 
206
     * @access public
207
     * @param string    $text       The comment text.
208
     * @param string    $indent     The indentation before comment. Default is an empty string.
209
     * @param bool      $breakLine  True to add a break line (ie: PHP_EOL) after comment. Default is true.
210
     * 
211
     * @return string   
212
     */
213
    protected function getCssComment(string $text, string $indent = '', bool $breakLine = true)
214
    {
215
        return $this->renderCssComments ? $indent . '/* ' . $text . ' */' . ($breakLine ? PHP_EOL : '') : ($breakLine ? PHP_EOL : '');
216
    }
217
}