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

241 lines 8.7 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 } else if ( 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 } else {
142 if ( ! empty( $css = $this->build_css( $block_styles ) ) ) {
143 $upload_dir = wp_upload_dir()['basedir'] . '/betterdocs-style/';
144 if ( ! file_exists( $upload_dir ) ) {
145 mkdir( $upload_dir );
146 }
147
148 file_put_contents( $editSiteCssPath, $css );
149 }
150 }
151 } else {
152 if ( ! empty( $css = $this->build_css( $block_styles ) ) ) {
153 $upload_dir = wp_upload_dir()['basedir'] . '/betterdocs-style/';
154 if ( ! file_exists( $upload_dir ) ) {
155 mkdir( $upload_dir );
156 }
157 file_put_contents( $upload_dir . 'betterdocs-style-' . abs( $_POST['id'] ) . '.min.css', $css );
158 }
159 }
160
161 wp_send_json_success( 'done' );
162 }
163
164 /**
165 * Enqueue frontend css for post if have one
166 * @param array
167 * @return string
168 * @since 1.0.2
169 */
170 private function build_css( $style_object ) {
171 // $block_styles = (array)json_decode(stripslashes($style_object));
172 $block_styles = $style_object;
173
174 $css = '';
175 foreach ( $block_styles as $block_style_key => $block_style ) {
176 if ( ! empty( $block_css = (array) $block_style ) ) {
177 $css .= sprintf(
178 '/* %1$s Starts */',
179 $block_style_key
180 );
181 foreach ( $block_css as $media => $style ) {
182 switch ( $media ) {
183 case $this->media_desktop['name']:
184 $css .= preg_replace( '/\s+/', ' ', $style );
185 break;
186 case $this->media_hover_desktop['name']:
187 $css .= preg_replace( '/\s+/', ' ', $style );
188 break;
189 case $this->media_tab['name']:
190 $css .= ' @media(max-width: 1024px){';
191 $css .= preg_replace( '/\s+/', ' ', $style );
192 $css .= '}';
193 break;
194 case $this->media_hover_tab['name']:
195 $css .= ' @media(max-width: 1024px){';
196 $css .= preg_replace( '/\s+/', ' ', $style );
197 $css .= '}';
198 break;
199 case $this->media_mobile['name']:
200 $css .= ' @media(max-width: 767px){';
201 $css .= preg_replace( '/\s+/', ' ', $style );
202 $css .= '}';
203 break;
204 case $this->media_hover_mobile['name']:
205 $css .= ' @media(max-width: 767px){';
206 $css .= preg_replace( '/\s+/', ' ', $style );
207 $css .= '}';
208 break;
209 case $this->extra_styles['name']:
210 $css .= preg_replace( '/\s+/', ' ', $style );
211 break;
212 }
213 }
214 $css .= sprintf(
215 '/* =%1$s= Ends */',
216 $block_style_key
217 );
218 }
219 }
220 return trim( $css );
221 }
222
223 /**
224 * Helper function to get string between 2 string
225 * @since 3.3.0
226 */
227 private function get_between_data( $string, $start, $end ) {
228 $pos_string = stripos( $string, $start );
229 $substr_data = substr( $string, $pos_string );
230 $string_two = substr( $substr_data, strlen( $start ) );
231 $second_pos = stripos( $string_two, $end );
232 $string_three = substr( $string_two, 0, $second_pos );
233
234 // remove whitespaces from result
235 $result_unit = trim( $string_three );
236
237 // return result_unit
238 return $result_unit;
239 }
240 }
241