Passed
Push — master ( c463fc...5bb76a )
by Brian
11:07
created
templates/emails/wpinv-email-footer.php 1 patch
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -1,10 +1,10 @@
 block discarded – undo
1 1
 <?php
2 2
 // don't load directly
3
-if ( !defined('ABSPATH') )
3
+if (!defined('ABSPATH'))
4 4
     die('-1');
5 5
 
6
-$email_footer = apply_filters( 'wpinv_email_footer_text', wpinv_get_option( 'email_footer_text' ) );
7
-$email_footer = $email_footer ? wpautop( wp_kses_post( wptexturize( $email_footer ) ) ) : '';
6
+$email_footer = apply_filters('wpinv_email_footer_text', wpinv_get_option('email_footer_text'));
7
+$email_footer = $email_footer ? wpautop(wp_kses_post(wptexturize($email_footer))) : '';
8 8
 ?>
9 9
                                                             </div>
10 10
                                                         </td>
Please login to merge, or discard this patch.
templates/emails/wpinv-email-header.php 1 patch
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -1,16 +1,16 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 // don't load directly
3
-if ( !defined('ABSPATH') )
3
+if (!defined('ABSPATH'))
4 4
     die('-1');
5 5
 
6
-if ( !isset( $email_heading ) ) {
6
+if (!isset($email_heading)) {
7 7
     global $email_heading;
8 8
 }
9 9
 ?>
10 10
 <!DOCTYPE html>
11 11
 <html dir="<?php echo is_rtl() ? 'rtl' : 'ltr'?>">
12 12
     <head>
13
-        <meta http-equiv="Content-Type" content="text/html; charset=<?php bloginfo( 'charset' ); ?>" />
13
+        <meta http-equiv="Content-Type" content="text/html; charset=<?php bloginfo('charset'); ?>" />
14 14
         <meta name="viewport" content="width=device-width, initial-scale=1">
15 15
         <meta name="robots" content="noindex,nofollow">
16 16
         <title><?php echo wpinv_get_blogname(); ?></title>
@@ -22,13 +22,13 @@  discard block
 block discarded – undo
22 22
                     <td align="center" valign="top">
23 23
                         <div id="template_header_image">
24 24
                         <?php
25
-                            if ( $img = wpinv_get_option( 'email_header_image' ) ) {
26
-                                echo '<p style="margin-top:0;"><img style="max-width:100%" src="' . esc_url( $img ) . '" alt="' . esc_attr( wpinv_get_blogname() ) . '" /></p>';
25
+                            if ($img = wpinv_get_option('email_header_image')) {
26
+                                echo '<p style="margin-top:0;"><img style="max-width:100%" src="' . esc_url($img) . '" alt="' . esc_attr(wpinv_get_blogname()) . '" /></p>';
27 27
                             }
28 28
                         ?>
29 29
                         </div>
30 30
                         <table border="0" cellpadding="0" cellspacing="0" width="100%" id="template_container">
31
-                            <?php if ( !empty( $email_heading ) ) { ?>
31
+                            <?php if (!empty($email_heading)) { ?>
32 32
                             <tr>
33 33
                                 <td align="center" valign="top">
34 34
                                     <!-- Header -->
Please login to merge, or discard this patch.
includes/class-wpinv-bp-core.php 2 patches
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -348,7 +348,7 @@
 block discarded – undo
348 348
 
349 349
         $query_args     = array( 'user' => $user_id, 'page' => $this->pag_page, 'limit' => $this->pag_num, 'return' => 'self', 'paginate' => true );
350 350
         if ( !empty( $status ) && $status != 'all' ) {
351
-           $query_args['status'] = $status;
351
+            $query_args['status'] = $status;
352 352
         }
353 353
         $invoices  = wpinv_get_invoices( apply_filters( 'wpinv_bp_user_invoices_query', $query_args ) );
354 354
         
Please login to merge, or discard this patch.
Spacing   +125 added lines, -125 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php
2
-if ( ! defined( 'ABSPATH' ) ) {
2
+if (!defined('ABSPATH')) {
3 3
     exit; // Exit if accessed directly
4 4
 }
5 5
 
@@ -9,42 +9,42 @@  discard block
 block discarded – undo
9 9
     
10 10
     public function __construct() {
11 11
 
12
-        if ( !defined( 'WPINV_BP_SLUG' ) ) {
13
-            define( 'WPINV_BP_SLUG', 'invoices' );
12
+        if (!defined('WPINV_BP_SLUG')) {
13
+            define('WPINV_BP_SLUG', 'invoices');
14 14
         }
15 15
 
16
-        add_action( 'wp_ajax_invoicing_filter', array( $this, 'invoices_content' ) );
17
-        add_action( 'wp_ajax_nopriv_invoicing_filter', array( $this, 'invoices_content' ) );
18
-        add_filter( 'wpinv_settings_sections_general', array( $this, 'bp_section' ), 10, 1 );
19
-        add_filter( 'wpinv_settings_general', array( $this, 'bp_settings' ), 10, 1 );
20
-        add_filter( 'wp_nav_menu_objects', array( $this, 'wp_nav_menu_objects' ), 10, 2 );
16
+        add_action('wp_ajax_invoicing_filter', array($this, 'invoices_content'));
17
+        add_action('wp_ajax_nopriv_invoicing_filter', array($this, 'invoices_content'));
18
+        add_filter('wpinv_settings_sections_general', array($this, 'bp_section'), 10, 1);
19
+        add_filter('wpinv_settings_general', array($this, 'bp_settings'), 10, 1);
20
+        add_filter('wp_nav_menu_objects', array($this, 'wp_nav_menu_objects'), 10, 2);
21 21
         add_action('bp_setup_nav', array($this, 'setup_nav'), 15);
22 22
         
23
-        $position       = wpinv_get_option( 'wpinv_menu_position' );
23
+        $position       = wpinv_get_option('wpinv_menu_position');
24 24
         $position       = $position !== '' && $position !== false ? $position : 91;
25
-        $this->position = apply_filters( 'wpinv_bp_nav_position', $position );
26
-        $this->id     = WPINV_BP_SLUG;
25
+        $this->position = apply_filters('wpinv_bp_nav_position', $position);
26
+        $this->id = WPINV_BP_SLUG;
27 27
     }
28 28
 
29 29
     public function setup_nav() {
30 30
 
31
-        if ( wpinv_get_option( 'wpinv_bp_hide_menu' ) || !is_user_logged_in()) {
31
+        if (wpinv_get_option('wpinv_bp_hide_menu') || !is_user_logged_in()) {
32 32
             return;
33 33
         }
34 34
 
35
-        if(bp_displayed_user_id() != bp_loggedin_user_id() && !current_user_can('administrator')){
35
+        if (bp_displayed_user_id() != bp_loggedin_user_id() && !current_user_can('administrator')) {
36 36
             return;
37 37
         }
38 38
 
39 39
         $count = $this->get_invoice_count();
40
-        $class = ( 0 === $count ) ? 'no-count' : 'count';
40
+        $class = (0 === $count) ? 'no-count' : 'count';
41 41
 
42 42
         $main_nav_name = sprintf(
43
-            __( 'My Invoices %s', 'invoicing' ),
43
+            __('My Invoices %s', 'invoicing'),
44 44
             sprintf(
45 45
                 '<span class="%s">%s</span>',
46
-                esc_attr( $class ),
47
-                bp_core_number_format( $count )
46
+                esc_attr($class),
47
+                bp_core_number_format($count)
48 48
             )
49 49
         );
50 50
 
@@ -52,31 +52,31 @@  discard block
 block discarded – undo
52 52
             'name'                => $main_nav_name,
53 53
             'slug'                => WPINV_BP_SLUG,
54 54
             'position'            => $this->position,
55
-            'screen_function'     => array( $this, 'invoices_screen' ),
55
+            'screen_function'     => array($this, 'invoices_screen'),
56 56
             'default_subnav_slug' => 'invoices',
57 57
             'item_css_id'         => $this->id
58 58
         );
59 59
 
60
-        bp_core_new_nav_item( $main_nav );
60
+        bp_core_new_nav_item($main_nav);
61 61
     }
62 62
     
63 63
     public function invoices_screen() {
64
-        if ( wpinv_get_option( 'wpinv_bp_hide_menu' ) ) {
64
+        if (wpinv_get_option('wpinv_bp_hide_menu')) {
65 65
             return;
66 66
         }
67 67
         
68
-        add_action( 'bp_template_content', array( $this, 'invoices_content' ) );
68
+        add_action('bp_template_content', array($this, 'invoices_content'));
69 69
 
70
-        $template = apply_filters( 'bp_core_template_plugin', 'members/single/plugins' );
70
+        $template = apply_filters('bp_core_template_plugin', 'members/single/plugins');
71 71
         
72
-        bp_core_load_template( apply_filters( 'wpinv_bp_core_template_plugin', $template ) );
72
+        bp_core_load_template(apply_filters('wpinv_bp_core_template_plugin', $template));
73 73
     }
74 74
     
75 75
     public function invoices_content() {
76
-        if ( $this->has_invoices( bp_ajax_querystring( 'invoices' ) ) ) {
76
+        if ($this->has_invoices(bp_ajax_querystring('invoices'))) {
77 77
             global $invoices_template;
78 78
             
79
-            do_action( 'wpinv_bp_invoices_before_content' );
79
+            do_action('wpinv_bp_invoices_before_content');
80 80
             ?>
81 81
             <div class="wpi-g wpi-bp-invoices invoices invoicing" style="position:relative">
82 82
                 <div id="pag-top" class="pagination">
@@ -90,61 +90,61 @@  discard block
 block discarded – undo
90 90
                 <table class="table table-bordered table-hover table-responsive wpi-user-invoices" style="margin:0">
91 91
                     <thead>
92 92
                         <tr>
93
-                            <?php foreach ( wpinv_get_user_invoices_columns() as $column_id => $column_name ) : ?>
94
-                                <th class="<?php echo esc_attr( $column_id ); ?> <?php echo (!empty($column_name['class']) ? $column_name['class'] : '');?>"><span class="nobr"><?php echo esc_html( $column_name['title'] ); ?></span></th>
93
+                            <?php foreach (wpinv_get_user_invoices_columns() as $column_id => $column_name) : ?>
94
+                                <th class="<?php echo esc_attr($column_id); ?> <?php echo (!empty($column_name['class']) ? $column_name['class'] : ''); ?>"><span class="nobr"><?php echo esc_html($column_name['title']); ?></span></th>
95 95
                             <?php endforeach; ?>
96 96
                         </tr>
97 97
                     </thead>
98 98
                     <tbody>
99
-                        <?php foreach ( $invoices_template->invoices as $invoice ) {
99
+                        <?php foreach ($invoices_template->invoices as $invoice) {
100 100
                             ?>
101 101
                             <tr class="wpinv-item wpinv-item-<?php echo $invoice_status = $invoice->get_status(); ?>">
102
-                                <?php foreach ( wpinv_get_user_invoices_columns() as $column_id => $column_name ) : ?>
103
-                                    <td class="<?php echo esc_attr( $column_id ); ?> <?php echo (!empty($column_name['class']) ? $column_name['class'] : '');?>" data-title="<?php echo esc_attr( $column_name['title'] ); ?>">
104
-                                        <?php if ( has_action( 'wpinv_user_invoices_column_' . $column_id ) ) : ?>
105
-                                            <?php do_action( 'wpinv_user_invoices_column_' . $column_id, $invoice ); ?>
106
-
107
-                                        <?php elseif ( 'invoice-number' === $column_id ) : ?>
108
-                                            <a href="<?php echo esc_url( $invoice->get_view_url() ); ?>">
109
-                                                <?php echo _x( '#', 'hash before invoice number', 'invoicing' ) . $invoice->get_number(); ?>
102
+                                <?php foreach (wpinv_get_user_invoices_columns() as $column_id => $column_name) : ?>
103
+                                    <td class="<?php echo esc_attr($column_id); ?> <?php echo (!empty($column_name['class']) ? $column_name['class'] : ''); ?>" data-title="<?php echo esc_attr($column_name['title']); ?>">
104
+                                        <?php if (has_action('wpinv_user_invoices_column_' . $column_id)) : ?>
105
+                                            <?php do_action('wpinv_user_invoices_column_' . $column_id, $invoice); ?>
106
+
107
+                                        <?php elseif ('invoice-number' === $column_id) : ?>
108
+                                            <a href="<?php echo esc_url($invoice->get_view_url()); ?>">
109
+                                                <?php echo _x('#', 'hash before invoice number', 'invoicing') . $invoice->get_number(); ?>
110 110
                                             </a>
111 111
 
112
-                                        <?php elseif ( 'created-date' === $column_id ) : $date = wpinv_get_date_created( $invoice->ID ); $dateYMD = wpinv_get_date_created( $invoice->ID, 'Y-m-d H:i:s' ); ?>
113
-                                            <time datetime="<?php echo strtotime( $dateYMD ); ?>" title="<?php echo $dateYMD; ?>"><?php echo $date; ?></time>
112
+                                        <?php elseif ('created-date' === $column_id) : $date = wpinv_get_date_created($invoice->ID); $dateYMD = wpinv_get_date_created($invoice->ID, 'Y-m-d H:i:s'); ?>
113
+                                            <time datetime="<?php echo strtotime($dateYMD); ?>" title="<?php echo $dateYMD; ?>"><?php echo $date; ?></time>
114 114
 
115
-                                        <?php elseif ( 'payment-date' === $column_id ) : $date = wpinv_get_invoice_date( $invoice->ID, '', false ); $dateYMD = wpinv_get_invoice_date( $invoice->ID, 'Y-m-d H:i:s', false ); ?>
116
-                                            <time datetime="<?php echo strtotime( $dateYMD ); ?>" title="<?php echo $dateYMD; ?>"><?php echo $date; ?></time>
115
+                                        <?php elseif ('payment-date' === $column_id) : $date = wpinv_get_invoice_date($invoice->ID, '', false); $dateYMD = wpinv_get_invoice_date($invoice->ID, 'Y-m-d H:i:s', false); ?>
116
+                                            <time datetime="<?php echo strtotime($dateYMD); ?>" title="<?php echo $dateYMD; ?>"><?php echo $date; ?></time>
117 117
 
118
-                                        <?php elseif ( 'invoice-status' === $column_id ) : ?>
119
-                                            <?php echo $invoice->get_status_label_html() ; ?>
118
+                                        <?php elseif ('invoice-status' === $column_id) : ?>
119
+                                            <?php echo $invoice->get_status_label_html(); ?>
120 120
 
121
-                                        <?php elseif ( 'invoice-total' === $column_id ) : ?>
122
-                                            <?php echo $invoice->get_total( true ); ?>
121
+                                        <?php elseif ('invoice-total' === $column_id) : ?>
122
+                                            <?php echo $invoice->get_total(true); ?>
123 123
 
124
-                                        <?php elseif ( 'invoice-actions' === $column_id ) : ?>
124
+                                        <?php elseif ('invoice-actions' === $column_id) : ?>
125 125
                                             <?php
126 126
                                                 $actions = array(
127 127
                                                     'pay'    => array(
128 128
                                                         'url'  => $invoice->get_checkout_payment_url(),
129
-                                                        'name' => __( 'Pay Now', 'invoicing' ),
129
+                                                        'name' => __('Pay Now', 'invoicing'),
130 130
                                                         'class' => 'btn-success'
131 131
                                                     ),
132 132
                                                     'print'   => array(
133 133
                                                         'url'  => $invoice->get_view_url(),
134
-                                                        'name' => __( 'Print', 'invoicing' ),
134
+                                                        'name' => __('Print', 'invoicing'),
135 135
                                                         'class' => 'btn-primary',
136 136
                                                         'attrs' => 'target="_blank"'
137 137
                                                     )
138 138
                                                 );
139 139
 
140
-                                                if ( ! $invoice->needs_payment() ) {
141
-                                                    unset( $actions['pay'] );
140
+                                                if (!$invoice->needs_payment()) {
141
+                                                    unset($actions['pay']);
142 142
                                                 }
143 143
 
144
-                                                if ( $actions = apply_filters( 'wpinv_user_invoices_actions', $actions, $invoice ) ) {
145
-                                                    foreach ( $actions as $key => $action ) {
144
+                                                if ($actions = apply_filters('wpinv_user_invoices_actions', $actions, $invoice)) {
145
+                                                    foreach ($actions as $key => $action) {
146 146
                                                         $class = !empty($action['class']) ? sanitize_html_class($action['class']) : '';
147
-                                                        echo '<a href="' . esc_url( $action['url'] ) . '" class="btn btn-sm ' . $class . ' ' . sanitize_html_class( $key ) . '" ' . ( !empty($action['attrs']) ? $action['attrs'] : '' ) . '>' . $action['name'] . '</a>';
147
+                                                        echo '<a href="' . esc_url($action['url']) . '" class="btn btn-sm ' . $class . ' ' . sanitize_html_class($key) . '" ' . (!empty($action['attrs']) ? $action['attrs'] : '') . '>' . $action['name'] . '</a>';
148 148
                                                     }
149 149
                                                 }
150 150
                                             ?>
@@ -172,64 +172,64 @@  discard block
 block discarded – undo
172 172
             </div>
173 173
             <?php
174 174
         
175
-            do_action( 'wpinv_bp_invoices_after_content' );
175
+            do_action('wpinv_bp_invoices_after_content');
176 176
         } else {
177 177
             ?>
178 178
             <div id="message" class="info">
179
-                <p><?php _e( 'No invoice has been made yet.', 'invoicing' ); ?></p>
179
+                <p><?php _e('No invoice has been made yet.', 'invoicing'); ?></p>
180 180
             </div>
181 181
             <?php
182 182
         }
183 183
         
184
-        if ( defined( 'DOING_AJAX' ) ) {
184
+        if (defined('DOING_AJAX')) {
185 185
             exit;
186 186
         }
187 187
     }
188 188
     
189
-    public function has_invoices( $args = '' ) {
189
+    public function has_invoices($args = '') {
190 190
         global $invoices_template;
191 191
 
192
-        $per_page = absint( wpinv_get_option( 'wpinv_bp_per_page' ) );
192
+        $per_page = absint(wpinv_get_option('wpinv_bp_per_page'));
193 193
         // Parse arguments.
194
-        $r = bp_parse_args( $args, array(
194
+        $r = bp_parse_args($args, array(
195 195
             'status'            => 'all',
196 196
             'page_arg'          => 'bpage',
197 197
             'page'              => 1,
198 198
             'per_page'          => $per_page > 0 ? $per_page : 20,
199 199
             'max'               => false,
200 200
             'user_id'           => bp_displayed_user_id(),
201
-        ), 'has_invoices' );
201
+        ), 'has_invoices');
202 202
 
203 203
 
204
-        if ( ! empty( $r['max'] ) && ( (int)$r['per_page'] > (int)$r['max'] ) ) {
205
-            $r['per_page'] = (int)$r['max'];
204
+        if (!empty($r['max']) && ((int) $r['per_page'] > (int) $r['max'])) {
205
+            $r['per_page'] = (int) $r['max'];
206 206
         }
207 207
 
208 208
         // Get the invoices.
209
-        $invoices_template = new WPInv_BP_Invoices_Template( $r['status'], $r['page'], $r['per_page'], $r['max'], $r['user_id'], $r['page_arg'] );
209
+        $invoices_template = new WPInv_BP_Invoices_Template($r['status'], $r['page'], $r['per_page'], $r['max'], $r['user_id'], $r['page_arg']);
210 210
 
211
-        return apply_filters( 'wpinv_bp_has_invoices', $invoices_template->has_invoices(), $invoices_template, $r );
211
+        return apply_filters('wpinv_bp_has_invoices', $invoices_template->has_invoices(), $invoices_template, $r);
212 212
     }
213 213
     
214 214
     public function get_invoice_count() {
215
-        $query      = apply_filters( 'wpinv_user_invoices_count_query', array( 'status' => 'all','user' => bp_displayed_user_id(), 'limit' => '-1', 'return' => 'ids', 'paginate' => false ) );
216
-        $invoices   = wpinv_get_invoices( $query );
215
+        $query      = apply_filters('wpinv_user_invoices_count_query', array('status' => 'all', 'user' => bp_displayed_user_id(), 'limit' => '-1', 'return' => 'ids', 'paginate' => false));
216
+        $invoices   = wpinv_get_invoices($query);
217 217
         
218
-        return !empty( $invoices ) ? count( $invoices ) : 0;
218
+        return !empty($invoices) ? count($invoices) : 0;
219 219
     }
220 220
     
221 221
     public function pagination_count() {
222 222
         global $invoices_template;
223 223
 
224
-        $start_num = intval( ( $invoices_template->pag_page - 1 ) * $invoices_template->pag_num ) + 1;
225
-        $from_num  = bp_core_number_format( $start_num );
226
-        $to_num    = bp_core_number_format( ( $start_num + ( $invoices_template->pag_num - 1 ) > $invoices_template->total_invoice_count ) ? $invoices_template->total_invoice_count : $start_num + ( $invoices_template->pag_num - 1 ) );
227
-        $total     = bp_core_number_format( $invoices_template->total_invoice_count );
224
+        $start_num = intval(($invoices_template->pag_page - 1) * $invoices_template->pag_num) + 1;
225
+        $from_num  = bp_core_number_format($start_num);
226
+        $to_num    = bp_core_number_format(($start_num + ($invoices_template->pag_num - 1) > $invoices_template->total_invoice_count) ? $invoices_template->total_invoice_count : $start_num + ($invoices_template->pag_num - 1));
227
+        $total     = bp_core_number_format($invoices_template->total_invoice_count);
228 228
 
229
-        if ( 1 == $invoices_template->total_invoice_count ) {
230
-            $message = __( 'Viewing 1 invoice', 'invoicing' );
229
+        if (1 == $invoices_template->total_invoice_count) {
230
+            $message = __('Viewing 1 invoice', 'invoicing');
231 231
         } else {
232
-            $message = sprintf( _n( 'Viewing %1$s - %2$s of %3$s invoice', 'Viewing %1$s - %2$s of %3$s invoices', $invoices_template->total_invoice_count, 'invoicing' ), $from_num, $to_num, $total );
232
+            $message = sprintf(_n('Viewing %1$s - %2$s of %3$s invoice', 'Viewing %1$s - %2$s of %3$s invoices', $invoices_template->total_invoice_count, 'invoicing'), $from_num, $to_num, $total);
233 233
         }
234 234
 
235 235
         return $message;
@@ -238,32 +238,32 @@  discard block
 block discarded – undo
238 238
     function pagination_links() {
239 239
         global $invoices_template;
240 240
 
241
-        return apply_filters( 'wpinv_bp_get_pagination_links', $invoices_template->pag_links );
241
+        return apply_filters('wpinv_bp_get_pagination_links', $invoices_template->pag_links);
242 242
     }
243 243
     
244
-    public function bp_section( $settings = array() ) {
245
-        $settings['wpinv_bp'] = __( 'BuddyPress Integration', 'invoicing' );
244
+    public function bp_section($settings = array()) {
245
+        $settings['wpinv_bp'] = __('BuddyPress Integration', 'invoicing');
246 246
         return $settings;
247 247
     }
248 248
     
249
-    public function bp_settings( $settings = array() ) {
249
+    public function bp_settings($settings = array()) {
250 250
         $settings['wpinv_bp'] = array(
251 251
             'wpinv_bp_labels' => array(
252 252
                 'id'   => 'wpinv_bp_settings',
253
-                'name' => '<h3>' . __( 'BuddyPress Integration', 'invoicing' ) . '</h3>',
253
+                'name' => '<h3>' . __('BuddyPress Integration', 'invoicing') . '</h3>',
254 254
                 'desc' => '',
255 255
                 'type' => 'header',
256 256
             ),
257 257
             'wpinv_bp_hide_menu' => array(
258 258
                 'id'   => 'wpinv_bp_hide_menu',
259
-                'name' => __( 'Hide Invoices link', 'invoicing' ),
260
-                'desc' => __( 'Hide Invoices link from BP Profile menu.', 'invoicing' ),
259
+                'name' => __('Hide Invoices link', 'invoicing'),
260
+                'desc' => __('Hide Invoices link from BP Profile menu.', 'invoicing'),
261 261
                 'type' => 'checkbox',
262 262
             ),
263 263
             'wpinv_menu_position' => array(
264 264
                 'id'   => 'wpinv_menu_position',
265
-                'name' => __( 'Menu position', 'invoicing' ),
266
-                'desc' => __( 'Menu position for the Invoices link in BP Profile menu.', 'invoicing' ),
265
+                'name' => __('Menu position', 'invoicing'),
266
+                'desc' => __('Menu position for the Invoices link in BP Profile menu.', 'invoicing'),
267 267
                 'type' => 'number',
268 268
                 'size' => 'small',
269 269
                 'min'  => '1',
@@ -273,8 +273,8 @@  discard block
 block discarded – undo
273 273
             ),
274 274
             'wpinv_bp_per_page' => array(
275 275
                 'id'   => 'wpinv_bp_per_page',
276
-                'name' => __( 'Max invoices per page', 'invoicing' ),
277
-                'desc' => __( 'Enter a number to lists the invoices for each page.', 'invoicing' ),
276
+                'name' => __('Max invoices per page', 'invoicing'),
277
+                'desc' => __('Enter a number to lists the invoices for each page.', 'invoicing'),
278 278
                 'type' => 'number',
279 279
                 'size' => 'small',
280 280
                 'min'  => '1',
@@ -287,20 +287,20 @@  discard block
 block discarded – undo
287 287
         return $settings;
288 288
     }
289 289
 
290
-    public function wp_nav_menu_objects($items, $args){
291
-        if(!is_user_logged_in()){
290
+    public function wp_nav_menu_objects($items, $args) {
291
+        if (!is_user_logged_in()) {
292 292
             return $items;
293 293
         }
294 294
 
295
-        if(!apply_filters('wpinv_bp_invoice_history_redirect', true, $items, $args)){
295
+        if (!apply_filters('wpinv_bp_invoice_history_redirect', true, $items, $args)) {
296 296
             return $items;
297 297
         }
298 298
 
299 299
         $user_id = get_current_user_id();
300
-        $link = bp_core_get_user_domain( $user_id ).WPINV_BP_SLUG;
300
+        $link = bp_core_get_user_domain($user_id) . WPINV_BP_SLUG;
301 301
         $history_link = wpinv_get_history_page_uri();
302
-        foreach ( $items as $item ) {
303
-            $item->url = str_replace( $history_link, $link, $item->url );
302
+        foreach ($items as $item) {
303
+            $item->url = str_replace($history_link, $link, $item->url);
304 304
         }
305 305
 
306 306
         return $items;
@@ -318,78 +318,78 @@  discard block
 block discarded – undo
318 318
     public $pag_links = '';
319 319
     public $total_invoice_count = 0;
320 320
     
321
-    public function __construct( $status, $page, $per_page, $max, $user_id, $page_arg = 'bpage' ) {
322
-        $this->invoices = array( 'invoices' => array(), 'total' => 0 );
321
+    public function __construct($status, $page, $per_page, $max, $user_id, $page_arg = 'bpage') {
322
+        $this->invoices = array('invoices' => array(), 'total' => 0);
323 323
         
324
-        $this->pag_arg  = sanitize_key( $page_arg );
325
-        $this->pag_page = bp_sanitize_pagination_arg( $this->pag_arg, $page );
326
-        $this->pag_num  = bp_sanitize_pagination_arg( 'num', $per_page );
324
+        $this->pag_arg  = sanitize_key($page_arg);
325
+        $this->pag_page = bp_sanitize_pagination_arg($this->pag_arg, $page);
326
+        $this->pag_num  = bp_sanitize_pagination_arg('num', $per_page);
327 327
 
328
-        $query_args     = array( 'user' => $user_id, 'page' => $this->pag_page, 'limit' => $this->pag_num, 'return' => 'self', 'paginate' => true );
329
-        if ( !empty( $status ) && $status != 'all' ) {
328
+        $query_args     = array('user' => $user_id, 'page' => $this->pag_page, 'limit' => $this->pag_num, 'return' => 'self', 'paginate' => true);
329
+        if (!empty($status) && $status != 'all') {
330 330
            $query_args['status'] = $status;
331 331
         }
332
-        $invoices  = wpinv_get_invoices( apply_filters( 'wpinv_bp_user_invoices_query', $query_args ) );
332
+        $invoices = wpinv_get_invoices(apply_filters('wpinv_bp_user_invoices_query', $query_args));
333 333
         
334
-        if ( !empty( $invoices ) && !empty( $invoices->found_posts ) ) {
335
-            $this->invoices['invoices'] = array_map( 'wpinv_get_invoice', $invoices->posts );
334
+        if (!empty($invoices) && !empty($invoices->found_posts)) {
335
+            $this->invoices['invoices'] = array_map('wpinv_get_invoice', $invoices->posts);
336 336
             $this->invoices['total']    = $invoices->found_posts;
337 337
         }
338 338
 
339
-        if ( empty( $max ) || ( $max >= (int)$this->invoices['total'] ) ) {
340
-            $this->total_invoice_count = (int)$this->invoices['total'];
339
+        if (empty($max) || ($max >= (int) $this->invoices['total'])) {
340
+            $this->total_invoice_count = (int) $this->invoices['total'];
341 341
         } else {
342
-            $this->total_invoice_count = (int)$max;
342
+            $this->total_invoice_count = (int) $max;
343 343
         }
344 344
 
345 345
         $this->invoices = $this->invoices['invoices'];
346 346
 
347
-        $invoice_count = count( $this->invoices );
347
+        $invoice_count = count($this->invoices);
348 348
 
349
-        if ( empty( $max ) || ( $max >= (int)$invoice_count ) ) {
350
-            $this->invoice_count = (int)$invoice_count;
349
+        if (empty($max) || ($max >= (int) $invoice_count)) {
350
+            $this->invoice_count = (int) $invoice_count;
351 351
         } else {
352
-            $this->invoice_count = (int)$max;
352
+            $this->invoice_count = (int) $max;
353 353
         }
354 354
         
355
-        if ( ! empty( $this->total_invoice_count ) && ! empty( $this->pag_num ) ) {
356
-            $this->pag_links = paginate_links( array(
357
-                'base'      => add_query_arg( $this->pag_arg, '%#%' ),
355
+        if (!empty($this->total_invoice_count) && !empty($this->pag_num)) {
356
+            $this->pag_links = paginate_links(array(
357
+                'base'      => add_query_arg($this->pag_arg, '%#%'),
358 358
                 'format'    => '',
359
-                'total'     => ceil( (int)$this->total_invoice_count / (int)$this->pag_num ),
360
-                'current'   => (int)$this->pag_page,
361
-                'prev_text' => _x( '&larr;', 'Invoice pagination previous text', 'invoicing' ),
362
-                'next_text' => _x( '&rarr;', 'Invoice pagination next text',     'invoicing' ),
359
+                'total'     => ceil((int) $this->total_invoice_count / (int) $this->pag_num),
360
+                'current'   => (int) $this->pag_page,
361
+                'prev_text' => _x('&larr;', 'Invoice pagination previous text', 'invoicing'),
362
+                'next_text' => _x('&rarr;', 'Invoice pagination next text', 'invoicing'),
363 363
                 'mid_size'  => 1,
364 364
                 'add_args'  => array(),
365
-            ) );
365
+            ));
366 366
         }
367 367
     }
368 368
 
369 369
     public function has_invoices() {
370
-        return (bool) ! empty( $this->invoice_count );
370
+        return (bool) !empty($this->invoice_count);
371 371
     }
372 372
 
373 373
     public function next_invoice() {
374 374
         $this->current_invoice++;
375
-        $this->invoice = $this->invoices[ $this->current_invoice ];
375
+        $this->invoice = $this->invoices[$this->current_invoice];
376 376
 
377 377
         return $this->invoice;
378 378
     }
379 379
 
380 380
     public function rewind_invoices() {
381 381
         $this->current_invoice = -1;
382
-        if ( $this->invoice_count > 0 ) {
382
+        if ($this->invoice_count > 0) {
383 383
             $this->invoice = $this->invoices[0];
384 384
         }
385 385
     }
386 386
 
387 387
     public function invoices() {
388
-        if ( ( $this->current_invoice + 1 ) < $this->invoice_count ) {
388
+        if (($this->current_invoice + 1) < $this->invoice_count) {
389 389
             return true;
390
-        } elseif ( ( $this->current_invoice + 1 ) === $this->invoice_count ) {
390
+        } elseif (($this->current_invoice + 1) === $this->invoice_count) {
391 391
 
392
-            do_action( 'wpinv_bp_invoice_loop_end' );
392
+            do_action('wpinv_bp_invoice_loop_end');
393 393
             
394 394
             $this->rewind_invoices();
395 395
         }
@@ -403,19 +403,19 @@  discard block
 block discarded – undo
403 403
         $this->in_the_loop = true;
404 404
         $this->invoice     = $this->next_invoice();
405 405
 
406
-        if ( 0 === $this->current_invoice ) {
407
-            do_action( 'wpinv_bp_invoice_loop_start' );
406
+        if (0 === $this->current_invoice) {
407
+            do_action('wpinv_bp_invoice_loop_start');
408 408
         }
409 409
     }
410 410
 }
411 411
 
412 412
 function wpinv_bp_setup_component() {
413 413
 
414
-    if(!class_exists( 'BuddyPress' )){
414
+    if (!class_exists('BuddyPress')) {
415 415
         return;
416 416
     }
417 417
 
418 418
     new WPInv_BP_Component();
419 419
 
420 420
 }
421
-add_action( 'bp_loaded', 'wpinv_bp_setup_component' );
422 421
\ No newline at end of file
422
+add_action('bp_loaded', 'wpinv_bp_setup_component');
423 423
\ No newline at end of file
Please login to merge, or discard this patch.
includes/wpinv-discount-functions.php 2 patches
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -887,8 +887,8 @@
 block discarded – undo
887 887
     if ( !empty( $data ) && isset( $data['cart_discounts'] ) ) {
888 888
         unset( $data['cart_discounts'] );
889 889
         
890
-         wpinv_set_checkout_session( $data );
891
-         return true;
890
+            wpinv_set_checkout_session( $data );
891
+            return true;
892 892
     }
893 893
     
894 894
     return false;
Please login to merge, or discard this patch.
Spacing   +284 added lines, -284 removed lines patch added patch discarded remove patch
@@ -6,7 +6,7 @@  discard block
 block discarded – undo
6 6
  * @package Invoicing
7 7
  */
8 8
  
9
-defined( 'ABSPATH' ) || exit;
9
+defined('ABSPATH') || exit;
10 10
 
11 11
 /**
12 12
  * Returns an array of discount type.
@@ -17,8 +17,8 @@  discard block
 block discarded – undo
17 17
     return apply_filters(
18 18
         'wpinv_discount_types',
19 19
         array(
20
-            'percent'   => __( 'Percentage', 'invoicing' ),
21
-            'flat'     => __( 'Flat Amount', 'invoicing' ),
20
+            'percent'   => __('Percentage', 'invoicing'),
21
+            'flat'     => __('Flat Amount', 'invoicing'),
22 22
         )
23 23
     );
24 24
 }
@@ -28,9 +28,9 @@  discard block
 block discarded – undo
28 28
  * 
29 29
  * @return string
30 30
  */
31
-function wpinv_get_discount_type_name( $type = '' ) {
31
+function wpinv_get_discount_type_name($type = '') {
32 32
     $types = wpinv_get_discount_types();
33
-    return isset( $types[ $type ] ) ? $types[ $type ] : $type;
33
+    return isset($types[$type]) ? $types[$type] : $type;
34 34
 }
35 35
 
36 36
 /**
@@ -38,94 +38,94 @@  discard block
 block discarded – undo
38 38
  * 
39 39
  * @return string
40 40
  */
41
-function wpinv_delete_discount( $data ) {
41
+function wpinv_delete_discount($data) {
42 42
 
43
-    if ( ! isset( $data['_wpnonce'] ) || ! wp_verify_nonce( $data['_wpnonce'], 'wpinv_discount_nonce' ) ) {
43
+    if (!isset($data['_wpnonce']) || !wp_verify_nonce($data['_wpnonce'], 'wpinv_discount_nonce')) {
44 44
         exit;
45 45
     }
46 46
 
47
-    if( ! wpinv_current_user_can_manage_invoicing() ) {
48
-        wp_die( __( 'You do not have permission to delete discount codes', 'invoicing' ), __( 'Error', 'invoicing' ), array( 'response' => 403 ) );
47
+    if (!wpinv_current_user_can_manage_invoicing()) {
48
+        wp_die(__('You do not have permission to delete discount codes', 'invoicing'), __('Error', 'invoicing'), array('response' => 403));
49 49
     }
50 50
 
51 51
     $discount_id = $data['discount'];
52
-    wpinv_remove_discount( $discount_id );
52
+    wpinv_remove_discount($discount_id);
53 53
 }
54
-add_action( 'wpinv_delete_discount', 'wpinv_delete_discount' );
54
+add_action('wpinv_delete_discount', 'wpinv_delete_discount');
55 55
 
56
-function wpinv_activate_discount( $data ) {
57
-    if ( ! isset( $data['_wpnonce'] ) || ! wp_verify_nonce( $data['_wpnonce'], 'wpinv_discount_nonce' ) ) {
58
-        wp_die( __( 'Trying to cheat or something?', 'invoicing' ), __( 'Error', 'invoicing' ), array( 'response' => 403 ) );
56
+function wpinv_activate_discount($data) {
57
+    if (!isset($data['_wpnonce']) || !wp_verify_nonce($data['_wpnonce'], 'wpinv_discount_nonce')) {
58
+        wp_die(__('Trying to cheat or something?', 'invoicing'), __('Error', 'invoicing'), array('response' => 403));
59 59
     }
60 60
 
61
-    if( ! wpinv_current_user_can_manage_invoicing() ) {
62
-        wp_die( __( 'You do not have permission to edit discount codes', 'invoicing' ), __( 'Error', 'invoicing' ), array( 'response' => 403 ) );
61
+    if (!wpinv_current_user_can_manage_invoicing()) {
62
+        wp_die(__('You do not have permission to edit discount codes', 'invoicing'), __('Error', 'invoicing'), array('response' => 403));
63 63
     }
64 64
 
65
-    $id = absint( $data['discount'] );
66
-    wpinv_update_discount_status( $id, 'publish' );
65
+    $id = absint($data['discount']);
66
+    wpinv_update_discount_status($id, 'publish');
67 67
 }
68
-add_action( 'wpinv_activate_discount', 'wpinv_activate_discount' );
68
+add_action('wpinv_activate_discount', 'wpinv_activate_discount');
69 69
 
70
-function wpinv_deactivate_discount( $data ) {
71
-    if ( ! isset( $data['_wpnonce'] ) || ! wp_verify_nonce( $data['_wpnonce'], 'wpinv_discount_nonce' ) ) {
72
-        wp_die( __( 'Trying to cheat or something?', 'invoicing' ), __( 'Error', 'invoicing' ), array( 'response' => 403 ) );
70
+function wpinv_deactivate_discount($data) {
71
+    if (!isset($data['_wpnonce']) || !wp_verify_nonce($data['_wpnonce'], 'wpinv_discount_nonce')) {
72
+        wp_die(__('Trying to cheat or something?', 'invoicing'), __('Error', 'invoicing'), array('response' => 403));
73 73
     }
74 74
 
75
-    if( ! wpinv_current_user_can_manage_invoicing() ) {
76
-        wp_die( __( 'You do not have permission to create discount codes', 'invoicing' ), array( 'response' => 403 ) );
75
+    if (!wpinv_current_user_can_manage_invoicing()) {
76
+        wp_die(__('You do not have permission to create discount codes', 'invoicing'), array('response' => 403));
77 77
     }
78 78
 
79
-    $id = absint( $data['discount'] );
80
-    wpinv_update_discount_status( $id, 'pending' );
79
+    $id = absint($data['discount']);
80
+    wpinv_update_discount_status($id, 'pending');
81 81
 }
82
-add_action( 'wpinv_deactivate_discount', 'wpinv_deactivate_discount' );
82
+add_action('wpinv_deactivate_discount', 'wpinv_deactivate_discount');
83 83
 
84
-function wpinv_get_discounts( $args = array() ) {
84
+function wpinv_get_discounts($args = array()) {
85 85
     $defaults = array(
86 86
         'post_type'      => 'wpi_discount',
87 87
         'posts_per_page' => 20,
88 88
         'paged'          => null,
89
-        'post_status'    => array( 'publish', 'pending', 'draft', 'expired' )
89
+        'post_status'    => array('publish', 'pending', 'draft', 'expired')
90 90
     );
91 91
 
92
-    $args = wp_parse_args( $args, $defaults );
92
+    $args = wp_parse_args($args, $defaults);
93 93
 
94
-    $discounts = get_posts( $args );
94
+    $discounts = get_posts($args);
95 95
 
96
-    if ( $discounts ) {
96
+    if ($discounts) {
97 97
         return $discounts;
98 98
     }
99 99
 
100
-    if( ! $discounts && ! empty( $args['s'] ) ) {
100
+    if (!$discounts && !empty($args['s'])) {
101 101
         $args['meta_key']     = '_wpi_discount_code';
102 102
         $args['meta_value']   = $args['s'];
103 103
         $args['meta_compare'] = 'LIKE';
104
-        unset( $args['s'] );
105
-        $discounts = get_posts( $args );
104
+        unset($args['s']);
105
+        $discounts = get_posts($args);
106 106
     }
107 107
 
108
-    if( $discounts ) {
108
+    if ($discounts) {
109 109
         return $discounts;
110 110
     }
111 111
 
112 112
     return false;
113 113
 }
114 114
 
115
-function wpinv_get_all_discounts( $args = array() ) {
115
+function wpinv_get_all_discounts($args = array()) {
116 116
 
117
-    $args = wp_parse_args( $args, array(
118
-        'status'         => array( 'publish' ),
119
-        'limit'          => get_option( 'posts_per_page' ),
117
+    $args = wp_parse_args($args, array(
118
+        'status'         => array('publish'),
119
+        'limit'          => get_option('posts_per_page'),
120 120
         'page'           => 1,
121 121
         'exclude'        => array(),
122 122
         'orderby'        => 'date',
123 123
         'order'          => 'DESC',
124
-        'type'           => array_keys( wpinv_get_discount_types() ),
124
+        'type'           => array_keys(wpinv_get_discount_types()),
125 125
         'meta_query'     => array(),
126 126
         'return'         => 'objects',
127 127
         'paginate'       => false,
128
-    ) );
128
+    ));
129 129
 
130 130
     $wp_query_args = array(
131 131
         'post_type'      => 'wpi_discount',
@@ -135,18 +135,18 @@  discard block
 block discarded – undo
135 135
         'fields'         => 'ids',
136 136
         'orderby'        => $args['orderby'],
137 137
         'order'          => $args['order'],
138
-        'paged'          => absint( $args['page'] ),
138
+        'paged'          => absint($args['page']),
139 139
     );
140 140
 
141
-    if ( ! empty( $args['exclude'] ) ) {
142
-        $wp_query_args['post__not_in'] = array_map( 'absint', $args['exclude'] );
141
+    if (!empty($args['exclude'])) {
142
+        $wp_query_args['post__not_in'] = array_map('absint', $args['exclude']);
143 143
     }
144 144
 
145
-    if ( ! $args['paginate' ] ) {
145
+    if (!$args['paginate']) {
146 146
         $wp_query_args['no_found_rows'] = true;
147 147
     }
148 148
 
149
-    if ( ! empty( $args['search'] ) ) {
149
+    if (!empty($args['search'])) {
150 150
 
151 151
         $wp_query_args['meta_query'][] = array(
152 152
             'key'     => '_wpi_discount_code',
@@ -156,11 +156,11 @@  discard block
 block discarded – undo
156 156
 
157 157
     }
158 158
 
159
-    if ( ! empty( $args['type'] ) ) {
160
-        $types = wpinv_parse_list( $args['type'] );
159
+    if (!empty($args['type'])) {
160
+        $types = wpinv_parse_list($args['type']);
161 161
         $wp_query_args['meta_query'][] = array(
162 162
             'key'     => '_wpi_discount_type',
163
-            'value'   => implode( ',', $types ),
163
+            'value'   => implode(',', $types),
164 164
             'compare' => 'IN',
165 165
         );
166 166
     }
@@ -168,17 +168,17 @@  discard block
 block discarded – undo
168 168
     $wp_query_args = apply_filters('wpinv_get_discount_args', $wp_query_args, $args);
169 169
 
170 170
     // Get results.
171
-    $discounts = new WP_Query( $wp_query_args );
171
+    $discounts = new WP_Query($wp_query_args);
172 172
 
173
-    if ( 'objects' === $args['return'] ) {
174
-        $return = array_map( 'get_post', $discounts->posts );
175
-    } elseif ( 'self' === $args['return'] ) {
173
+    if ('objects' === $args['return']) {
174
+        $return = array_map('get_post', $discounts->posts);
175
+    } elseif ('self' === $args['return']) {
176 176
         return $discounts;
177 177
     } else {
178 178
         $return = $discounts->posts;
179 179
     }
180 180
 
181
-    if ( $args['paginate' ] ) {
181
+    if ($args['paginate']) {
182 182
         return (object) array(
183 183
             'discounts'      => $return,
184 184
             'total'         => $discounts->found_posts,
@@ -195,9 +195,9 @@  discard block
 block discarded – undo
195 195
 
196 196
     $discounts  = wpinv_get_discounts();
197 197
 
198
-    if ( $discounts) {
199
-        foreach ( $discounts as $discount ) {
200
-            if ( wpinv_is_discount_active( $discount->ID, true ) ) {
198
+    if ($discounts) {
199
+        foreach ($discounts as $discount) {
200
+            if (wpinv_is_discount_active($discount->ID, true)) {
201 201
                 $has_active = true;
202 202
                 break;
203 203
             }
@@ -206,16 +206,16 @@  discard block
 block discarded – undo
206 206
     return $has_active;
207 207
 }
208 208
 
209
-function wpinv_get_discount( $discount_id = 0 ) {
210
-    if( empty( $discount_id ) ) {
209
+function wpinv_get_discount($discount_id = 0) {
210
+    if (empty($discount_id)) {
211 211
         return false;
212 212
     }
213 213
 
214
-    if ( get_post_type( $discount_id ) != 'wpi_discount' ) {
214
+    if (get_post_type($discount_id) != 'wpi_discount') {
215 215
         return false;
216 216
     }
217 217
 
218
-    $discount = get_post( $discount_id );
218
+    $discount = get_post($discount_id);
219 219
 
220 220
     return $discount;
221 221
 }
@@ -227,8 +227,8 @@  discard block
 block discarded – undo
227 227
  * @since 1.0.15
228 228
  * @return WPInv_Discount
229 229
  */
230
-function wpinv_get_discount_obj( $discount = 0 ) {
231
-    return new WPInv_Discount( $discount );
230
+function wpinv_get_discount_obj($discount = 0) {
231
+    return new WPInv_Discount($discount);
232 232
 }
233 233
 
234 234
 /**
@@ -237,8 +237,8 @@  discard block
 block discarded – undo
237 237
  * @param string $code The discount code.
238 238
  * @return bool|WPInv_Discount
239 239
  */
240
-function wpinv_get_discount_by_code( $code = '' ) {
241
-    return wpinv_get_discount_by( null, $code );
240
+function wpinv_get_discount_by_code($code = '') {
241
+    return wpinv_get_discount_by(null, $code);
242 242
 }
243 243
 
244 244
 /**
@@ -248,10 +248,10 @@  discard block
 block discarded – undo
248 248
  * @param string|int $value The field value
249 249
  * @return bool|WPInv_Discount
250 250
  */
251
-function wpinv_get_discount_by( $deprecated = null, $value = '' ) {
252
-    $discount = new WPInv_Discount( $value );
251
+function wpinv_get_discount_by($deprecated = null, $value = '') {
252
+    $discount = new WPInv_Discount($value);
253 253
 
254
-    if ( $discount->get_id() != 0 ) {
254
+    if ($discount->get_id() != 0) {
255 255
         return $discount;
256 256
     }
257 257
 
@@ -265,68 +265,68 @@  discard block
 block discarded – undo
265 265
  * @param array $data The discount's properties.
266 266
  * @return bool
267 267
  */
268
-function wpinv_store_discount( $post_id, $data, $post, $update = false ) {
268
+function wpinv_store_discount($post_id, $data, $post, $update = false) {
269 269
     $meta = array(
270
-        'code'              => isset( $data['code'] )             ? sanitize_text_field( $data['code'] )              : '',
271
-        'type'              => isset( $data['type'] )             ? sanitize_text_field( $data['type'] )              : 'percent',
272
-        'amount'            => isset( $data['amount'] )           ? wpinv_sanitize_amount( $data['amount'] )          : '',
273
-        'start'             => isset( $data['start'] )            ? sanitize_text_field( $data['start'] )             : '',
274
-        'expiration'        => isset( $data['expiration'] )       ? sanitize_text_field( $data['expiration'] )        : '',
275
-        'min_total'         => isset( $data['min_total'] )        ? wpinv_sanitize_amount( $data['min_total'] )       : '',
276
-        'max_total'         => isset( $data['max_total'] )        ? wpinv_sanitize_amount( $data['max_total'] )       : '',
277
-        'max_uses'          => isset( $data['max_uses'] )         ? absint( $data['max_uses'] )                       : '',
278
-        'items'             => isset( $data['items'] )            ? $data['items']                                    : array(),
279
-        'excluded_items'    => isset( $data['excluded_items'] )   ? $data['excluded_items']                           : array(),
280
-        'is_recurring'      => isset( $data['recurring'] )        ? (bool)$data['recurring']                          : false,
281
-        'is_single_use'     => isset( $data['single_use'] )       ? (bool)$data['single_use']                         : false,
282
-        'uses'              => isset( $data['uses'] )             ? (int)$data['uses']                                : false,
270
+        'code'              => isset($data['code']) ? sanitize_text_field($data['code']) : '',
271
+        'type'              => isset($data['type']) ? sanitize_text_field($data['type']) : 'percent',
272
+        'amount'            => isset($data['amount']) ? wpinv_sanitize_amount($data['amount']) : '',
273
+        'start'             => isset($data['start']) ? sanitize_text_field($data['start']) : '',
274
+        'expiration'        => isset($data['expiration']) ? sanitize_text_field($data['expiration']) : '',
275
+        'min_total'         => isset($data['min_total']) ? wpinv_sanitize_amount($data['min_total']) : '',
276
+        'max_total'         => isset($data['max_total']) ? wpinv_sanitize_amount($data['max_total']) : '',
277
+        'max_uses'          => isset($data['max_uses']) ? absint($data['max_uses']) : '',
278
+        'items'             => isset($data['items']) ? $data['items'] : array(),
279
+        'excluded_items'    => isset($data['excluded_items']) ? $data['excluded_items'] : array(),
280
+        'is_recurring'      => isset($data['recurring']) ? (bool) $data['recurring'] : false,
281
+        'is_single_use'     => isset($data['single_use']) ? (bool) $data['single_use'] : false,
282
+        'uses'              => isset($data['uses']) ? (int) $data['uses'] : false,
283 283
     );
284 284
 
285
-    if ( $meta['type'] == 'percent' && (float)$meta['amount'] > 100 ) {
285
+    if ($meta['type'] == 'percent' && (float) $meta['amount'] > 100) {
286 286
         $meta['amount'] = 100;
287 287
     }
288 288
 
289
-    if ( !empty( $meta['start'] ) ) {
290
-        $meta['start']      = date_i18n( 'Y-m-d H:i:s', strtotime( $meta['start'] ) );
289
+    if (!empty($meta['start'])) {
290
+        $meta['start'] = date_i18n('Y-m-d H:i:s', strtotime($meta['start']));
291 291
     }
292 292
 
293
-    if ( !empty( $meta['expiration'] ) ) {
294
-        $meta['expiration'] = date_i18n( 'Y-m-d H:i:s', strtotime( $meta['expiration'] ) );
293
+    if (!empty($meta['expiration'])) {
294
+        $meta['expiration'] = date_i18n('Y-m-d H:i:s', strtotime($meta['expiration']));
295 295
 
296
-        if ( !empty( $meta['start'] ) && strtotime( $meta['start'] ) > strtotime( $meta['expiration'] ) ) {
296
+        if (!empty($meta['start']) && strtotime($meta['start']) > strtotime($meta['expiration'])) {
297 297
             $meta['expiration'] = $meta['start'];
298 298
         }
299 299
     }
300 300
 
301
-    if ( $meta['uses'] === false ) {
302
-        unset( $meta['uses'] );
301
+    if ($meta['uses'] === false) {
302
+        unset($meta['uses']);
303 303
     }
304 304
 
305
-    if ( ! empty( $meta['items'] ) ) {
306
-        foreach ( $meta['items'] as $key => $item ) {
307
-            if ( 0 === intval( $item ) ) {
308
-                unset( $meta['items'][ $key ] );
305
+    if (!empty($meta['items'])) {
306
+        foreach ($meta['items'] as $key => $item) {
307
+            if (0 === intval($item)) {
308
+                unset($meta['items'][$key]);
309 309
             }
310 310
         }
311 311
     }
312 312
 
313
-    if ( ! empty( $meta['excluded_items'] ) ) {
314
-        foreach ( $meta['excluded_items'] as $key => $item ) {
315
-            if ( 0 === intval( $item ) ) {
316
-                unset( $meta['excluded_items'][ $key ] );
313
+    if (!empty($meta['excluded_items'])) {
314
+        foreach ($meta['excluded_items'] as $key => $item) {
315
+            if (0 === intval($item)) {
316
+                unset($meta['excluded_items'][$key]);
317 317
             }
318 318
         }
319 319
     }
320 320
 
321
-    $meta = apply_filters( 'wpinv_update_discount', $meta, $post_id, $post );
321
+    $meta = apply_filters('wpinv_update_discount', $meta, $post_id, $post);
322 322
 
323
-    do_action( 'wpinv_pre_update_discount', $meta, $post_id, $post );
323
+    do_action('wpinv_pre_update_discount', $meta, $post_id, $post);
324 324
 
325
-    foreach( $meta as $key => $value ) {
326
-        update_post_meta( $post_id, '_wpi_discount_' . $key, $value );
325
+    foreach ($meta as $key => $value) {
326
+        update_post_meta($post_id, '_wpi_discount_' . $key, $value);
327 327
     }
328 328
 
329
-    do_action( 'wpinv_post_update_discount', $meta, $post_id, $post );
329
+    do_action('wpinv_post_update_discount', $meta, $post_id, $post);
330 330
 
331 331
     return $post_id;
332 332
 }
@@ -337,10 +337,10 @@  discard block
 block discarded – undo
337 337
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
338 338
  * @return bool
339 339
  */
340
-function wpinv_remove_discount( $discount = 0 ) {
340
+function wpinv_remove_discount($discount = 0) {
341 341
 
342
-    $discount = wpinv_get_discount_obj( $discount );
343
-    if( ! $discount->exists() ) {
342
+    $discount = wpinv_get_discount_obj($discount);
343
+    if (!$discount->exists()) {
344 344
         return false;
345 345
     }
346 346
 
@@ -355,9 +355,9 @@  discard block
 block discarded – undo
355 355
  * @param string $new_status
356 356
  * @return bool
357 357
  */
358
-function wpinv_update_discount_status( $discount = 0, $new_status = 'publish' ) {
359
-    $discount = wpinv_get_discount_obj( $discount );
360
-    return $discount->update_status( $new_status );
358
+function wpinv_update_discount_status($discount = 0, $new_status = 'publish') {
359
+    $discount = wpinv_get_discount_obj($discount);
360
+    return $discount->update_status($new_status);
361 361
 }
362 362
 
363 363
 /**
@@ -366,48 +366,48 @@  discard block
 block discarded – undo
366 366
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
367 367
  * @return bool
368 368
  */
369
-function wpinv_discount_exists( $discount ) {
370
-    $discount = wpinv_get_discount_obj( $discount );
369
+function wpinv_discount_exists($discount) {
370
+    $discount = wpinv_get_discount_obj($discount);
371 371
     return $discount->exists();
372 372
 }
373 373
 
374
-function wpinv_is_discount_active( $code_id = null, $silent = false ) {
375
-    $discount = wpinv_get_discount(  $code_id );
374
+function wpinv_is_discount_active($code_id = null, $silent = false) {
375
+    $discount = wpinv_get_discount($code_id);
376 376
     $return   = false;
377 377
 
378
-    if ( $discount ) {
379
-        if ( wpinv_is_discount_expired( $code_id, $silent ) ) {
380
-            if( defined( 'DOING_AJAX' ) && ! $silent ) {
381
-                wpinv_set_error( 'wpinv-discount-error', __( 'This discount is expired.', 'invoicing' ) );
378
+    if ($discount) {
379
+        if (wpinv_is_discount_expired($code_id, $silent)) {
380
+            if (defined('DOING_AJAX') && !$silent) {
381
+                wpinv_set_error('wpinv-discount-error', __('This discount is expired.', 'invoicing'));
382 382
             }
383
-        } elseif ( $discount->post_status == 'publish' ) {
383
+        } elseif ($discount->post_status == 'publish') {
384 384
             $return = true;
385 385
         } else {
386
-            if( defined( 'DOING_AJAX' ) && ! $silent ) {
387
-                wpinv_set_error( 'wpinv-discount-error', __( 'This discount is not active.', 'invoicing' ) );
386
+            if (defined('DOING_AJAX') && !$silent) {
387
+                wpinv_set_error('wpinv-discount-error', __('This discount is not active.', 'invoicing'));
388 388
             }
389 389
         }
390 390
     }
391 391
 
392
-    return apply_filters( 'wpinv_is_discount_active', $return, $code_id );
392
+    return apply_filters('wpinv_is_discount_active', $return, $code_id);
393 393
 }
394 394
 
395
-function wpinv_get_discount_code( $code_id = null ) {
396
-    $code = get_post_meta( $code_id, '_wpi_discount_code', true );
395
+function wpinv_get_discount_code($code_id = null) {
396
+    $code = get_post_meta($code_id, '_wpi_discount_code', true);
397 397
 
398
-    return apply_filters( 'wpinv_get_discount_code', $code, $code_id );
398
+    return apply_filters('wpinv_get_discount_code', $code, $code_id);
399 399
 }
400 400
 
401
-function wpinv_get_discount_start_date( $code_id = null ) {
402
-    $start_date = get_post_meta( $code_id, '_wpi_discount_start', true );
401
+function wpinv_get_discount_start_date($code_id = null) {
402
+    $start_date = get_post_meta($code_id, '_wpi_discount_start', true);
403 403
 
404
-    return apply_filters( 'wpinv_get_discount_start_date', $start_date, $code_id );
404
+    return apply_filters('wpinv_get_discount_start_date', $start_date, $code_id);
405 405
 }
406 406
 
407
-function wpinv_get_discount_expiration( $code_id = null ) {
408
-    $expiration = get_post_meta( $code_id, '_wpi_discount_expiration', true );
407
+function wpinv_get_discount_expiration($code_id = null) {
408
+    $expiration = get_post_meta($code_id, '_wpi_discount_expiration', true);
409 409
 
410
-    return apply_filters( 'wpinv_get_discount_expiration', $expiration, $code_id );
410
+    return apply_filters('wpinv_get_discount_expiration', $expiration, $code_id);
411 411
 }
412 412
 
413 413
 /**
@@ -416,8 +416,8 @@  discard block
 block discarded – undo
416 416
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
417 417
  * @return int
418 418
  */
419
-function wpinv_get_discount_max_uses( $discount = array() ) {
420
-    $discount = wpinv_get_discount_obj( $discount );
419
+function wpinv_get_discount_max_uses($discount = array()) {
420
+    $discount = wpinv_get_discount_obj($discount);
421 421
     return (int) $discount->max_uses;
422 422
 }
423 423
 
@@ -427,8 +427,8 @@  discard block
 block discarded – undo
427 427
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
428 428
  * @return int
429 429
  */
430
-function wpinv_get_discount_uses( $discount = array() ) {
431
-    $discount = wpinv_get_discount_obj( $discount );
430
+function wpinv_get_discount_uses($discount = array()) {
431
+    $discount = wpinv_get_discount_obj($discount);
432 432
     return (int) $discount->uses;
433 433
 }
434 434
 
@@ -438,8 +438,8 @@  discard block
 block discarded – undo
438 438
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
439 439
  * @return float
440 440
  */
441
-function wpinv_get_discount_min_total( $discount = array() ) {
442
-    $discount = wpinv_get_discount_obj( $discount );
441
+function wpinv_get_discount_min_total($discount = array()) {
442
+    $discount = wpinv_get_discount_obj($discount);
443 443
     return (float) $discount->min_total;
444 444
 }
445 445
 
@@ -449,8 +449,8 @@  discard block
 block discarded – undo
449 449
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
450 450
  * @return float
451 451
  */
452
-function wpinv_get_discount_max_total( $discount = array() ) {
453
-    $discount = wpinv_get_discount_obj( $discount );
452
+function wpinv_get_discount_max_total($discount = array()) {
453
+    $discount = wpinv_get_discount_obj($discount);
454 454
     return (float) $discount->max_total;
455 455
 }
456 456
 
@@ -460,8 +460,8 @@  discard block
 block discarded – undo
460 460
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
461 461
  * @return float
462 462
  */
463
-function wpinv_get_discount_amount( $discount = array() ) {
464
-    $discount = wpinv_get_discount_obj( $discount );
463
+function wpinv_get_discount_amount($discount = array()) {
464
+    $discount = wpinv_get_discount_obj($discount);
465 465
     return (float) $discount->amount;
466 466
 }
467 467
 
@@ -472,28 +472,28 @@  discard block
 block discarded – undo
472 472
  * @param bool $name
473 473
  * @return string
474 474
  */
475
-function wpinv_get_discount_type( $discount = array(), $name = false ) {
476
-    $discount = wpinv_get_discount_obj( $discount );
475
+function wpinv_get_discount_type($discount = array(), $name = false) {
476
+    $discount = wpinv_get_discount_obj($discount);
477 477
 
478 478
     // Are we returning the name or just the type.
479
-    if( $name ) {
479
+    if ($name) {
480 480
         return $discount->type_name;
481 481
     }
482 482
 
483 483
     return $discount->type;
484 484
 }
485 485
 
486
-function wpinv_discount_status( $status ) {
487
-    switch( $status ){
486
+function wpinv_discount_status($status) {
487
+    switch ($status) {
488 488
         case 'expired' :
489
-            $name = __( 'Expired', 'invoicing' );
489
+            $name = __('Expired', 'invoicing');
490 490
             break;
491 491
         case 'publish' :
492 492
         case 'active' :
493
-            $name = __( 'Active', 'invoicing' );
493
+            $name = __('Active', 'invoicing');
494 494
             break;
495 495
         default :
496
-            $name = __( 'Inactive', 'invoicing' );
496
+            $name = __('Inactive', 'invoicing');
497 497
             break;
498 498
     }
499 499
     return $name;
@@ -505,8 +505,8 @@  discard block
 block discarded – undo
505 505
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
506 506
  * @return array
507 507
  */
508
-function wpinv_get_discount_excluded_items( $discount = array() ) {
509
-    $discount = wpinv_get_discount_obj( $discount );
508
+function wpinv_get_discount_excluded_items($discount = array()) {
509
+    $discount = wpinv_get_discount_obj($discount);
510 510
     return $discount->excluded_items;
511 511
 }
512 512
 
@@ -516,17 +516,17 @@  discard block
 block discarded – undo
516 516
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
517 517
  * @return array
518 518
  */
519
-function wpinv_get_discount_item_reqs( $discount = array() ) {
520
-    $discount = wpinv_get_discount_obj( $discount );
519
+function wpinv_get_discount_item_reqs($discount = array()) {
520
+    $discount = wpinv_get_discount_obj($discount);
521 521
     return $discount->items;
522 522
 }
523 523
 
524
-function wpinv_get_discount_item_condition( $code_id = 0 ) {
525
-    return get_post_meta( $code_id, '_wpi_discount_item_condition', true );
524
+function wpinv_get_discount_item_condition($code_id = 0) {
525
+    return get_post_meta($code_id, '_wpi_discount_item_condition', true);
526 526
 }
527 527
 
528
-function wpinv_is_discount_not_global( $code_id = 0 ) {
529
-    return (bool) get_post_meta( $code_id, '_wpi_discount_is_not_global', true );
528
+function wpinv_is_discount_not_global($code_id = 0) {
529
+    return (bool) get_post_meta($code_id, '_wpi_discount_is_not_global', true);
530 530
 }
531 531
 
532 532
 /**
@@ -535,14 +535,14 @@  discard block
 block discarded – undo
535 535
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
536 536
  * @return bool
537 537
  */
538
-function wpinv_is_discount_expired( $discount = array(), $silent = false ) {
539
-    $discount = wpinv_get_discount_obj( $discount );
538
+function wpinv_is_discount_expired($discount = array(), $silent = false) {
539
+    $discount = wpinv_get_discount_obj($discount);
540 540
 
541
-    if ( $discount->is_expired() ) {
542
-        $discount->update_status( 'pending' );
541
+    if ($discount->is_expired()) {
542
+        $discount->update_status('pending');
543 543
 
544
-        if( empty( $silent ) ) {
545
-            wpinv_set_error( 'wpinv-discount-error', __( 'This discount has expired.', 'invoicing' ) );
544
+        if (empty($silent)) {
545
+            wpinv_set_error('wpinv-discount-error', __('This discount has expired.', 'invoicing'));
546 546
         }
547 547
         return true;
548 548
     }
@@ -556,12 +556,12 @@  discard block
 block discarded – undo
556 556
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
557 557
  * @return bool
558 558
  */
559
-function wpinv_is_discount_started( $discount = array() ) {
560
-    $discount = wpinv_get_discount_obj( $discount );
559
+function wpinv_is_discount_started($discount = array()) {
560
+    $discount = wpinv_get_discount_obj($discount);
561 561
     $started  = $discount->has_started();
562 562
 
563
-    if( empty( $started ) ) {
564
-        wpinv_set_error( 'wpinv-discount-error', __( 'This discount is not active yet.', 'invoicing' ) );
563
+    if (empty($started)) {
564
+        wpinv_set_error('wpinv-discount-error', __('This discount is not active yet.', 'invoicing'));
565 565
     }
566 566
 
567 567
     return $started;
@@ -573,10 +573,10 @@  discard block
 block discarded – undo
573 573
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
574 574
  * @return bool
575 575
  */
576
-function wpinv_check_discount_dates( $discount ) {
577
-    $discount = wpinv_get_discount_obj( $discount );
578
-    $return   = wpinv_is_discount_started( $discount ) && ! wpinv_is_discount_expired( $discount );
579
-    return apply_filters( 'wpinv_check_discount_dates', $return, $discount->ID, $discount, $discount->code );
576
+function wpinv_check_discount_dates($discount) {
577
+    $discount = wpinv_get_discount_obj($discount);
578
+    $return   = wpinv_is_discount_started($discount) && !wpinv_is_discount_expired($discount);
579
+    return apply_filters('wpinv_check_discount_dates', $return, $discount->ID, $discount, $discount->code);
580 580
 }
581 581
 
582 582
 /**
@@ -585,12 +585,12 @@  discard block
 block discarded – undo
585 585
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
586 586
  * @return bool
587 587
  */
588
-function wpinv_is_discount_maxed_out( $discount ) {
589
-    $discount    = wpinv_get_discount_obj( $discount );
588
+function wpinv_is_discount_maxed_out($discount) {
589
+    $discount    = wpinv_get_discount_obj($discount);
590 590
     $maxed_out   = $discount->has_exceeded_limit();
591 591
 
592
-    if ( $maxed_out ) {
593
-        wpinv_set_error( 'wpinv-discount-error', __( 'This discount has reached its maximum usage.', 'invoicing' ) );
592
+    if ($maxed_out) {
593
+        wpinv_set_error('wpinv-discount-error', __('This discount has reached its maximum usage.', 'invoicing'));
594 594
     }
595 595
 
596 596
     return $maxed_out;
@@ -603,9 +603,9 @@  discard block
 block discarded – undo
603 603
  * @param float $amount The amount to check for.
604 604
  * @return bool
605 605
  */
606
-function wpinv_discount_is_min_met( $discount, $amount = 0 ) {
607
-    $discount = wpinv_get_discount_obj( $discount );
608
-    return $discount->is_minimum_amount_met( $amount );
606
+function wpinv_discount_is_min_met($discount, $amount = 0) {
607
+    $discount = wpinv_get_discount_obj($discount);
608
+    return $discount->is_minimum_amount_met($amount);
609 609
 }
610 610
 
611 611
 /**
@@ -614,13 +614,13 @@  discard block
 block discarded – undo
614 614
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
615 615
  * @return bool
616 616
  */
617
-function wpinv_discount_is_max_met( $discount ) {
618
-    $discount    = wpinv_get_discount_obj( $discount );
619
-    $cart_amount = (float)wpinv_get_cart_discountable_subtotal( $discount->ID );
620
-    $max_met     = $discount->is_maximum_amount_met( $cart_amount );
617
+function wpinv_discount_is_max_met($discount) {
618
+    $discount    = wpinv_get_discount_obj($discount);
619
+    $cart_amount = (float) wpinv_get_cart_discountable_subtotal($discount->ID);
620
+    $max_met     = $discount->is_maximum_amount_met($cart_amount);
621 621
 
622
-    if ( ! $max_met ) {
623
-        wpinv_set_error( 'wpinv-discount-error', sprintf( __( 'Maximum invoice amount should be %s', 'invoicing' ), wpinv_price( wpinv_format_amount( $discount->max_total ) ) ) );
622
+    if (!$max_met) {
623
+        wpinv_set_error('wpinv-discount-error', sprintf(__('Maximum invoice amount should be %s', 'invoicing'), wpinv_price(wpinv_format_amount($discount->max_total))));
624 624
     }
625 625
 
626 626
     return $max_met;
@@ -632,8 +632,8 @@  discard block
 block discarded – undo
632 632
  * @param int|array|string|WPInv_Discount $discount discount data, object, ID or code.
633 633
  * @return bool
634 634
  */
635
-function wpinv_discount_is_single_use( $discount ) {
636
-    $discount    = wpinv_get_discount_obj( $discount );
635
+function wpinv_discount_is_single_use($discount) {
636
+    $discount = wpinv_get_discount_obj($discount);
637 637
     return $discount->is_single_use;
638 638
 }
639 639
 
@@ -644,53 +644,53 @@  discard block
 block discarded – undo
644 644
  * @param int|array|string|WPInv_Discount $code discount data, object, ID or code.
645 645
  * @return bool
646 646
  */
647
-function wpinv_discount_is_recurring( $discount = 0, $code = 0 ) {
647
+function wpinv_discount_is_recurring($discount = 0, $code = 0) {
648 648
 
649
-    if( ! empty( $discount ) ) {
650
-        $discount    = wpinv_get_discount_obj( $discount );
649
+    if (!empty($discount)) {
650
+        $discount    = wpinv_get_discount_obj($discount);
651 651
     } else {
652
-        $discount    = wpinv_get_discount_obj( $code );
652
+        $discount    = wpinv_get_discount_obj($code);
653 653
     }
654 654
 
655 655
     return $discount->get_is_recurring();
656 656
 }
657 657
 
658
-function wpinv_discount_item_reqs_met( $code_id = null ) {
659
-    $item_reqs    = wpinv_get_discount_item_reqs( $code_id );
660
-    $condition    = wpinv_get_discount_item_condition( $code_id );
661
-    $excluded_ps  = wpinv_get_discount_excluded_items( $code_id );
658
+function wpinv_discount_item_reqs_met($code_id = null) {
659
+    $item_reqs    = wpinv_get_discount_item_reqs($code_id);
660
+    $condition    = wpinv_get_discount_item_condition($code_id);
661
+    $excluded_ps  = wpinv_get_discount_excluded_items($code_id);
662 662
     $cart_items   = wpinv_get_cart_contents();
663
-    $cart_ids     = $cart_items ? wp_list_pluck( $cart_items, 'id' ) : null;
663
+    $cart_ids     = $cart_items ? wp_list_pluck($cart_items, 'id') : null;
664 664
     $ret          = false;
665 665
 
666
-    if ( empty( $item_reqs ) && empty( $excluded_ps ) ) {
666
+    if (empty($item_reqs) && empty($excluded_ps)) {
667 667
         $ret = true;
668 668
     }
669 669
 
670 670
     // Normalize our data for item requirements, exclusions and cart data
671 671
     // First absint the items, then sort, and reset the array keys
672
-    $item_reqs = array_map( 'absint', $item_reqs );
673
-    asort( $item_reqs );
674
-    $item_reqs = array_values( $item_reqs );
672
+    $item_reqs = array_map('absint', $item_reqs);
673
+    asort($item_reqs);
674
+    $item_reqs = array_values($item_reqs);
675 675
 
676
-    $excluded_ps  = array_map( 'absint', $excluded_ps );
677
-    asort( $excluded_ps );
678
-    $excluded_ps  = array_values( $excluded_ps );
676
+    $excluded_ps  = array_map('absint', $excluded_ps);
677
+    asort($excluded_ps);
678
+    $excluded_ps  = array_values($excluded_ps);
679 679
 
680
-    $cart_ids     = array_map( 'absint', $cart_ids );
681
-    asort( $cart_ids );
682
-    $cart_ids     = array_values( $cart_ids );
680
+    $cart_ids     = array_map('absint', $cart_ids);
681
+    asort($cart_ids);
682
+    $cart_ids     = array_values($cart_ids);
683 683
 
684 684
     // Ensure we have requirements before proceeding
685
-    if ( !$ret && ! empty( $item_reqs ) ) {
686
-        switch( $condition ) {
685
+    if (!$ret && !empty($item_reqs)) {
686
+        switch ($condition) {
687 687
             case 'all' :
688 688
                 // Default back to true
689 689
                 $ret = true;
690 690
 
691
-                foreach ( $item_reqs as $item_id ) {
692
-                    if ( !wpinv_item_in_cart( $item_id ) ) {
693
-                        wpinv_set_error( 'wpinv-discount-error', __( 'The item requirements for this discount are not met.', 'invoicing' ) );
691
+                foreach ($item_reqs as $item_id) {
692
+                    if (!wpinv_item_in_cart($item_id)) {
693
+                        wpinv_set_error('wpinv-discount-error', __('The item requirements for this discount are not met.', 'invoicing'));
694 694
                         $ret = false;
695 695
                         break;
696 696
                     }
@@ -699,15 +699,15 @@  discard block
 block discarded – undo
699 699
                 break;
700 700
 
701 701
             default : // Any
702
-                foreach ( $item_reqs as $item_id ) {
703
-                    if ( wpinv_item_in_cart( $item_id ) ) {
702
+                foreach ($item_reqs as $item_id) {
703
+                    if (wpinv_item_in_cart($item_id)) {
704 704
                         $ret = true;
705 705
                         break;
706 706
                     }
707 707
                 }
708 708
 
709
-                if( ! $ret ) {
710
-                    wpinv_set_error( 'wpinv-discount-error', __( 'The item requirements for this discount are not met.', 'invoicing' ) );
709
+                if (!$ret) {
710
+                    wpinv_set_error('wpinv-discount-error', __('The item requirements for this discount are not met.', 'invoicing'));
711 711
                 }
712 712
 
713 713
                 break;
@@ -716,15 +716,15 @@  discard block
 block discarded – undo
716 716
         $ret = true;
717 717
     }
718 718
 
719
-    if( ! empty( $excluded_ps ) ) {
719
+    if (!empty($excluded_ps)) {
720 720
         // Check that there are items other than excluded ones in the cart
721
-        if( $cart_ids == $excluded_ps ) {
722
-            wpinv_set_error( 'wpinv-discount-error', __( 'This discount is not valid for the cart contents.', 'invoicing' ) );
721
+        if ($cart_ids == $excluded_ps) {
722
+            wpinv_set_error('wpinv-discount-error', __('This discount is not valid for the cart contents.', 'invoicing'));
723 723
             $ret = false;
724 724
         }
725 725
     }
726 726
 
727
-    return (bool) apply_filters( 'wpinv_is_discount_item_req_met', $ret, $code_id, $condition );
727
+    return (bool) apply_filters('wpinv_is_discount_item_req_met', $ret, $code_id, $condition);
728 728
 }
729 729
 
730 730
 /**
@@ -735,54 +735,54 @@  discard block
 block discarded – undo
735 735
  * @param int|array|string|WPInv_Discount $code_id discount data, object, ID or code.
736 736
  * @return bool
737 737
  */
738
-function wpinv_is_discount_used( $discount = array(), $user = '', $code_id = array() ) {
738
+function wpinv_is_discount_used($discount = array(), $user = '', $code_id = array()) {
739 739
 
740
-    if( ! empty( $discount ) ) {
741
-        $discount = wpinv_get_discount_obj( $discount );
740
+    if (!empty($discount)) {
741
+        $discount = wpinv_get_discount_obj($discount);
742 742
     } else {
743
-        $discount = wpinv_get_discount_obj( $code_id );
743
+        $discount = wpinv_get_discount_obj($code_id);
744 744
     }
745 745
 
746
-    $is_used = ! $discount->is_valid_for_user( $user );
747
-    $is_used = apply_filters( 'wpinv_is_discount_used', $is_used, $discount->code, $user, $discount->ID, $discount );
746
+    $is_used = !$discount->is_valid_for_user($user);
747
+    $is_used = apply_filters('wpinv_is_discount_used', $is_used, $discount->code, $user, $discount->ID, $discount);
748 748
 
749
-    if( $is_used ) {
750
-        wpinv_set_error( 'wpinv-discount-error', __( 'This discount has already been redeemed.', 'invoicing' ) );
749
+    if ($is_used) {
750
+        wpinv_set_error('wpinv-discount-error', __('This discount has already been redeemed.', 'invoicing'));
751 751
     }
752 752
 
753 753
     return $is_used;
754 754
 }
755 755
 
756
-function wpinv_is_discount_valid( $code = '', $user = '', $set_error = true ) {
756
+function wpinv_is_discount_valid($code = '', $user = '', $set_error = true) {
757 757
 
758 758
     // Abort early if there is no discount code.
759
-    if ( empty( $code ) ) {
759
+    if (empty($code)) {
760 760
         return false;
761 761
     }
762 762
 
763 763
     $return      = false;
764
-    $discount_id = wpinv_get_discount_id_by_code( $code );
765
-    $user        = trim( $user );
764
+    $discount_id = wpinv_get_discount_id_by_code($code);
765
+    $user        = trim($user);
766 766
 
767
-    if ( wpinv_get_cart_contents() ) {
768
-        if ( $discount_id !== false ) {
767
+    if (wpinv_get_cart_contents()) {
768
+        if ($discount_id !== false) {
769 769
             if (
770
-                wpinv_is_discount_active( $discount_id ) &&
771
-                wpinv_check_discount_dates( $discount_id ) &&
772
-                !wpinv_is_discount_maxed_out( $discount_id ) &&
773
-                !wpinv_is_discount_used( $code, $user, $discount_id ) &&
774
-                wpinv_discount_is_min_met( $discount_id ) &&
775
-                wpinv_discount_is_max_met( $discount_id ) &&
776
-                wpinv_discount_item_reqs_met( $discount_id )
770
+                wpinv_is_discount_active($discount_id) &&
771
+                wpinv_check_discount_dates($discount_id) &&
772
+                !wpinv_is_discount_maxed_out($discount_id) &&
773
+                !wpinv_is_discount_used($code, $user, $discount_id) &&
774
+                wpinv_discount_is_min_met($discount_id) &&
775
+                wpinv_discount_is_max_met($discount_id) &&
776
+                wpinv_discount_item_reqs_met($discount_id)
777 777
             ) {
778 778
                 $return = true;
779 779
             }
780
-        } elseif( $set_error ) {
781
-            wpinv_set_error( 'wpinv-discount-error', __( 'This discount is invalid.', 'invoicing' ) );
780
+        } elseif ($set_error) {
781
+            wpinv_set_error('wpinv-discount-error', __('This discount is invalid.', 'invoicing'));
782 782
         }
783 783
     }
784 784
 
785
-    return apply_filters( 'wpinv_is_discount_valid', $return, $discount_id, $code, $user );
785
+    return apply_filters('wpinv_is_discount_valid', $return, $discount_id, $code, $user);
786 786
 }
787 787
 
788 788
 /**
@@ -791,9 +791,9 @@  discard block
 block discarded – undo
791 791
  * @param string $code
792 792
  * @return bool|false
793 793
  */
794
-function wpinv_get_discount_id_by_code( $code ) {
795
-    $discount = wpinv_get_discount_by_code( $code );
796
-    if ( $discount ) {
794
+function wpinv_get_discount_id_by_code($code) {
795
+    $discount = wpinv_get_discount_by_code($code);
796
+    if ($discount) {
797 797
         return $discount->get_id();
798 798
     }
799 799
     return false;
@@ -806,9 +806,9 @@  discard block
 block discarded – undo
806 806
  * @param float $base_price The number of usages to increase by
807 807
  * @return float
808 808
  */
809
-function wpinv_get_discounted_amount( $discount, $base_price ) {
810
-    $discount = wpinv_get_discount_obj( $discount );
811
-    return $discount->get_discounted_amount( $base_price );
809
+function wpinv_get_discounted_amount($discount, $base_price) {
810
+    $discount = wpinv_get_discount_obj($discount);
811
+    return $discount->get_discounted_amount($base_price);
812 812
 }
813 813
 
814 814
 /**
@@ -818,9 +818,9 @@  discard block
 block discarded – undo
818 818
  * @param int $by The number of usages to increase by.
819 819
  * @return int the new number of uses.
820 820
  */
821
-function wpinv_increase_discount_usage( $discount, $by = 1 ) {
822
-    $discount   = wpinv_get_discount_obj( $discount );
823
-    return $discount->increase_usage( $by );
821
+function wpinv_increase_discount_usage($discount, $by = 1) {
822
+    $discount = wpinv_get_discount_obj($discount);
823
+    return $discount->increase_usage($by);
824 824
 }
825 825
 
826 826
 /**
@@ -830,28 +830,28 @@  discard block
 block discarded – undo
830 830
  * @param int $by The number of usages to decrease by.
831 831
  * @return int the new number of uses.
832 832
  */
833
-function wpinv_decrease_discount_usage( $discount, $by = 1 ) {
834
-    $discount   = wpinv_get_discount_obj( $discount );
835
-    return $discount->increase_usage( 0 - $by );
833
+function wpinv_decrease_discount_usage($discount, $by = 1) {
834
+    $discount = wpinv_get_discount_obj($discount);
835
+    return $discount->increase_usage(0 - $by);
836 836
 }
837 837
 
838
-function wpinv_format_discount_rate( $type, $amount ) {
839
-    if ( $type == 'flat' ) {
840
-        $rate = wpinv_price( wpinv_format_amount( $amount ) );
838
+function wpinv_format_discount_rate($type, $amount) {
839
+    if ($type == 'flat') {
840
+        $rate = wpinv_price(wpinv_format_amount($amount));
841 841
     } else {
842 842
         $rate = $amount . '%';
843 843
     }
844 844
 
845
-    return apply_filters( 'wpinv_format_discount_rate', $rate, $type, $amount );
845
+    return apply_filters('wpinv_format_discount_rate', $rate, $type, $amount);
846 846
 }
847 847
 
848 848
 function wpinv_unset_all_cart_discounts() {
849 849
     $data = wpinv_get_checkout_session();
850 850
 
851
-    if ( !empty( $data ) && isset( $data['cart_discounts'] ) ) {
852
-        unset( $data['cart_discounts'] );
851
+    if (!empty($data) && isset($data['cart_discounts'])) {
852
+        unset($data['cart_discounts']);
853 853
 
854
-         wpinv_set_checkout_session( $data );
854
+         wpinv_set_checkout_session($data);
855 855
          return true;
856 856
     }
857 857
 
@@ -860,13 +860,13 @@  discard block
 block discarded – undo
860 860
 
861 861
 function wpinv_get_cart_discounts() {
862 862
     $session = wpinv_get_checkout_session();
863
-    return empty( $session['cart_discounts'] ) ? false : $session['cart_discounts'];
863
+    return empty($session['cart_discounts']) ? false : $session['cart_discounts'];
864 864
 }
865 865
 
866
-function wpinv_cart_has_discounts( $items = array() ) {
866
+function wpinv_cart_has_discounts($items = array()) {
867 867
     $ret = false;
868 868
 
869
-    if ( wpinv_get_cart_discounts( $items ) ) {
869
+    if (wpinv_get_cart_discounts($items)) {
870 870
         $ret = true;
871 871
     }
872 872
 
@@ -877,49 +877,49 @@  discard block
 block discarded – undo
877 877
     }
878 878
     */
879 879
 
880
-    return apply_filters( 'wpinv_cart_has_discounts', $ret );
880
+    return apply_filters('wpinv_cart_has_discounts', $ret);
881 881
 }
882 882
 
883
-function wpinv_get_cart_discounted_amount( $items = array(), $discounts = false ) {
883
+function wpinv_get_cart_discounted_amount($items = array(), $discounts = false) {
884 884
     $amount = 0.00;
885
-    $items  = !empty( $items ) ? $items : wpinv_get_cart_content_details();
885
+    $items  = !empty($items) ? $items : wpinv_get_cart_content_details();
886 886
 
887
-    if ( $items ) {
888
-        $discounts = wp_list_pluck( $items, 'discount' );
887
+    if ($items) {
888
+        $discounts = wp_list_pluck($items, 'discount');
889 889
 
890
-        if ( is_array( $discounts ) ) {
891
-            $discounts = array_map( 'floatval', $discounts );
892
-            $amount    = array_sum( $discounts );
890
+        if (is_array($discounts)) {
891
+            $discounts = array_map('floatval', $discounts);
892
+            $amount    = array_sum($discounts);
893 893
         }
894 894
     }
895 895
 
896
-    return apply_filters( 'wpinv_get_cart_discounted_amount', $amount );
896
+    return apply_filters('wpinv_get_cart_discounted_amount', $amount);
897 897
 }
898 898
 
899
-function wpinv_get_discount_label( $code, $echo = true ) {
900
-    $label = wp_sprintf( __( 'Discount%1$s', 'invoicing' ), ( $code != '' && $code != 'none' ? ' (<code>' . $code . '</code>)': '' ) );
901
-    $label = apply_filters( 'wpinv_get_discount_label', $label, $code );
899
+function wpinv_get_discount_label($code, $echo = true) {
900
+    $label = wp_sprintf(__('Discount%1$s', 'invoicing'), ($code != '' && $code != 'none' ? ' (<code>' . $code . '</code>)' : ''));
901
+    $label = apply_filters('wpinv_get_discount_label', $label, $code);
902 902
 
903
-    if ( $echo ) {
903
+    if ($echo) {
904 904
         echo $label;
905 905
     } else {
906 906
         return $label;
907 907
     }
908 908
 }
909 909
 
910
-function wpinv_cart_discount_label( $code, $rate, $echo = true ) {
911
-    $label = wp_sprintf( __( 'Discount: %s', 'invoicing' ), $code );
912
-    $label = apply_filters( 'wpinv_cart_discount_label', $label, $code, $rate );
910
+function wpinv_cart_discount_label($code, $rate, $echo = true) {
911
+    $label = wp_sprintf(__('Discount: %s', 'invoicing'), $code);
912
+    $label = apply_filters('wpinv_cart_discount_label', $label, $code, $rate);
913 913
 
914
-    if ( $echo ) {
914
+    if ($echo) {
915 915
         echo $label;
916 916
     } else {
917 917
         return $label;
918 918
     }
919 919
 }
920 920
 
921
-function wpinv_check_delete_discount( $check, $post ) {
922
-    if ( $post->post_type == 'wpi_discount' && wpinv_get_discount_uses( $post->ID ) > 0 ) {
921
+function wpinv_check_delete_discount($check, $post) {
922
+    if ($post->post_type == 'wpi_discount' && wpinv_get_discount_uses($post->ID) > 0) {
923 923
         return true;
924 924
     }
925 925
 
@@ -929,5 +929,5 @@  discard block
 block discarded – undo
929 929
 function wpinv_discount_amount() {
930 930
     $output = 0.00;
931 931
 
932
-    return apply_filters( 'wpinv_discount_amount', $output );
932
+    return apply_filters('wpinv_discount_amount', $output);
933 933
 }
Please login to merge, or discard this patch.
includes/libraries/GeoIp2/Model/City.php 1 patch
Spacing   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -130,7 +130,6 @@
 block discarded – undo
130 130
     private function mostSpecificSubdivision()
131 131
     {
132 132
         return empty($this->subdivisions) ?
133
-            new \GeoIp2\Record\Subdivision(array(), $this->locales) :
134
-            end($this->subdivisions);
133
+            new \GeoIp2\Record\Subdivision(array(), $this->locales) : end($this->subdivisions);
135 134
     }
136 135
 }
Please login to merge, or discard this patch.
includes/libraries/GeoIp2/WebService/Client.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -76,7 +76,7 @@
 block discarded – undo
76 76
         // This is for backwards compatibility. Do not remove except for a
77 77
         // major version bump.
78 78
         if (is_string($options)) {
79
-            $options = array( 'host' => $options );
79
+            $options = array('host' => $options);
80 80
         }
81 81
 
82 82
         if (!isset($options['host'])) {
Please login to merge, or discard this patch.
includes/libraries/GeoIp2/Compat/JsonSerializable.php 1 patch
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -5,12 +5,12 @@
 block discarded – undo
5 5
 // @codingStandardsIgnoreFile
6 6
 
7 7
 /**
8
-  * This interface exists to provide backwards compatibility with PHP 5.3
9
-  *
10
-  * This should _not_ be used by any third-party code.
11
-  *
12
-  * @ignore
13
-  */
8
+ * This interface exists to provide backwards compatibility with PHP 5.3
9
+ *
10
+ * This should _not_ be used by any third-party code.
11
+ *
12
+ * @ignore
13
+ */
14 14
 if (interface_exists('JsonSerializable')) {
15 15
     interface JsonSerializable extends \JsonSerializable
16 16
     {
Please login to merge, or discard this patch.
includes/libraries/class-emogrifier.php 2 patches
Indentation   +776 added lines, -776 removed lines patch added patch discarded remove patch
@@ -9,780 +9,780 @@
 block discarded – undo
9 9
  * @author Roman Ožana <[email protected]>
10 10
  */
11 11
 class Emogrifier {
12
-	/**
13
-	 * @var string
14
-	 */
15
-	const ENCODING = 'UTF-8';
16
-
17
-	/**
18
-	 * @var integer
19
-	 */
20
-	const CACHE_KEY_CSS = 0;
21
-
22
-	/**
23
-	 * @var integer
24
-	 */
25
-	const CACHE_KEY_SELECTOR = 1;
26
-
27
-	/**
28
-	 * @var integer
29
-	 */
30
-	const CACHE_KEY_XPATH = 2;
31
-
32
-	/**
33
-	 * @var integer
34
-	 */
35
-	const CACHE_KEY_CSS_DECLARATION_BLOCK = 3;
36
-
37
-	/**
38
-	 * for calculating nth-of-type and nth-child selectors.
39
-	 *
40
-	 * @var integer
41
-	 */
42
-	const INDEX = 0;
43
-
44
-	/**
45
-	 * for calculating nth-of-type and nth-child selectors.
46
-	 *
47
-	 * @var integer
48
-	 */
49
-	const MULTIPLIER = 1;
50
-
51
-	/**
52
-	 * @var string
53
-	 */
54
-	const ID_ATTRIBUTE_MATCHER = '/(\\w+)?\\#([\\w\\-]+)/';
55
-
56
-	/**
57
-	 * @var string
58
-	 */
59
-	const CLASS_ATTRIBUTE_MATCHER = '/(\\w+|[\\*\\]])?((\\.[\\w\\-]+)+)/';
60
-
61
-	/**
62
-	 * @var string
63
-	 */
64
-	private $html = '';
65
-
66
-	/**
67
-	 * @var string
68
-	 */
69
-	private $css = '';
70
-
71
-	/**
72
-	 * @var array<string>
73
-	 */
74
-	private $unprocessableHtmlTags = array('wbr');
75
-
76
-	/**
77
-	 * @var array<array>
78
-	 */
79
-	private $caches = array(
80
-		self::CACHE_KEY_CSS => array(),
81
-		self::CACHE_KEY_SELECTOR => array(),
82
-		self::CACHE_KEY_XPATH => array(),
83
-		self::CACHE_KEY_CSS_DECLARATION_BLOCK => array(),
84
-	);
85
-
86
-	/**
87
-	 * the visited nodes with the XPath paths as array keys.
88
-	 *
89
-	 * @var array<\DOMNode>
90
-	 */
91
-	private $visitedNodes = array();
92
-
93
-	/**
94
-	 * the styles to apply to the nodes with the XPath paths as array keys for the outer array and the attribute names/values.
95
-	 * as key/value pairs for the inner array.
96
-	 *
97
-	 * @var array<array><string>
98
-	 */
99
-	private $styleAttributesForNodes = array();
100
-
101
-	/**
102
-	 * This attribute applies to the case where you want to preserve your original text encoding.
103
-	 *
104
-	 * By default, emogrifier translates your text into HTML entities for two reasons:
105
-	 *
106
-	 * 1. Because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email.
107
-	 *
108
-	 * 2. It translates any illegal XML characters that DOMDocument cannot work with.
109
-	 *
110
-	 * If you would like to preserve your original encoding, set this attribute to TRUE.
111
-	 *
112
-	 * @var boolean
113
-	 */
114
-	public $preserveEncoding = false;
115
-
116
-	public static $_media = '';
117
-
118
-	/**
119
-	 * The constructor.
120
-	 *
121
-	 * @param string $html the HTML to emogrify, must be UTF-8-encoded
122
-	 * @param string $css the CSS to merge, must be UTF-8-encoded
123
-	 */
124
-	public function __construct($html = '', $css = '') {
125
-		$this->setHtml($html);
126
-		$this->setCss($css);
127
-	}
128
-
129
-	/**
130
-	 * The destructor.
131
-	 */
132
-	public function __destruct() {
133
-		$this->purgeVisitedNodes();
134
-	}
135
-
136
-	/**
137
-	 * Sets the HTML to emogrify.
138
-	 *
139
-	 * @param string $html the HTML to emogrify, must be UTF-8-encoded
140
-	 */
141
-	public function setHtml($html = '') {
142
-		$this->html = $html;
143
-	}
144
-
145
-	/**
146
-	 * Sets the CSS to merge with the HTML.
147
-	 *
148
-	 * @param string $css the CSS to merge, must be UTF-8-encoded
149
-	 */
150
-	public function setCss($css = '') {
151
-		$this->css = $css;
152
-	}
153
-
154
-	/**
155
-	 * Clears all caches.
156
-	 */
157
-	private function clearAllCaches() {
158
-		$this->clearCache(self::CACHE_KEY_CSS);
159
-		$this->clearCache(self::CACHE_KEY_SELECTOR);
160
-		$this->clearCache(self::CACHE_KEY_XPATH);
161
-		$this->clearCache(self::CACHE_KEY_CSS_DECLARATION_BLOCK);
162
-	}
163
-
164
-	/**
165
-	 * Clears a single cache by key.
166
-	 *
167
-	 * @param integer $key the cache key, must be CACHE_KEY_CSS, CACHE_KEY_SELECTOR, CACHE_KEY_XPATH or CACHE_KEY_CSS_DECLARATION_BLOCK
168
-	 *
169
-	 * @throws InvalidArgumentException
170
-	 */
171
-	private function clearCache($key) {
172
-		$allowedCacheKeys = array(self::CACHE_KEY_CSS, self::CACHE_KEY_SELECTOR, self::CACHE_KEY_XPATH, self::CACHE_KEY_CSS_DECLARATION_BLOCK);
173
-		if (!in_array($key, $allowedCacheKeys, true)) {
174
-			throw new InvalidArgumentException('Invalid cache key: ' . $key, 1391822035);
175
-		}
176
-
177
-		$this->caches[$key] = array();
178
-	}
179
-
180
-	/**
181
-	 * Purges the visited nodes.
182
-	 */
183
-	private function purgeVisitedNodes() {
184
-		$this->visitedNodes = array();
185
-		$this->styleAttributesForNodes = array();
186
-	}
187
-
188
-	/**
189
-	 * Marks a tag for removal.
190
-	 *
191
-	 * There are some HTML tags that DOMDocument cannot process, and it will throw an error if it encounters them.
192
-	 * In particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
193
-	 *
194
-	 * Note: The tags will not be removed if they have any content.
195
-	 *
196
-	 * @param string $tagName the tag name, e.g., "p"
197
-	 */
198
-	public function addUnprocessableHtmlTag($tagName) {
199
-		$this->unprocessableHtmlTags[] = $tagName;
200
-	}
201
-
202
-	/**
203
-	 * Drops a tag from the removal list.
204
-	 *
205
-	 * @param string $tagName the tag name, e.g., "p"
206
-	 */
207
-	public function removeUnprocessableHtmlTag($tagName) {
208
-		$key = array_search($tagName, $this->unprocessableHtmlTags, true);
209
-		if ($key !== false) {
210
-			unset($this->unprocessableHtmlTags[$key]);
211
-		}
212
-	}
213
-
214
-	/**
215
-	 * Applies the CSS you submit to the HTML you submit.
216
-	 *
217
-	 * This method places the CSS inline.
218
-	 *
219
-	 * @return string
220
-	 *
221
-	 * @throws BadMethodCallException
222
-	 */
223
-	public function emogrify() {
224
-		if ($this->html === '') {
225
-			throw new BadMethodCallException('Please set some HTML first before calling emogrify.', 1390393096);
226
-		}
227
-
228
-		$xmlDocument = $this->createXmlDocument();
229
-		$xpath = new DOMXPath($xmlDocument);
230
-		$this->clearAllCaches();
231
-
232
-		// before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
233
-		// we wouldn't have to do this if DOMXPath supported XPath 2.0.
234
-		// also store a reference of nodes with existing inline styles so we don't overwrite them
235
-		$this->purgeVisitedNodes();
236
-
237
-		$nodesWithStyleAttributes = $xpath->query('//*[@style]');
238
-		if ($nodesWithStyleAttributes !== false) {
239
-			/** @var $nodeWithStyleAttribute DOMNode */
240
-			foreach ($nodesWithStyleAttributes as $node) {
241
-				$normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
242
-
243
-				// in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244
-				$nodePath = $node->getNodePath();
245
-				if (!isset($this->styleAttributesForNodes[$nodePath])) {
246
-					$this->styleAttributesForNodes[$nodePath] = $this->parseCssDeclarationBlock($normalizedOriginalStyle);
247
-					$this->visitedNodes[$nodePath] = $node;
248
-				}
249
-
250
-				$node->setAttribute('style', $normalizedOriginalStyle);
251
-			}
252
-		}
253
-
254
-		// grab any existing style blocks from the html and append them to the existing CSS
255
-		// (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
256
-		$allCss = $this->css;
257
-
258
-		$allCss .= $this->getCssFromAllStyleNodes($xpath);
259
-
260
-		$cssParts = $this->splitCssAndMediaQuery($allCss);
261
-		self::$_media = ''; // reset
262
-
263
-		$cssKey = md5($cssParts['css']);
264
-		if (!isset($this->caches[self::CACHE_KEY_CSS][$cssKey])) {
265
-			// process the CSS file for selectors and definitions
266
-			preg_match_all('/(?:^|[\\s^{}]*)([^{]+){([^}]*)}/mis', $cssParts['css'], $matches, PREG_SET_ORDER);
267
-
268
-			$allSelectors = array();
269
-			foreach ($matches as $key => $selectorString) {
270
-				// if there is a blank definition, skip
271
-				if (!strlen(trim($selectorString[2]))) {
272
-					continue;
273
-				}
274
-
275
-				// else split by commas and duplicate attributes so we can sort by selector precedence
276
-				$selectors = explode(',', $selectorString[1]);
277
-				foreach ($selectors as $selector) {
278
-					// don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
279
-					if (strpos($selector, ':') !== false && !preg_match('/:\\S+\\-(child|type)\\(/i', $selector)) {
280
-						continue;
281
-					}
282
-
283
-					$allSelectors[] = array('selector' => trim($selector),
284
-											 'attributes' => trim($selectorString[2]),
285
-											 // keep track of where it appears in the file, since order is important
286
-											 'line' => $key,
287
-					);
288
-				}
289
-			}
290
-
291
-			// now sort the selectors by precedence
292
-			usort($allSelectors, array($this,'sortBySelectorPrecedence'));
293
-
294
-			$this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295
-		}
296
-
297
-		foreach ($this->caches[self::CACHE_KEY_CSS][$cssKey] as $value) {
298
-			// query the body for the xpath selector
299
-			$nodesMatchingCssSelectors = $xpath->query($this->translateCssToXpath($value['selector']));
300
-
301
-			/** @var $node \DOMNode */
302
-			foreach ($nodesMatchingCssSelectors as $node) {
303
-				// if it has a style attribute, get it, process it, and append (overwrite) new stuff
304
-				if ($node->hasAttribute('style')) {
305
-					// break it up into an associative array
306
-					$oldStyleDeclarations = $this->parseCssDeclarationBlock($node->getAttribute('style'));
307
-				} else {
308
-					$oldStyleDeclarations = array();
309
-				}
310
-				$newStyleDeclarations = $this->parseCssDeclarationBlock($value['attributes']);
311
-				$node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($oldStyleDeclarations, $newStyleDeclarations));
312
-			}
313
-		}
314
-
315
-		// now iterate through the nodes that contained inline styles in the original HTML
316
-		foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
317
-			$node = $this->visitedNodes[$nodePath];
318
-			$currentStyleAttributes = $this->parseCssDeclarationBlock($node->getAttribute('style'));
319
-			$node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($currentStyleAttributes, $styleAttributesForNode));
320
-		}
321
-
322
-		// This removes styles from your email that contain display:none.
323
-		// We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
324
-		// lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
325
-		// to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
326
-		$nodesWithStyleDisplayNone = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
327
-		// The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
328
-		// we don't try to call removeChild on a nonexistent child node
329
-		if ($nodesWithStyleDisplayNone->length > 0) {
330
-			/** @var $node \DOMNode */
331
-			foreach ($nodesWithStyleDisplayNone as $node) {
332
-				if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
333
-					$node->parentNode->removeChild($node);
334
-				}
335
-			}
336
-		}
337
-
338
-		$this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339
-
340
-		if ($this->preserveEncoding) {
341
-			if ( function_exists( 'mb_convert_encoding' ) ) {
342
-				return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
343
-			} else {
344
-				return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
345
-			}
346
-		} else {
347
-			return $xmlDocument->saveHTML();
348
-		}
349
-	}
350
-
351
-	public function strtolower(array $m) {
352
-		return strtolower($m[0]);
353
-	}
354
-
355
-
356
-	/**
357
-	 * This method merges old or existing name/value array with new name/value array.
358
-	 * and then generates a string of the combined style suitable for placing inline.
359
-	 * This becomes the single point for CSS string generation allowing for consistent.
360
-	 * CSS output no matter where the CSS originally came from.
361
-	 * @param array $oldStyles
362
-	 * @param array $newStyles
363
-	 * @return string
364
-	 */
365
-	private function generateStyleStringFromDeclarationsArrays(array $oldStyles, array $newStyles) {
366
-		$combinedStyles = array_merge($oldStyles, $newStyles);
367
-		$style = '';
368
-		foreach ($combinedStyles as $attributeName => $attributeValue) {
369
-			$style .= (strtolower(trim($attributeName)) . ': ' . trim($attributeValue) . '; ');
370
-		}
371
-		return trim($style);
372
-	}
373
-
374
-
375
-	/**
376
-	 * Copies the media part from CSS array parts to $xmlDocument.
377
-	 *
378
-	 * @param array $cssParts
379
-	 * @param DOMDocument $xmlDocument
380
-	 */
381
-	public function copyCssWithMediaToStyleNode(array $cssParts, DOMDocument $xmlDocument) {
382
-		if (isset($cssParts['media']) && $cssParts['media'] !== '') {
383
-			$this->addStyleElementToDocument($xmlDocument, $cssParts['media']);
384
-		}
385
-	}
386
-
387
-	/**
388
-	 * Returns CSS content.
389
-	 *
390
-	 * @param DOMXPath $xpath
391
-	 * @return string
392
-	 */
393
-	private function getCssFromAllStyleNodes(DOMXPath $xpath) {
394
-		$styleNodes = $xpath->query('//style');
395
-
396
-		if ($styleNodes === false) {
397
-			return '';
398
-		}
399
-
400
-		$css = '';
401
-		/** @var $styleNode DOMNode */
402
-		foreach ($styleNodes as $styleNode) {
403
-			$css .= "\n\n" . $styleNode->nodeValue;
404
-			$styleNode->parentNode->removeChild($styleNode);
405
-		}
406
-
407
-		return $css;
408
-	}
409
-
410
-	/**
411
-	 * Adds a style element with $css to $document.
412
-	 *
413
-	 * @param DOMDocument $document
414
-	 * @param string $css
415
-	 */
416
-	private function addStyleElementToDocument(DOMDocument $document, $css) {
417
-		$styleElement = $document->createElement('style', $css);
418
-		$styleAttribute = $document->createAttribute('type');
419
-		$styleAttribute->value = 'text/css';
420
-		$styleElement->appendChild($styleAttribute);
421
-
422
-		$head = $this->getOrCreateHeadElement($document);
423
-		$head->appendChild($styleElement);
424
-	}
425
-
426
-	/**
427
-	 * Returns the existing or creates a new head element in $document.
428
-	 *
429
-	 * @param DOMDocument $document
430
-	 * @return DOMNode the head element
431
-	 */
432
-	private function getOrCreateHeadElement(DOMDocument $document) {
433
-		$head = $document->getElementsByTagName('head')->item(0);
434
-
435
-		if ($head === null) {
436
-			$head = $document->createElement('head');
437
-			$html = $document->getElementsByTagName('html')->item(0);
438
-			$html->insertBefore($head, $document->getElementsByTagName('body')->item(0));
439
-		}
440
-
441
-		return $head;
442
-	}
443
-
444
-	/**
445
-	 * Splits input CSS code to an array where:
446
-	 *
447
-	 * - key "css" will be contains clean CSS code.
448
-	 * - key "media" will be contains all valuable media queries.
449
-	 *
450
-	 * Example:
451
-	 *
452
-	 * The CSS code.
453
-	 *
454
-	 *   "@import "file.css"; h1 { color:red; } @media { h1 {}} @media tv { h1 {}}"
455
-	 *
456
-	 * will be parsed into the following array:
457
-	 *
458
-	 *   "css" => "h1 { color:red; }"
459
-	 *   "media" => "@media { h1 {}}"
460
-	 *
461
-	 * @param string $css
462
-	 * @return array
463
-	 */
464
-	private function splitCssAndMediaQuery($css) {
465
-		$css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
466
-
467
-		// filter the CSS
468
-		$search = array(
469
-			// get rid of css comment code
470
-			'/\\/\\*.*\\*\\//sU',
471
-			// strip out any import directives
472
-			'/^\\s*@import\\s[^;]+;/misU',
473
-			// strip remains media enclosures
474
-			'/^\\s*@media\\s[^{]+{(.*)}\\s*}\\s/misU',
475
-		);
476
-
477
-		$replace = array(
478
-			'',
479
-			'',
480
-			'',
481
-		);
482
-
483
-		// clean CSS before output
484
-		$css = preg_replace($search, $replace, $css);
485
-
486
-		return array('css' => $css, 'media' => self::$_media);
487
-	}
488
-
489
-	private function _media_concat( $matches ) {
490
-		self::$_media .= $matches[0];
491
-	}
492
-
493
-	/**
494
-	 * Creates a DOMDocument instance with the current HTML.
495
-	 *
496
-	 * @return DOMDocument
497
-	 */
498
-	private function createXmlDocument() {
499
-		$xmlDocument = new DOMDocument;
500
-		$xmlDocument->encoding = self::ENCODING;
501
-		$xmlDocument->strictErrorChecking = false;
502
-		$xmlDocument->formatOutput = true;
503
-		$libXmlState = libxml_use_internal_errors(true);
504
-		$xmlDocument->loadHTML($this->getUnifiedHtml());
505
-		libxml_clear_errors();
506
-		libxml_use_internal_errors($libXmlState);
507
-		$xmlDocument->normalizeDocument();
508
-
509
-		return $xmlDocument;
510
-	}
511
-
512
-	/**
513
-	 * Returns the HTML with the non-ASCII characters converts into HTML entities and the unprocessable HTML tags removed.
514
-	 *
515
-	 * @return string the unified HTML
516
-	 *
517
-	 * @throws BadMethodCallException
518
-	 */
519
-	private function getUnifiedHtml() {
520
-		if (!empty($this->unprocessableHtmlTags)) {
521
-			$unprocessableHtmlTags = implode('|', $this->unprocessableHtmlTags);
522
-			$bodyWithoutUnprocessableTags = preg_replace('/<\\/?(' . $unprocessableHtmlTags . ')[^>]*>/i', '', $this->html);
523
-		} else {
524
-			$bodyWithoutUnprocessableTags = $this->html;
525
-		}
526
-
527
-		if ( function_exists( 'mb_convert_encoding' ) ) {
528
-			return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
529
-		} else {
530
-			return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
531
-		}
532
-	}
533
-
534
-	/**
535
-	 * @param array $a
536
-	 * @param array $b
537
-	 *
538
-	 * @return integer
539
-	 */
540
-	private function sortBySelectorPrecedence(array $a, array $b) {
541
-		$precedenceA = $this->getCssSelectorPrecedence($a['selector']);
542
-		$precedenceB = $this->getCssSelectorPrecedence($b['selector']);
543
-
544
-		// We want these sorted in ascending order so selectors with lesser precedence get processed first and
545
-		// selectors with greater precedence get sorted last.
546
-		// The parenthesis around the -1 are necessary to avoid a PHP_CodeSniffer warning about missing spaces around
547
-		// arithmetic operators.
548
-		// @see http://forge.typo3.org/issues/55605
549
-		$precedenceForEquals = ($a['line'] < $b['line'] ? (-1) : 1);
550
-		$precedenceForNotEquals = ($precedenceA < $precedenceB ? (-1) : 1);
551
-		return ($precedenceA === $precedenceB) ? $precedenceForEquals : $precedenceForNotEquals;
552
-	}
553
-
554
-	/**
555
-	 * @param string $selector
556
-	 *
557
-	 * @return integer
558
-	 */
559
-	private function getCssSelectorPrecedence($selector) {
560
-		$selectorKey = md5($selector);
561
-		if (!isset($this->caches[self::CACHE_KEY_SELECTOR][$selectorKey])) {
562
-			$precedence = 0;
563
-			$value = 100;
564
-			// ids: worth 100, classes: worth 10, elements: worth 1
565
-			$search = array('\\#','\\.','');
566
-
567
-			foreach ($search as $s) {
568
-				if (trim($selector == '')) {
569
-					break;
570
-				}
571
-				$number = 0;
572
-				$selector = preg_replace('/' . $s . '\\w+/', '', $selector, -1, $number);
573
-				$precedence += ($value * $number);
574
-				$value /= 10;
575
-			}
576
-			$this->caches[self::CACHE_KEY_SELECTOR][$selectorKey] = $precedence;
577
-		}
578
-
579
-		return $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey];
580
-	}
581
-
582
-	/**
583
-	 * Right now, we support all CSS 1 selectors and most CSS2/3 selectors.
584
-	 *
585
-	 * @see http://plasmasturm.org/log/444/
586
-	 *
587
-	 * @param string $paramCssSelector
588
-	 *
589
-	 * @return string
590
-	 */
591
-	private function translateCssToXpath($paramCssSelector) {
592
-		$cssSelector = ' ' . $paramCssSelector . ' ';
593
-		$cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
594
-		$cssSelector = trim($cssSelector);
595
-		$xpathKey = md5($cssSelector);
596
-		if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
597
-			// returns an Xpath selector
598
-			$search = array(
599
-				// Matches any element that is a child of parent.
600
-				'/\\s+>\\s+/',
601
-				// Matches any element that is an adjacent sibling.
602
-				'/\\s+\\+\\s+/',
603
-				// Matches any element that is a descendant of an parent element element.
604
-				'/\\s+/',
605
-				// first-child pseudo-selector
606
-				'/([^\\/]+):first-child/i',
607
-				// last-child pseudo-selector
608
-				'/([^\\/]+):last-child/i',
609
-				// Matches attribute only selector
610
-				'/^\\[(\\w+)\\]/',
611
-				// Matches element with attribute
612
-				'/(\\w)\\[(\\w+)\\]/',
613
-				// Matches element with EXACT attribute
614
-				'/(\\w)\\[(\\w+)\\=[\'"]?(\\w+)[\'"]?\\]/',
615
-			);
616
-			$replace = array(
617
-				'/',
618
-				'/following-sibling::*[1]/self::',
619
-				'//',
620
-				'*[1]/self::\\1',
621
-				'*[last()]/self::\\1',
622
-				'*[@\\1]',
623
-				'\\1[@\\2]',
624
-				'\\1[@\\2="\\3"]',
625
-			);
626
-
627
-			$cssSelector = '//' . preg_replace($search, $replace, $cssSelector);
628
-
629
-			$cssSelector = preg_replace_callback(self::ID_ATTRIBUTE_MATCHER, array($this, 'matchIdAttributes'), $cssSelector);
630
-			$cssSelector = preg_replace_callback(self::CLASS_ATTRIBUTE_MATCHER, array($this, 'matchClassAttributes'), $cssSelector);
631
-
632
-			// Advanced selectors are going to require a bit more advanced emogrification.
633
-			// When we required PHP 5.3, we could do this with closures.
634
-			$cssSelector = preg_replace_callback(
635
-				'/([^\\/]+):nth-child\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
636
-				array($this, 'translateNthChild'), $cssSelector
637
-			);
638
-			$cssSelector = preg_replace_callback(
639
-				'/([^\\/]+):nth-of-type\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
640
-				array($this, 'translateNthOfType'), $cssSelector
641
-			);
642
-
643
-			$this->caches[self::CACHE_KEY_SELECTOR][$xpathKey] = $cssSelector;
644
-		}
645
-		return $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey];
646
-	}
647
-
648
-	/**
649
-	 * @param array $match
650
-	 *
651
-	 * @return string
652
-	 */
653
-	private function matchIdAttributes(array $match) {
654
-		return (strlen($match[1]) ? $match[1] : '*') . '[@id="' . $match[2] . '"]';
655
-	}
656
-
657
-	/**
658
-	 * @param array $match
659
-	 *
660
-	 * @return string
661
-	 */
662
-	private function matchClassAttributes(array $match) {
663
-		return (strlen($match[1]) ? $match[1] : '*') . '[contains(concat(" ",@class," "),concat(" ","' .
664
-			implode(
665
-				'"," "))][contains(concat(" ",@class," "),concat(" ","',
666
-				explode('.', substr($match[2], 1))
667
-			) . '"," "))]';
668
-	}
669
-
670
-	/**
671
-	 * @param array $match
672
-	 *
673
-	 * @return string
674
-	 */
675
-	private function translateNthChild(array $match) {
676
-		$result = $this->parseNth($match);
677
-
678
-		if (isset($result[self::MULTIPLIER])) {
679
-			if ($result[self::MULTIPLIER] < 0) {
680
-				$result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
681
-				return sprintf('*[(last() - position()) mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
682
-			} else {
683
-				return sprintf('*[position() mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
684
-			}
685
-		} else {
686
-			return sprintf('*[%u]/self::%s', $result[self::INDEX], $match[1]);
687
-		}
688
-	}
689
-
690
-	/**
691
-	 * @param array $match
692
-	 *
693
-	 * @return string
694
-	 */
695
-	private function translateNthOfType(array $match) {
696
-		$result = $this->parseNth($match);
697
-
698
-		if (isset($result[self::MULTIPLIER])) {
699
-			if ($result[self::MULTIPLIER] < 0) {
700
-				$result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
701
-				return sprintf('%s[(last() - position()) mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
702
-			} else {
703
-				return sprintf('%s[position() mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
704
-			}
705
-		} else {
706
-			return sprintf('%s[%u]', $match[1], $result[self::INDEX]);
707
-		}
708
-	}
709
-
710
-	/**
711
-	 * @param array $match
712
-	 *
713
-	 * @return array
714
-	 */
715
-	private function parseNth(array $match) {
716
-		if (in_array(strtolower($match[2]), array('even','odd'))) {
717
-			$index = strtolower($match[2]) == 'even' ? 0 : 1;
718
-			return array(self::MULTIPLIER => 2, self::INDEX => $index);
719
-		} elseif (stripos($match[2], 'n') === false) {
720
-			// if there is a multiplier
721
-			$index = intval(str_replace(' ', '', $match[2]));
722
-			return array(self::INDEX => $index);
723
-		} else {
724
-			if (isset($match[3])) {
725
-				$multipleTerm = str_replace($match[3], '', $match[2]);
726
-				$index = intval(str_replace(' ', '', $match[3]));
727
-			} else {
728
-				$multipleTerm = $match[2];
729
-				$index = 0;
730
-			}
731
-
732
-			$multiplier = str_ireplace('n', '', $multipleTerm);
733
-
734
-			if (!strlen($multiplier)) {
735
-				$multiplier = 1;
736
-			} elseif ($multiplier == 0) {
737
-				return array(self::INDEX => $index);
738
-			} else {
739
-				$multiplier = intval($multiplier);
740
-			}
741
-
742
-			while ($index < 0) {
743
-				$index += abs($multiplier);
744
-			}
745
-
746
-			return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
747
-		}
748
-	}
749
-
750
-	/**
751
-	 * Parses a CSS declaration block into property name/value pairs.
752
-	 *
753
-	 * Example:
754
-	 *
755
-	 * The declaration block.
756
-	 *
757
-	 *   "color: #000; font-weight: bold;".
758
-	 *
759
-	 * will be parsed into the following array:
760
-	 *
761
-	 *   "color" => "#000"
762
-	 *   "font-weight" => "bold"
763
-	 *
764
-	 * @param string $cssDeclarationBlock the CSS declaration block without the curly braces, may be empty
765
-	 *
766
-	 * @return array the CSS declarations with the property names as array keys and the property values as array values
767
-	 */
768
-	private function parseCssDeclarationBlock($cssDeclarationBlock) {
769
-		if (isset($this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock])) {
770
-			return $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock];
771
-		}
772
-
773
-		$properties = array();
774
-		$declarations = explode(';', $cssDeclarationBlock);
775
-		foreach ($declarations as $declaration) {
776
-			$matches = array();
777
-			if (!preg_match('/ *([A-Za-z\\-]+) *: *([^;]+) */', $declaration, $matches)) {
778
-				continue;
779
-			}
780
-			$propertyName = strtolower($matches[1]);
781
-			$propertyValue = $matches[2];
782
-			$properties[$propertyName] = $propertyValue;
783
-		}
784
-		$this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock] = $properties;
785
-
786
-		return $properties;
787
-	}
12
+    /**
13
+     * @var string
14
+     */
15
+    const ENCODING = 'UTF-8';
16
+
17
+    /**
18
+     * @var integer
19
+     */
20
+    const CACHE_KEY_CSS = 0;
21
+
22
+    /**
23
+     * @var integer
24
+     */
25
+    const CACHE_KEY_SELECTOR = 1;
26
+
27
+    /**
28
+     * @var integer
29
+     */
30
+    const CACHE_KEY_XPATH = 2;
31
+
32
+    /**
33
+     * @var integer
34
+     */
35
+    const CACHE_KEY_CSS_DECLARATION_BLOCK = 3;
36
+
37
+    /**
38
+     * for calculating nth-of-type and nth-child selectors.
39
+     *
40
+     * @var integer
41
+     */
42
+    const INDEX = 0;
43
+
44
+    /**
45
+     * for calculating nth-of-type and nth-child selectors.
46
+     *
47
+     * @var integer
48
+     */
49
+    const MULTIPLIER = 1;
50
+
51
+    /**
52
+     * @var string
53
+     */
54
+    const ID_ATTRIBUTE_MATCHER = '/(\\w+)?\\#([\\w\\-]+)/';
55
+
56
+    /**
57
+     * @var string
58
+     */
59
+    const CLASS_ATTRIBUTE_MATCHER = '/(\\w+|[\\*\\]])?((\\.[\\w\\-]+)+)/';
60
+
61
+    /**
62
+     * @var string
63
+     */
64
+    private $html = '';
65
+
66
+    /**
67
+     * @var string
68
+     */
69
+    private $css = '';
70
+
71
+    /**
72
+     * @var array<string>
73
+     */
74
+    private $unprocessableHtmlTags = array('wbr');
75
+
76
+    /**
77
+     * @var array<array>
78
+     */
79
+    private $caches = array(
80
+        self::CACHE_KEY_CSS => array(),
81
+        self::CACHE_KEY_SELECTOR => array(),
82
+        self::CACHE_KEY_XPATH => array(),
83
+        self::CACHE_KEY_CSS_DECLARATION_BLOCK => array(),
84
+    );
85
+
86
+    /**
87
+     * the visited nodes with the XPath paths as array keys.
88
+     *
89
+     * @var array<\DOMNode>
90
+     */
91
+    private $visitedNodes = array();
92
+
93
+    /**
94
+     * the styles to apply to the nodes with the XPath paths as array keys for the outer array and the attribute names/values.
95
+     * as key/value pairs for the inner array.
96
+     *
97
+     * @var array<array><string>
98
+     */
99
+    private $styleAttributesForNodes = array();
100
+
101
+    /**
102
+     * This attribute applies to the case where you want to preserve your original text encoding.
103
+     *
104
+     * By default, emogrifier translates your text into HTML entities for two reasons:
105
+     *
106
+     * 1. Because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email.
107
+     *
108
+     * 2. It translates any illegal XML characters that DOMDocument cannot work with.
109
+     *
110
+     * If you would like to preserve your original encoding, set this attribute to TRUE.
111
+     *
112
+     * @var boolean
113
+     */
114
+    public $preserveEncoding = false;
115
+
116
+    public static $_media = '';
117
+
118
+    /**
119
+     * The constructor.
120
+     *
121
+     * @param string $html the HTML to emogrify, must be UTF-8-encoded
122
+     * @param string $css the CSS to merge, must be UTF-8-encoded
123
+     */
124
+    public function __construct($html = '', $css = '') {
125
+        $this->setHtml($html);
126
+        $this->setCss($css);
127
+    }
128
+
129
+    /**
130
+     * The destructor.
131
+     */
132
+    public function __destruct() {
133
+        $this->purgeVisitedNodes();
134
+    }
135
+
136
+    /**
137
+     * Sets the HTML to emogrify.
138
+     *
139
+     * @param string $html the HTML to emogrify, must be UTF-8-encoded
140
+     */
141
+    public function setHtml($html = '') {
142
+        $this->html = $html;
143
+    }
144
+
145
+    /**
146
+     * Sets the CSS to merge with the HTML.
147
+     *
148
+     * @param string $css the CSS to merge, must be UTF-8-encoded
149
+     */
150
+    public function setCss($css = '') {
151
+        $this->css = $css;
152
+    }
153
+
154
+    /**
155
+     * Clears all caches.
156
+     */
157
+    private function clearAllCaches() {
158
+        $this->clearCache(self::CACHE_KEY_CSS);
159
+        $this->clearCache(self::CACHE_KEY_SELECTOR);
160
+        $this->clearCache(self::CACHE_KEY_XPATH);
161
+        $this->clearCache(self::CACHE_KEY_CSS_DECLARATION_BLOCK);
162
+    }
163
+
164
+    /**
165
+     * Clears a single cache by key.
166
+     *
167
+     * @param integer $key the cache key, must be CACHE_KEY_CSS, CACHE_KEY_SELECTOR, CACHE_KEY_XPATH or CACHE_KEY_CSS_DECLARATION_BLOCK
168
+     *
169
+     * @throws InvalidArgumentException
170
+     */
171
+    private function clearCache($key) {
172
+        $allowedCacheKeys = array(self::CACHE_KEY_CSS, self::CACHE_KEY_SELECTOR, self::CACHE_KEY_XPATH, self::CACHE_KEY_CSS_DECLARATION_BLOCK);
173
+        if (!in_array($key, $allowedCacheKeys, true)) {
174
+            throw new InvalidArgumentException('Invalid cache key: ' . $key, 1391822035);
175
+        }
176
+
177
+        $this->caches[$key] = array();
178
+    }
179
+
180
+    /**
181
+     * Purges the visited nodes.
182
+     */
183
+    private function purgeVisitedNodes() {
184
+        $this->visitedNodes = array();
185
+        $this->styleAttributesForNodes = array();
186
+    }
187
+
188
+    /**
189
+     * Marks a tag for removal.
190
+     *
191
+     * There are some HTML tags that DOMDocument cannot process, and it will throw an error if it encounters them.
192
+     * In particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
193
+     *
194
+     * Note: The tags will not be removed if they have any content.
195
+     *
196
+     * @param string $tagName the tag name, e.g., "p"
197
+     */
198
+    public function addUnprocessableHtmlTag($tagName) {
199
+        $this->unprocessableHtmlTags[] = $tagName;
200
+    }
201
+
202
+    /**
203
+     * Drops a tag from the removal list.
204
+     *
205
+     * @param string $tagName the tag name, e.g., "p"
206
+     */
207
+    public function removeUnprocessableHtmlTag($tagName) {
208
+        $key = array_search($tagName, $this->unprocessableHtmlTags, true);
209
+        if ($key !== false) {
210
+            unset($this->unprocessableHtmlTags[$key]);
211
+        }
212
+    }
213
+
214
+    /**
215
+     * Applies the CSS you submit to the HTML you submit.
216
+     *
217
+     * This method places the CSS inline.
218
+     *
219
+     * @return string
220
+     *
221
+     * @throws BadMethodCallException
222
+     */
223
+    public function emogrify() {
224
+        if ($this->html === '') {
225
+            throw new BadMethodCallException('Please set some HTML first before calling emogrify.', 1390393096);
226
+        }
227
+
228
+        $xmlDocument = $this->createXmlDocument();
229
+        $xpath = new DOMXPath($xmlDocument);
230
+        $this->clearAllCaches();
231
+
232
+        // before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
233
+        // we wouldn't have to do this if DOMXPath supported XPath 2.0.
234
+        // also store a reference of nodes with existing inline styles so we don't overwrite them
235
+        $this->purgeVisitedNodes();
236
+
237
+        $nodesWithStyleAttributes = $xpath->query('//*[@style]');
238
+        if ($nodesWithStyleAttributes !== false) {
239
+            /** @var $nodeWithStyleAttribute DOMNode */
240
+            foreach ($nodesWithStyleAttributes as $node) {
241
+                $normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
242
+
243
+                // in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244
+                $nodePath = $node->getNodePath();
245
+                if (!isset($this->styleAttributesForNodes[$nodePath])) {
246
+                    $this->styleAttributesForNodes[$nodePath] = $this->parseCssDeclarationBlock($normalizedOriginalStyle);
247
+                    $this->visitedNodes[$nodePath] = $node;
248
+                }
249
+
250
+                $node->setAttribute('style', $normalizedOriginalStyle);
251
+            }
252
+        }
253
+
254
+        // grab any existing style blocks from the html and append them to the existing CSS
255
+        // (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
256
+        $allCss = $this->css;
257
+
258
+        $allCss .= $this->getCssFromAllStyleNodes($xpath);
259
+
260
+        $cssParts = $this->splitCssAndMediaQuery($allCss);
261
+        self::$_media = ''; // reset
262
+
263
+        $cssKey = md5($cssParts['css']);
264
+        if (!isset($this->caches[self::CACHE_KEY_CSS][$cssKey])) {
265
+            // process the CSS file for selectors and definitions
266
+            preg_match_all('/(?:^|[\\s^{}]*)([^{]+){([^}]*)}/mis', $cssParts['css'], $matches, PREG_SET_ORDER);
267
+
268
+            $allSelectors = array();
269
+            foreach ($matches as $key => $selectorString) {
270
+                // if there is a blank definition, skip
271
+                if (!strlen(trim($selectorString[2]))) {
272
+                    continue;
273
+                }
274
+
275
+                // else split by commas and duplicate attributes so we can sort by selector precedence
276
+                $selectors = explode(',', $selectorString[1]);
277
+                foreach ($selectors as $selector) {
278
+                    // don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
279
+                    if (strpos($selector, ':') !== false && !preg_match('/:\\S+\\-(child|type)\\(/i', $selector)) {
280
+                        continue;
281
+                    }
282
+
283
+                    $allSelectors[] = array('selector' => trim($selector),
284
+                                                'attributes' => trim($selectorString[2]),
285
+                                                // keep track of where it appears in the file, since order is important
286
+                                                'line' => $key,
287
+                    );
288
+                }
289
+            }
290
+
291
+            // now sort the selectors by precedence
292
+            usort($allSelectors, array($this,'sortBySelectorPrecedence'));
293
+
294
+            $this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295
+        }
296
+
297
+        foreach ($this->caches[self::CACHE_KEY_CSS][$cssKey] as $value) {
298
+            // query the body for the xpath selector
299
+            $nodesMatchingCssSelectors = $xpath->query($this->translateCssToXpath($value['selector']));
300
+
301
+            /** @var $node \DOMNode */
302
+            foreach ($nodesMatchingCssSelectors as $node) {
303
+                // if it has a style attribute, get it, process it, and append (overwrite) new stuff
304
+                if ($node->hasAttribute('style')) {
305
+                    // break it up into an associative array
306
+                    $oldStyleDeclarations = $this->parseCssDeclarationBlock($node->getAttribute('style'));
307
+                } else {
308
+                    $oldStyleDeclarations = array();
309
+                }
310
+                $newStyleDeclarations = $this->parseCssDeclarationBlock($value['attributes']);
311
+                $node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($oldStyleDeclarations, $newStyleDeclarations));
312
+            }
313
+        }
314
+
315
+        // now iterate through the nodes that contained inline styles in the original HTML
316
+        foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
317
+            $node = $this->visitedNodes[$nodePath];
318
+            $currentStyleAttributes = $this->parseCssDeclarationBlock($node->getAttribute('style'));
319
+            $node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($currentStyleAttributes, $styleAttributesForNode));
320
+        }
321
+
322
+        // This removes styles from your email that contain display:none.
323
+        // We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
324
+        // lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
325
+        // to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
326
+        $nodesWithStyleDisplayNone = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
327
+        // The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
328
+        // we don't try to call removeChild on a nonexistent child node
329
+        if ($nodesWithStyleDisplayNone->length > 0) {
330
+            /** @var $node \DOMNode */
331
+            foreach ($nodesWithStyleDisplayNone as $node) {
332
+                if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
333
+                    $node->parentNode->removeChild($node);
334
+                }
335
+            }
336
+        }
337
+
338
+        $this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339
+
340
+        if ($this->preserveEncoding) {
341
+            if ( function_exists( 'mb_convert_encoding' ) ) {
342
+                return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
343
+            } else {
344
+                return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
345
+            }
346
+        } else {
347
+            return $xmlDocument->saveHTML();
348
+        }
349
+    }
350
+
351
+    public function strtolower(array $m) {
352
+        return strtolower($m[0]);
353
+    }
354
+
355
+
356
+    /**
357
+     * This method merges old or existing name/value array with new name/value array.
358
+     * and then generates a string of the combined style suitable for placing inline.
359
+     * This becomes the single point for CSS string generation allowing for consistent.
360
+     * CSS output no matter where the CSS originally came from.
361
+     * @param array $oldStyles
362
+     * @param array $newStyles
363
+     * @return string
364
+     */
365
+    private function generateStyleStringFromDeclarationsArrays(array $oldStyles, array $newStyles) {
366
+        $combinedStyles = array_merge($oldStyles, $newStyles);
367
+        $style = '';
368
+        foreach ($combinedStyles as $attributeName => $attributeValue) {
369
+            $style .= (strtolower(trim($attributeName)) . ': ' . trim($attributeValue) . '; ');
370
+        }
371
+        return trim($style);
372
+    }
373
+
374
+
375
+    /**
376
+     * Copies the media part from CSS array parts to $xmlDocument.
377
+     *
378
+     * @param array $cssParts
379
+     * @param DOMDocument $xmlDocument
380
+     */
381
+    public function copyCssWithMediaToStyleNode(array $cssParts, DOMDocument $xmlDocument) {
382
+        if (isset($cssParts['media']) && $cssParts['media'] !== '') {
383
+            $this->addStyleElementToDocument($xmlDocument, $cssParts['media']);
384
+        }
385
+    }
386
+
387
+    /**
388
+     * Returns CSS content.
389
+     *
390
+     * @param DOMXPath $xpath
391
+     * @return string
392
+     */
393
+    private function getCssFromAllStyleNodes(DOMXPath $xpath) {
394
+        $styleNodes = $xpath->query('//style');
395
+
396
+        if ($styleNodes === false) {
397
+            return '';
398
+        }
399
+
400
+        $css = '';
401
+        /** @var $styleNode DOMNode */
402
+        foreach ($styleNodes as $styleNode) {
403
+            $css .= "\n\n" . $styleNode->nodeValue;
404
+            $styleNode->parentNode->removeChild($styleNode);
405
+        }
406
+
407
+        return $css;
408
+    }
409
+
410
+    /**
411
+     * Adds a style element with $css to $document.
412
+     *
413
+     * @param DOMDocument $document
414
+     * @param string $css
415
+     */
416
+    private function addStyleElementToDocument(DOMDocument $document, $css) {
417
+        $styleElement = $document->createElement('style', $css);
418
+        $styleAttribute = $document->createAttribute('type');
419
+        $styleAttribute->value = 'text/css';
420
+        $styleElement->appendChild($styleAttribute);
421
+
422
+        $head = $this->getOrCreateHeadElement($document);
423
+        $head->appendChild($styleElement);
424
+    }
425
+
426
+    /**
427
+     * Returns the existing or creates a new head element in $document.
428
+     *
429
+     * @param DOMDocument $document
430
+     * @return DOMNode the head element
431
+     */
432
+    private function getOrCreateHeadElement(DOMDocument $document) {
433
+        $head = $document->getElementsByTagName('head')->item(0);
434
+
435
+        if ($head === null) {
436
+            $head = $document->createElement('head');
437
+            $html = $document->getElementsByTagName('html')->item(0);
438
+            $html->insertBefore($head, $document->getElementsByTagName('body')->item(0));
439
+        }
440
+
441
+        return $head;
442
+    }
443
+
444
+    /**
445
+     * Splits input CSS code to an array where:
446
+     *
447
+     * - key "css" will be contains clean CSS code.
448
+     * - key "media" will be contains all valuable media queries.
449
+     *
450
+     * Example:
451
+     *
452
+     * The CSS code.
453
+     *
454
+     *   "@import "file.css"; h1 { color:red; } @media { h1 {}} @media tv { h1 {}}"
455
+     *
456
+     * will be parsed into the following array:
457
+     *
458
+     *   "css" => "h1 { color:red; }"
459
+     *   "media" => "@media { h1 {}}"
460
+     *
461
+     * @param string $css
462
+     * @return array
463
+     */
464
+    private function splitCssAndMediaQuery($css) {
465
+        $css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
466
+
467
+        // filter the CSS
468
+        $search = array(
469
+            // get rid of css comment code
470
+            '/\\/\\*.*\\*\\//sU',
471
+            // strip out any import directives
472
+            '/^\\s*@import\\s[^;]+;/misU',
473
+            // strip remains media enclosures
474
+            '/^\\s*@media\\s[^{]+{(.*)}\\s*}\\s/misU',
475
+        );
476
+
477
+        $replace = array(
478
+            '',
479
+            '',
480
+            '',
481
+        );
482
+
483
+        // clean CSS before output
484
+        $css = preg_replace($search, $replace, $css);
485
+
486
+        return array('css' => $css, 'media' => self::$_media);
487
+    }
488
+
489
+    private function _media_concat( $matches ) {
490
+        self::$_media .= $matches[0];
491
+    }
492
+
493
+    /**
494
+     * Creates a DOMDocument instance with the current HTML.
495
+     *
496
+     * @return DOMDocument
497
+     */
498
+    private function createXmlDocument() {
499
+        $xmlDocument = new DOMDocument;
500
+        $xmlDocument->encoding = self::ENCODING;
501
+        $xmlDocument->strictErrorChecking = false;
502
+        $xmlDocument->formatOutput = true;
503
+        $libXmlState = libxml_use_internal_errors(true);
504
+        $xmlDocument->loadHTML($this->getUnifiedHtml());
505
+        libxml_clear_errors();
506
+        libxml_use_internal_errors($libXmlState);
507
+        $xmlDocument->normalizeDocument();
508
+
509
+        return $xmlDocument;
510
+    }
511
+
512
+    /**
513
+     * Returns the HTML with the non-ASCII characters converts into HTML entities and the unprocessable HTML tags removed.
514
+     *
515
+     * @return string the unified HTML
516
+     *
517
+     * @throws BadMethodCallException
518
+     */
519
+    private function getUnifiedHtml() {
520
+        if (!empty($this->unprocessableHtmlTags)) {
521
+            $unprocessableHtmlTags = implode('|', $this->unprocessableHtmlTags);
522
+            $bodyWithoutUnprocessableTags = preg_replace('/<\\/?(' . $unprocessableHtmlTags . ')[^>]*>/i', '', $this->html);
523
+        } else {
524
+            $bodyWithoutUnprocessableTags = $this->html;
525
+        }
526
+
527
+        if ( function_exists( 'mb_convert_encoding' ) ) {
528
+            return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
529
+        } else {
530
+            return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
531
+        }
532
+    }
533
+
534
+    /**
535
+     * @param array $a
536
+     * @param array $b
537
+     *
538
+     * @return integer
539
+     */
540
+    private function sortBySelectorPrecedence(array $a, array $b) {
541
+        $precedenceA = $this->getCssSelectorPrecedence($a['selector']);
542
+        $precedenceB = $this->getCssSelectorPrecedence($b['selector']);
543
+
544
+        // We want these sorted in ascending order so selectors with lesser precedence get processed first and
545
+        // selectors with greater precedence get sorted last.
546
+        // The parenthesis around the -1 are necessary to avoid a PHP_CodeSniffer warning about missing spaces around
547
+        // arithmetic operators.
548
+        // @see http://forge.typo3.org/issues/55605
549
+        $precedenceForEquals = ($a['line'] < $b['line'] ? (-1) : 1);
550
+        $precedenceForNotEquals = ($precedenceA < $precedenceB ? (-1) : 1);
551
+        return ($precedenceA === $precedenceB) ? $precedenceForEquals : $precedenceForNotEquals;
552
+    }
553
+
554
+    /**
555
+     * @param string $selector
556
+     *
557
+     * @return integer
558
+     */
559
+    private function getCssSelectorPrecedence($selector) {
560
+        $selectorKey = md5($selector);
561
+        if (!isset($this->caches[self::CACHE_KEY_SELECTOR][$selectorKey])) {
562
+            $precedence = 0;
563
+            $value = 100;
564
+            // ids: worth 100, classes: worth 10, elements: worth 1
565
+            $search = array('\\#','\\.','');
566
+
567
+            foreach ($search as $s) {
568
+                if (trim($selector == '')) {
569
+                    break;
570
+                }
571
+                $number = 0;
572
+                $selector = preg_replace('/' . $s . '\\w+/', '', $selector, -1, $number);
573
+                $precedence += ($value * $number);
574
+                $value /= 10;
575
+            }
576
+            $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey] = $precedence;
577
+        }
578
+
579
+        return $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey];
580
+    }
581
+
582
+    /**
583
+     * Right now, we support all CSS 1 selectors and most CSS2/3 selectors.
584
+     *
585
+     * @see http://plasmasturm.org/log/444/
586
+     *
587
+     * @param string $paramCssSelector
588
+     *
589
+     * @return string
590
+     */
591
+    private function translateCssToXpath($paramCssSelector) {
592
+        $cssSelector = ' ' . $paramCssSelector . ' ';
593
+        $cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
594
+        $cssSelector = trim($cssSelector);
595
+        $xpathKey = md5($cssSelector);
596
+        if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
597
+            // returns an Xpath selector
598
+            $search = array(
599
+                // Matches any element that is a child of parent.
600
+                '/\\s+>\\s+/',
601
+                // Matches any element that is an adjacent sibling.
602
+                '/\\s+\\+\\s+/',
603
+                // Matches any element that is a descendant of an parent element element.
604
+                '/\\s+/',
605
+                // first-child pseudo-selector
606
+                '/([^\\/]+):first-child/i',
607
+                // last-child pseudo-selector
608
+                '/([^\\/]+):last-child/i',
609
+                // Matches attribute only selector
610
+                '/^\\[(\\w+)\\]/',
611
+                // Matches element with attribute
612
+                '/(\\w)\\[(\\w+)\\]/',
613
+                // Matches element with EXACT attribute
614
+                '/(\\w)\\[(\\w+)\\=[\'"]?(\\w+)[\'"]?\\]/',
615
+            );
616
+            $replace = array(
617
+                '/',
618
+                '/following-sibling::*[1]/self::',
619
+                '//',
620
+                '*[1]/self::\\1',
621
+                '*[last()]/self::\\1',
622
+                '*[@\\1]',
623
+                '\\1[@\\2]',
624
+                '\\1[@\\2="\\3"]',
625
+            );
626
+
627
+            $cssSelector = '//' . preg_replace($search, $replace, $cssSelector);
628
+
629
+            $cssSelector = preg_replace_callback(self::ID_ATTRIBUTE_MATCHER, array($this, 'matchIdAttributes'), $cssSelector);
630
+            $cssSelector = preg_replace_callback(self::CLASS_ATTRIBUTE_MATCHER, array($this, 'matchClassAttributes'), $cssSelector);
631
+
632
+            // Advanced selectors are going to require a bit more advanced emogrification.
633
+            // When we required PHP 5.3, we could do this with closures.
634
+            $cssSelector = preg_replace_callback(
635
+                '/([^\\/]+):nth-child\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
636
+                array($this, 'translateNthChild'), $cssSelector
637
+            );
638
+            $cssSelector = preg_replace_callback(
639
+                '/([^\\/]+):nth-of-type\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
640
+                array($this, 'translateNthOfType'), $cssSelector
641
+            );
642
+
643
+            $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey] = $cssSelector;
644
+        }
645
+        return $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey];
646
+    }
647
+
648
+    /**
649
+     * @param array $match
650
+     *
651
+     * @return string
652
+     */
653
+    private function matchIdAttributes(array $match) {
654
+        return (strlen($match[1]) ? $match[1] : '*') . '[@id="' . $match[2] . '"]';
655
+    }
656
+
657
+    /**
658
+     * @param array $match
659
+     *
660
+     * @return string
661
+     */
662
+    private function matchClassAttributes(array $match) {
663
+        return (strlen($match[1]) ? $match[1] : '*') . '[contains(concat(" ",@class," "),concat(" ","' .
664
+            implode(
665
+                '"," "))][contains(concat(" ",@class," "),concat(" ","',
666
+                explode('.', substr($match[2], 1))
667
+            ) . '"," "))]';
668
+    }
669
+
670
+    /**
671
+     * @param array $match
672
+     *
673
+     * @return string
674
+     */
675
+    private function translateNthChild(array $match) {
676
+        $result = $this->parseNth($match);
677
+
678
+        if (isset($result[self::MULTIPLIER])) {
679
+            if ($result[self::MULTIPLIER] < 0) {
680
+                $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
681
+                return sprintf('*[(last() - position()) mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
682
+            } else {
683
+                return sprintf('*[position() mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
684
+            }
685
+        } else {
686
+            return sprintf('*[%u]/self::%s', $result[self::INDEX], $match[1]);
687
+        }
688
+    }
689
+
690
+    /**
691
+     * @param array $match
692
+     *
693
+     * @return string
694
+     */
695
+    private function translateNthOfType(array $match) {
696
+        $result = $this->parseNth($match);
697
+
698
+        if (isset($result[self::MULTIPLIER])) {
699
+            if ($result[self::MULTIPLIER] < 0) {
700
+                $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
701
+                return sprintf('%s[(last() - position()) mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
702
+            } else {
703
+                return sprintf('%s[position() mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
704
+            }
705
+        } else {
706
+            return sprintf('%s[%u]', $match[1], $result[self::INDEX]);
707
+        }
708
+    }
709
+
710
+    /**
711
+     * @param array $match
712
+     *
713
+     * @return array
714
+     */
715
+    private function parseNth(array $match) {
716
+        if (in_array(strtolower($match[2]), array('even','odd'))) {
717
+            $index = strtolower($match[2]) == 'even' ? 0 : 1;
718
+            return array(self::MULTIPLIER => 2, self::INDEX => $index);
719
+        } elseif (stripos($match[2], 'n') === false) {
720
+            // if there is a multiplier
721
+            $index = intval(str_replace(' ', '', $match[2]));
722
+            return array(self::INDEX => $index);
723
+        } else {
724
+            if (isset($match[3])) {
725
+                $multipleTerm = str_replace($match[3], '', $match[2]);
726
+                $index = intval(str_replace(' ', '', $match[3]));
727
+            } else {
728
+                $multipleTerm = $match[2];
729
+                $index = 0;
730
+            }
731
+
732
+            $multiplier = str_ireplace('n', '', $multipleTerm);
733
+
734
+            if (!strlen($multiplier)) {
735
+                $multiplier = 1;
736
+            } elseif ($multiplier == 0) {
737
+                return array(self::INDEX => $index);
738
+            } else {
739
+                $multiplier = intval($multiplier);
740
+            }
741
+
742
+            while ($index < 0) {
743
+                $index += abs($multiplier);
744
+            }
745
+
746
+            return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
747
+        }
748
+    }
749
+
750
+    /**
751
+     * Parses a CSS declaration block into property name/value pairs.
752
+     *
753
+     * Example:
754
+     *
755
+     * The declaration block.
756
+     *
757
+     *   "color: #000; font-weight: bold;".
758
+     *
759
+     * will be parsed into the following array:
760
+     *
761
+     *   "color" => "#000"
762
+     *   "font-weight" => "bold"
763
+     *
764
+     * @param string $cssDeclarationBlock the CSS declaration block without the curly braces, may be empty
765
+     *
766
+     * @return array the CSS declarations with the property names as array keys and the property values as array values
767
+     */
768
+    private function parseCssDeclarationBlock($cssDeclarationBlock) {
769
+        if (isset($this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock])) {
770
+            return $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock];
771
+        }
772
+
773
+        $properties = array();
774
+        $declarations = explode(';', $cssDeclarationBlock);
775
+        foreach ($declarations as $declaration) {
776
+            $matches = array();
777
+            if (!preg_match('/ *([A-Za-z\\-]+) *: *([^;]+) */', $declaration, $matches)) {
778
+                continue;
779
+            }
780
+            $propertyName = strtolower($matches[1]);
781
+            $propertyValue = $matches[2];
782
+            $properties[$propertyName] = $propertyValue;
783
+        }
784
+        $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock] = $properties;
785
+
786
+        return $properties;
787
+    }
788 788
 }
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -238,7 +238,7 @@  discard block
 block discarded – undo
238 238
 		if ($nodesWithStyleAttributes !== false) {
239 239
 			/** @var $nodeWithStyleAttribute DOMNode */
240 240
 			foreach ($nodesWithStyleAttributes as $node) {
241
-				$normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
241
+				$normalizedOriginalStyle = preg_replace_callback('/[A-z\\-]+(?=\\:)/S', array($this, 'strtolower'), $node->getAttribute('style'));
242 242
 
243 243
 				// in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244 244
 				$nodePath = $node->getNodePath();
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
 			}
290 290
 
291 291
 			// now sort the selectors by precedence
292
-			usort($allSelectors, array($this,'sortBySelectorPrecedence'));
292
+			usort($allSelectors, array($this, 'sortBySelectorPrecedence'));
293 293
 
294 294
 			$this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295 295
 		}
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
 		if ($nodesWithStyleDisplayNone->length > 0) {
330 330
 			/** @var $node \DOMNode */
331 331
 			foreach ($nodesWithStyleDisplayNone as $node) {
332
-				if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
332
+				if ($node->parentNode && is_callable(array($node->parentNode, 'removeChild'))) {
333 333
 					$node->parentNode->removeChild($node);
334 334
 				}
335 335
 			}
@@ -338,10 +338,10 @@  discard block
 block discarded – undo
338 338
 		$this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339 339
 
340 340
 		if ($this->preserveEncoding) {
341
-			if ( function_exists( 'mb_convert_encoding' ) ) {
342
-				return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
341
+			if (function_exists('mb_convert_encoding')) {
342
+				return mb_convert_encoding($xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES');
343 343
 			} else {
344
-				return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
344
+				return htmlspecialchars_decode(utf8_encode(html_entity_decode($xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING)));
345 345
 			}
346 346
 		} else {
347 347
 			return $xmlDocument->saveHTML();
@@ -462,7 +462,7 @@  discard block
 block discarded – undo
462 462
 	 * @return array
463 463
 	 */
464 464
 	private function splitCssAndMediaQuery($css) {
465
-		$css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
465
+		$css = preg_replace_callback('#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array($this, '_media_concat'), $css);
466 466
 
467 467
 		// filter the CSS
468 468
 		$search = array(
@@ -486,7 +486,7 @@  discard block
 block discarded – undo
486 486
 		return array('css' => $css, 'media' => self::$_media);
487 487
 	}
488 488
 
489
-	private function _media_concat( $matches ) {
489
+	private function _media_concat($matches) {
490 490
 		self::$_media .= $matches[0];
491 491
 	}
492 492
 
@@ -524,10 +524,10 @@  discard block
 block discarded – undo
524 524
 			$bodyWithoutUnprocessableTags = $this->html;
525 525
 		}
526 526
 
527
-		if ( function_exists( 'mb_convert_encoding' ) ) {
528
-			return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
527
+		if (function_exists('mb_convert_encoding')) {
528
+			return mb_convert_encoding($bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING);
529 529
 		} else {
530
-			return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
530
+			return htmlspecialchars_decode(utf8_decode(htmlentities($bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false)));
531 531
 		}
532 532
 	}
533 533
 
@@ -562,7 +562,7 @@  discard block
 block discarded – undo
562 562
 			$precedence = 0;
563 563
 			$value = 100;
564 564
 			// ids: worth 100, classes: worth 10, elements: worth 1
565
-			$search = array('\\#','\\.','');
565
+			$search = array('\\#', '\\.', '');
566 566
 
567 567
 			foreach ($search as $s) {
568 568
 				if (trim($selector == '')) {
@@ -590,7 +590,7 @@  discard block
 block discarded – undo
590 590
 	 */
591 591
 	private function translateCssToXpath($paramCssSelector) {
592 592
 		$cssSelector = ' ' . $paramCssSelector . ' ';
593
-		$cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
593
+		$cssSelector = preg_replace_callback('/\s+\w+\s+/', array($this, 'strtolower'), $cssSelector);
594 594
 		$cssSelector = trim($cssSelector);
595 595
 		$xpathKey = md5($cssSelector);
596 596
 		if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
@@ -713,7 +713,7 @@  discard block
 block discarded – undo
713 713
 	 * @return array
714 714
 	 */
715 715
 	private function parseNth(array $match) {
716
-		if (in_array(strtolower($match[2]), array('even','odd'))) {
716
+		if (in_array(strtolower($match[2]), array('even', 'odd'))) {
717 717
 			$index = strtolower($match[2]) == 'even' ? 0 : 1;
718 718
 			return array(self::MULTIPLIER => 2, self::INDEX => $index);
719 719
 		} elseif (stripos($match[2], 'n') === false) {
Please login to merge, or discard this patch.
templates/wpinv-invalid-access.php 1 patch
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -1,56 +1,56 @@
 block discarded – undo
1 1
 <?php 
2
-if ( !defined('ABSPATH') ) {
2
+if (!defined('ABSPATH')) {
3 3
     exit;
4 4
 }
5
-do_action( 'wpinv_invalid_invoice_before_display' ); ?><!DOCTYPE html>
5
+do_action('wpinv_invalid_invoice_before_display'); ?><!DOCTYPE html>
6 6
 <html <?php language_attributes(); ?>>
7 7
 <head>
8 8
     <meta charset="UTF-8">
9 9
     <title><?php wp_title() ?></title>
10
-    <meta charset="<?php bloginfo( 'charset' ); ?>" />
10
+    <meta charset="<?php bloginfo('charset'); ?>" />
11 11
     <meta name="viewport" content="width=device-width,initial-scale=1">
12 12
     <meta name="robots" content="noindex,nofollow">
13
-    <?php do_action( 'wpinv_invalid_invoice_head' ); ?>
13
+    <?php do_action('wpinv_invalid_invoice_head'); ?>
14 14
 </head>
15 15
 <body class="body wpinv wpinv-print wpinv-invalid-invoice">
16
-    <?php do_action( 'wpinv_invalid_invoice_body_start' ); ?>
16
+    <?php do_action('wpinv_invalid_invoice_body_start'); ?>
17 17
     <div class="container wpinv-wrap">
18 18
         <!-- ///// Start Header -->
19 19
         <htmlpageheader name="wpinv-pdf-header">
20
-            <?php do_action( 'wpinv_invalid_invoice_before_header' ); ?>
20
+            <?php do_action('wpinv_invalid_invoice_before_header'); ?>
21 21
             <div class="row wpinv-header">
22 22
                 <div class="col-xs-12 wpinv-business">
23
-                    <a target="_blank" href="<?php echo esc_url( wpinv_get_business_website() ); ?>">
24
-                        <?php if ( $logo = wpinv_get_business_logo() ) { ?>
25
-                        <img class="logo" src="<?php echo esc_url( $logo ); ?>">
23
+                    <a target="_blank" href="<?php echo esc_url(wpinv_get_business_website()); ?>">
24
+                        <?php if ($logo = wpinv_get_business_logo()) { ?>
25
+                        <img class="logo" src="<?php echo esc_url($logo); ?>">
26 26
                         <?php } else { ?>
27
-                        <h1><?php echo esc_html( wpinv_get_business_name() ); ?></h1>
27
+                        <h1><?php echo esc_html(wpinv_get_business_name()); ?></h1>
28 28
                         <?php } ?>
29 29
                     </a>
30 30
                 </div>
31 31
             </div>
32
-            <?php do_action( 'wpinv_invalid_invoice_after_header' ); ?>
32
+            <?php do_action('wpinv_invalid_invoice_after_header'); ?>
33 33
         </htmlpageheader>
34 34
         <!-- End Header ///// -->
35 35
         
36
-        <?php do_action( 'wpinv_invalid_invoice_before_content' ); ?>
36
+        <?php do_action('wpinv_invalid_invoice_before_content'); ?>
37 37
 
38
-        <?php do_action( 'wpinv_invalid_invoice_content' ); ?>
38
+        <?php do_action('wpinv_invalid_invoice_content'); ?>
39 39
         
40
-        <?php do_action( 'wpinv_invalid_invoice_after_content' ); ?>
40
+        <?php do_action('wpinv_invalid_invoice_after_content'); ?>
41 41
         
42 42
         <!-- ///// Start Footer -->
43 43
         <htmlpagefooter name="wpinv-pdf-footer">
44
-            <?php do_action( 'wpinv_invalid_invoice_before_footer' ); ?>
44
+            <?php do_action('wpinv_invalid_invoice_before_footer'); ?>
45 45
             <div class="row wpinv-footer">
46 46
                 <div class="col-sm-12">
47 47
                     <div class="footer-text"><?php echo wpinv_get_business_footer(); ?></div>
48 48
                 </div>
49 49
             </div>
50
-            <?php do_action( 'wpinv_invalid_invoice_after_footer' ); ?>
50
+            <?php do_action('wpinv_invalid_invoice_after_footer'); ?>
51 51
         </htmlpagefooter>
52 52
         <!-- End Footer ///// -->
53 53
     </div>
54
-    <?php do_action( 'wpinv_invalid_invoice_body_end' ); ?>
54
+    <?php do_action('wpinv_invalid_invoice_body_end'); ?>
55 55
 </body>
56 56
 </html>
57 57
\ No newline at end of file
Please login to merge, or discard this patch.