PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 2.5.5
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v2.5.5
4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.5.2 All 199 releases
betterdocs / includes / Editors / BlockEditor / StyleHandler.php

StyleHandler.php in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 2.5.5, at includes/Editors/BlockEditor/StyleHandler.php

268 lines 9.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace WPDeveloper\BetterDocs\Editors\BlockEditor;
3
4 if ( ! defined( 'ABSPATH' ) ) {
5 exit; // Exit if accessed directly.
6 }
7
8 use WPDeveloper\BetterDocs\Utils\Base;
9
10 final class StyleHandler extends Base {
11 private $media_desktop = [
12 'name' => 'desktop',
13 'screen_size' => ''
14 ];
15
16 private $media_hover_desktop = [
17 'name' => 'desktopHover',
18 'screen_size' => ''
19 ];
20
21 private $media_tab = [
22 'name' => 'tab',
23 'screen_size' => 1024
24 ];
25
26 private $media_hover_tab = [
27 'name' => 'tabHover',
28 'screen_size' => 1024
29 ];
30
31 private $media_mobile = [
32 'name' => 'mobile',
33 'screen_size' => 767
34 ];
35
36 private $media_hover_mobile = [
37 'name' => 'mobileHover',
38 'screen_size' => 767
39 ];
40
41 private $extra_styles = [
42 'name' => 'extraStyles',
43 'screen_size' => ''
44 ];
45
46 public function __construct() {
47 add_action( 'admin_enqueue_scripts', [$this, 'betterdocs_blocks_edit_post'] );
48 add_action( 'wp_ajax_betterdocs_write_block_css', [$this, 'write_block_css'] );
49 add_action( 'wp_enqueue_scripts', [$this, 'enqueue_frontend_css'] );
50 }
51
52 /**
53 * Enqueue a script in the WordPress admin on edit.php.
54 * @param int $hook Hook suffix for the current admin page.
55 */
56 public function betterdocs_blocks_edit_post( $hook ) {
57 if ( 'widgets.php' === $hook ) {
58 return;
59 }
60
61 if ( $hook != 'post.php' && $hook != 'post-new.php' && $hook != 'site-editor.php' ) {
62 return;
63 }
64
65 $_style_handler_deps = [
66 'lodash',
67 'wp-i18n',
68 'wp-element',
69 'wp-hooks',
70 'wp-util',
71 'wp-components',
72 'wp-blocks',
73 'wp-editor',
74 'wp-block-editor'
75 ];
76
77 $_style_handler_object = [
78 'sth_nonce' => wp_create_nonce( 'betterdocs_style_handler_nonce' ),
79 'editor_type' => 'edit-site'
80 ];
81
82 if ( $hook == 'post-new.php' || $hook == 'post.php' ) {
83 $_style_handler_deps[] = 'wp-edit-post';
84 $_style_handler_object['editor_type'] = 'edit-post';
85 } elseif ( $hook == 'site-editor.php' ) {
86 $_style_handler_deps[] = 'wp-edit-site';
87 $_style_handler_object['editor_type'] = 'edit-site';
88 }
89
90 betterdocs()->assets->enqueue( 'betterdocs-blocks-style-handler', 'vendor/js/style-handler.js', $_style_handler_deps );
91 betterdocs()->assets->localize( 'betterdocs-blocks-style-handler', 'betterdocs_style_handler', $_style_handler_object );
92 }
93
94 /**
95 * Ajax callback to write css in upload directory
96 * @retun void
97 * @since 1.0.2
98 */
99 public function write_block_css() {
100 if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'betterdocs_style_handler_nonce' ) || ! current_user_can( 'manage_options' ) ) {
101 echo 'Invalid request';
102 wp_die();
103 }
104
105 $block_styles = (array) json_decode( stripslashes( $_POST['data'] ) );
106
107 if ( isset( $_POST['editorType'] ) && $_POST['editorType'] === "edit-site" ) {
108 $upload_dir = wp_upload_dir()['basedir'] . '/betterdocs-style/';
109 $editSiteCssPath = $upload_dir . 'betterdocs-style-' . $_POST['editorType'] . '.min.css';
110 if ( file_exists( $editSiteCssPath ) ) {
111 $existingCss = file_get_contents( $editSiteCssPath );
112 $pattern = "~\/\*(.*?)\*\/~";
113 preg_match_all( $pattern, $existingCss, $result, PREG_PATTERN_ORDER );
114 $allComments = $result[0];
115 $seperatedIds = [];
116 foreach ( $allComments as $comment ) {
117 $id = preg_replace( '/[^A-Za-z0-9\-]|Ends|Starts/', '', $comment );
118
119 if ( strpos( $comment, "Starts" ) ) {
120 $seperatedIds[$id]['start'] = $comment;
121 } else if ( strpos( $comment, "Ends" ) ) {
122 $seperatedIds[$id]['end'] = $comment;
123 }
124 }
125
126 $seperateStyles = [];
127 foreach ( $seperatedIds as $key => $ids ) {
128 $data = $this->get_between_data( $existingCss, $ids['start'], $ids['end'] );
129 $seperateStyles[$key] = $data;
130 }
131
132 $finalCSSArray = array_merge( $seperateStyles, $block_styles );
133
134 if ( ! empty( $css = $this->build_css( $finalCSSArray ) ) ) {
135 $upload_dir = wp_upload_dir()['basedir'] . '/betterdocs-style/';
136 if ( ! file_exists( $upload_dir ) ) {
137 mkdir( $upload_dir );
138 }
139
140 file_put_contents( $editSiteCssPath, $css );
141 }
142 } else {
143 if ( ! empty( $css = $this->build_css( $block_styles ) ) ) {
144 $upload_dir = wp_upload_dir()['basedir'] . '/betterdocs-style/';
145 if ( ! file_exists( $upload_dir ) ) {
146 mkdir( $upload_dir );
147 }
148
149 file_put_contents( $editSiteCssPath, $css );
150 }
151 }
152 } else {
153 if ( ! empty( $css = $this->build_css( $block_styles ) ) ) {
154 $upload_dir = wp_upload_dir()['basedir'] . '/betterdocs-style/';
155 if ( ! file_exists( $upload_dir ) ) {
156 mkdir( $upload_dir );
157 }
158 file_put_contents( $upload_dir . 'betterdocs-style-' . abs( $_POST['id'] ) . '.min.css', $css );
159 }
160 }
161
162 wp_send_json_success( 'done' );
163 }
164
165 /**
166 * Enqueue frontend css for post if have one
167 * @return void
168 * @since 1.0.2
169 */
170 public function enqueue_frontend_css() {
171 global $post;
172
173 if ( ! empty( $post ) && ! empty( $post->ID ) ) {
174 $upload_dir = wp_upload_dir();
175
176 $style_css_path = $upload_dir['basedir'] . '/betterdocs-style/betterdocs-style-' . $post->ID . '.min.css';
177 $style_css_url = $upload_dir['baseurl'] . '/betterdocs-style/betterdocs-style-' . $post->ID . '.min.css';
178
179 if ( file_exists( $style_css_path ) ) {
180 wp_enqueue_style(
181 'betterdocs-block-style-' . $post->ID,
182 $style_css_url, [], betterdocs()->version, 'all'
183 );
184 }
185 if ( function_exists( 'wp_is_block_theme' ) && wp_is_block_theme() && file_exists( $upload_dir['basedir'] . '/betterdocs-style/betterdocs-style-edit-site.min.css' ) ) {
186 wp_enqueue_style( 'betterdocs-fullsite-style', $upload_dir['baseurl'] . '/betterdocs-style/betterdocs-style-edit-site.min.css', [], substr( md5( microtime( true ) ), 0, 10 ) );
187 }
188 }
189 }
190
191 /**
192 * Enqueue frontend css for post if have one
193 * @param array
194 * @return string
195 * @since 1.0.2
196 */
197 private function build_css( $style_object ) {
198 // $block_styles = (array)json_decode(stripslashes($style_object));
199 $block_styles = $style_object;
200
201 $css = '';
202 foreach ( $block_styles as $block_style_key => $block_style ) {
203 if ( ! empty( $block_css = (array) $block_style ) ) {
204 $css .= sprintf(
205 '/* %1$s Starts */',
206 $block_style_key
207 );
208 foreach ( $block_css as $media => $style ) {
209 switch ( $media ) {
210 case $this->media_desktop['name']:
211 $css .= preg_replace( '/\s+/', ' ', $style );
212 break;
213 case $this->media_hover_desktop['name']:
214 $css .= preg_replace( '/\s+/', ' ', $style );
215 break;
216 case $this->media_tab['name']:
217 $css .= ' @media(max-width: 1024px){';
218 $css .= preg_replace( '/\s+/', ' ', $style );
219 $css .= '}';
220 break;
221 case $this->media_hover_tab['name']:
222 $css .= ' @media(max-width: 1024px){';
223 $css .= preg_replace( '/\s+/', ' ', $style );
224 $css .= '}';
225 break;
226 case $this->media_mobile['name']:
227 $css .= ' @media(max-width: 767px){';
228 $css .= preg_replace( '/\s+/', ' ', $style );
229 $css .= '}';
230 break;
231 case $this->media_hover_mobile['name']:
232 $css .= ' @media(max-width: 767px){';
233 $css .= preg_replace( '/\s+/', ' ', $style );
234 $css .= '}';
235 break;
236 case $this->extra_styles['name']:
237 $css .= preg_replace( '/\s+/', ' ', $style );
238 break;
239 }
240 }
241 $css .= sprintf(
242 '/* =%1$s= Ends */',
243 $block_style_key
244 );
245 }
246 }
247 return trim( $css );
248 }
249
250 /**
251 * Helper function to get string between 2 string
252 * @since 3.3.0
253 */
254 private function get_between_data( $string, $start, $end ) {
255 $pos_string = stripos( $string, $start );
256 $substr_data = substr( $string, $pos_string );
257 $string_two = substr( $substr_data, strlen( $start ) );
258 $second_pos = stripos( $string_two, $end );
259 $string_three = substr( $string_two, 0, $second_pos );
260
261 // remove whitespaces from result
262 $result_unit = trim( $string_three );
263
264 // return result_unit
265 return $result_unit;
266 }
267 }
268