PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 3.8.9
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v3.8.9
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 3.8.9, at includes/Editors/BlockEditor/StyleHandler.php

237 lines 6.8 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 }
50
51 /**
52 * Enqueue a script in the WordPress admin on edit.php.
53 * @param int $hook Hook suffix for the current admin page.
54 */
55 public function betterdocs_blocks_edit_post( $hook ) {
56 if ( 'widgets.php' === $hook ) {
57 return;
58 }
59
60 if ( $hook != 'post.php' && $hook != 'post-new.php' && $hook != 'site-editor.php' ) {
61 return;
62 }
63
64 $_style_handler_deps = [
65 'lodash',
66 'wp-i18n',
67 'wp-element',
68 'wp-hooks',
69 'wp-util',
70 'wp-components',
71 'wp-blocks',
72 'wp-editor',
73 'wp-block-editor'
74 ];
75
76 $_style_handler_object = [
77 'sth_nonce' => wp_create_nonce( 'betterdocs_style_handler_nonce' ),
78 'editor_type' => 'edit-site'
79 ];
80
81 if ( $hook == 'post-new.php' || $hook == 'post.php' ) {
82 $_style_handler_deps[] = 'wp-edit-post';
83 $_style_handler_object['editor_type'] = 'edit-post';
84 } elseif ( $hook == 'site-editor.php' ) {
85 $_style_handler_deps[] = 'wp-edit-site';
86 $_style_handler_object['editor_type'] = 'edit-site';
87 }
88
89 betterdocs()->assets->enqueue( 'betterdocs-blocks-style-handler', 'vendor/js/style-handler.js', $_style_handler_deps );
90 betterdocs()->assets->localize( 'betterdocs-blocks-style-handler', 'betterdocs_style_handler', $_style_handler_object );
91 }
92
93 /**
94 * Ajax callback to write css in upload directory
95 * @retun void
96 * @since 1.0.2
97 */
98 public function write_block_css() {
99 if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'betterdocs_style_handler_nonce' ) || ! current_user_can( 'manage_options' ) ) {
100 echo 'Invalid request';
101 wp_die();
102 }
103
104 $block_styles = (array) json_decode( stripslashes( $_POST['data'] ) );
105
106 if ( isset( $_POST['editorType'] ) && $_POST['editorType'] === 'edit-site' ) {
107 $upload_dir = wp_upload_dir()['basedir'] . '/betterdocs-style/';
108 $editSiteCssPath = $upload_dir . 'betterdocs-style-' . $_POST['editorType'] . '.min.css';
109 if ( file_exists( $editSiteCssPath ) ) {
110 $existingCss = file_get_contents( $editSiteCssPath );
111 $pattern = '~\/\*(.*?)\*\/~';
112 preg_match_all( $pattern, $existingCss, $result, PREG_PATTERN_ORDER );
113 $allComments = $result[0];
114 $seperatedIds = [];
115 foreach ( $allComments as $comment ) {
116 $id = preg_replace( '/[^A-Za-z0-9\-]|Ends|Starts/', '', $comment );
117
118 if ( strpos( $comment, 'Starts' ) ) {
119 $seperatedIds[ $id ]['start'] = $comment;
120 } elseif ( strpos( $comment, 'Ends' ) ) {
121 $seperatedIds[ $id ]['end'] = $comment;
122 }
123 }
124
125 $seperateStyles = [];
126 foreach ( $seperatedIds as $key => $ids ) {
127 $data = $this->get_between_data( $existingCss, $ids['start'], $ids['end'] );
128 $seperateStyles[ $key ] = $data;
129 }
130
131 $finalCSSArray = array_merge( $seperateStyles, $block_styles );
132
133 if ( ! empty( $css = $this->build_css( $finalCSSArray ) ) ) {
134 $upload_dir = wp_upload_dir()['basedir'] . '/betterdocs-style/';
135 if ( ! file_exists( $upload_dir ) ) {
136 mkdir( $upload_dir );
137 }
138
139 file_put_contents( $editSiteCssPath, $css );
140 }
141 } elseif ( ! empty( $css = $this->build_css( $block_styles ) ) ) {
142 $upload_dir = wp_upload_dir()['basedir'] . '/betterdocs-style/';
143 if ( ! file_exists( $upload_dir ) ) {
144 mkdir( $upload_dir );
145 }
146
147 file_put_contents( $editSiteCssPath, $css );
148 }
149 } elseif ( ! empty( $css = $this->build_css( $block_styles ) ) ) {
150 $upload_dir = wp_upload_dir()['basedir'] . '/betterdocs-style/';
151 if ( ! file_exists( $upload_dir ) ) {
152 mkdir( $upload_dir );
153 }
154 file_put_contents( $upload_dir . 'betterdocs-style-' . abs( $_POST['id'] ) . '.min.css', $css );
155 }
156
157 wp_send_json_success( 'done' );
158 }
159
160 /**
161 * Enqueue frontend css for post if have one
162 * @param array
163 * @return string
164 * @since 1.0.2
165 */
166 private function build_css( $style_object ) {
167 // $block_styles = (array)json_decode(stripslashes($style_object));
168 $block_styles = $style_object;
169
170 $css = '';
171 foreach ( $block_styles as $block_style_key => $block_style ) {
172 if ( ! empty( $block_css = (array) $block_style ) ) {
173 $css .= sprintf(
174 '/* %1$s Starts */',
175 $block_style_key
176 );
177 foreach ( $block_css as $media => $style ) {
178 switch ( $media ) {
179 case $this->media_desktop['name']:
180 $css .= preg_replace( '/\s+/', ' ', $style );
181 break;
182 case $this->media_hover_desktop['name']:
183 $css .= preg_replace( '/\s+/', ' ', $style );
184 break;
185 case $this->media_tab['name']:
186 $css .= ' @media(max-width: 1024px){';
187 $css .= preg_replace( '/\s+/', ' ', $style );
188 $css .= '}';
189 break;
190 case $this->media_hover_tab['name']:
191 $css .= ' @media(max-width: 1024px){';
192 $css .= preg_replace( '/\s+/', ' ', $style );
193 $css .= '}';
194 break;
195 case $this->media_mobile['name']:
196 $css .= ' @media(max-width: 767px){';
197 $css .= preg_replace( '/\s+/', ' ', $style );
198 $css .= '}';
199 break;
200 case $this->media_hover_mobile['name']:
201 $css .= ' @media(max-width: 767px){';
202 $css .= preg_replace( '/\s+/', ' ', $style );
203 $css .= '}';
204 break;
205 case $this->extra_styles['name']:
206 $css .= preg_replace( '/\s+/', ' ', $style );
207 break;
208 }
209 }
210 $css .= sprintf(
211 '/* =%1$s= Ends */',
212 $block_style_key
213 );
214 }
215 }
216 return trim( $css );
217 }
218
219 /**
220 * Helper function to get string between 2 string
221 * @since 3.3.0
222 */
223 private function get_between_data( $string, $start, $end ) {
224 $pos_string = stripos( $string, $start );
225 $substr_data = substr( $string, $pos_string );
226 $string_two = substr( $substr_data, strlen( $start ) );
227 $second_pos = stripos( $string_two, $end );
228 $string_three = substr( $string_two, 0, $second_pos );
229
230 // remove whitespaces from result
231 $result_unit = trim( $string_three );
232
233 // return result_unit
234 return $result_unit;
235 }
236 }
237