PluginProbe ʕ •ᴥ•ʔ
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more / 3.8.1
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more v3.8.1
4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 trunk 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.5.0 1.6.0 1.6.1 1.6.2 1.6.3 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 2.0.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.2.0 2.2.1 2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.4.0 2.4.1 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.1.3 3.2.0 3.2.1 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 3.9.1 3.9.10 3.9.11 3.9.12 3.9.13 3.9.14 3.9.15 3.9.16 3.9.17 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9 4.0.0 4.0.1 4.0.10 4.0.11 4.0.12 4.0.13 4.0.14 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1.0 4.1.1 4.1.10 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.8 4.2.9 4.3.0 4.3.1 4.4.0 4.4.1 4.4.10 4.4.11 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 4.5.0 4.5.1
embedpress / EmbedPress / Includes / Classes / Helper.php
embedpress / EmbedPress / Includes / Classes Last commit date
Elementor_Enhancer.php 3 years ago EmbedPress_Core_Installer.php 6 years ago EmbedPress_Notice.php 4 years ago EmbedPress_Plugin_Usage_Tracker.php 3 years ago Extend_CustomPlayer_Controls.php 3 years ago Extend_Elementor_Controls.php 3 years ago Feature_Enhancer.php 3 years ago Helper.php 3 years ago
Helper.php
586 lines
1 <?php
2
3 namespace EmbedPress\Includes\Classes;
4 use EmbedPress\Shortcode;
5
6 if ( !defined('ABSPATH') ) {
7 exit;
8 } // Exit if accessed directly
9
10 class Helper {
11
12 /**
13 * Parse a query string into an associative array.
14 *
15 * If multiple values are found for the same key, the value of that key
16 * value pair will become an array. This function does not parse nested
17 * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will
18 * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']).
19 *
20 * @param string $str Query string to parse
21 * @param int|bool $urlEncoding How the query string is encoded
22 *
23 * @return array
24 */
25
26 public function __construct () {
27 add_action('wp_ajax_lock_content_form_handler', [$this, 'lock_content_form_handler']);
28 add_action('wp_ajax_nopriv_lock_content_form_handler', [$this, 'lock_content_form_handler']);
29 add_action( 'wp_head', [$this, 'ep_add_meta_tags'] );
30 }
31
32 public function ep_add_meta_tags() {
33 echo 'abstract';
34 }
35
36 public static function parse_query($str, $urlEncoding = true)
37 {
38 $result = [];
39
40 if ($str === '') {
41 return $result;
42 }
43
44 if ($urlEncoding === true) {
45 $decoder = function ($value) {
46 return rawurldecode(str_replace('+', ' ', $value));
47 };
48 } elseif ($urlEncoding === PHP_QUERY_RFC3986) {
49 $decoder = 'rawurldecode';
50 } elseif ($urlEncoding === PHP_QUERY_RFC1738) {
51 $decoder = 'urldecode';
52 } else {
53 $decoder = function ($str) { return $str; };
54 }
55
56 foreach (explode('&', $str) as $kvp) {
57 $parts = explode('=', $kvp, 2);
58 $key = $decoder($parts[0]);
59 $value = isset($parts[1]) ? $decoder($parts[1]) : null;
60 if (!isset($result[$key])) {
61 $result[$key] = $value;
62 } else {
63 if (!is_array($result[$key])) {
64 $result[$key] = [$result[$key]];
65 }
66 $result[$key][] = $value;
67 }
68 }
69
70 return $result;
71 }
72 public static function get_pdf_renderer() {
73 $renderer = EMBEDPRESS_URL_ASSETS . 'pdf/web/viewer.html';
74 // @TODO; apply settings query args here
75 return $renderer;
76 }
77
78 public static function get_extension_from_file_url($url) {
79 $urlSplit = explode(".", $url);
80 $ext = end($urlSplit);
81 return $ext;
82 }
83
84 public static function is_file_url($url) {
85 $pattern = '/\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/i';
86 return preg_match($pattern, $url) === 1;
87 }
88
89 public static function is_opensea($url) {
90 return strpos($url, "opensea.io") !== false;
91 }
92 public static function is_youtube_channel($url) {
93 return (bool) (preg_match('~(?:https?:\/\/)?(?:www\.)?(?:youtube.com\/)(?:channel\/|c\/|user\/|@)(\w+)~i', (string) $url));
94 }
95
96 public static function is_youtube($url) {
97 return (bool) (preg_match('~(?:https?://)?(?:www\.)?(?:youtube\.com|youtu\.be)/watch\?v=([^&]+)~i', (string) $url));
98 }
99
100 // Saved sources data temporary in wp_options table
101 public static function get_source_data($blockid, $source_url, $source_option_name, $source_temp_option_name) {
102
103
104 if(self::is_youtube_channel($source_url)){
105 $source_name = 'YoutubeChannel';
106 }
107 else if(self::is_youtube($source_url)){
108 $source_name = 'Youtube';
109 }
110 else if (!empty(self::is_file_url($source_url))) {
111 $source_name = 'document_' . self::get_extension_from_file_url($source_url);
112 }
113 else if(self::is_opensea($source_url)){
114 $source_name = 'OpenSea';
115 }
116 else{
117 Shortcode::get_embera_instance();
118 $collectios = Shortcode::get_collection();
119 $provider = $collectios->findProviders($source_url);
120 if(!empty($provider[$source_url])){
121 $source_name = $provider[$source_url]->getProviderName();
122 }
123 else{
124 $source_name = 'Unknown Source';
125 }
126 }
127
128 if(!empty($blockid) && $blockid != 'undefined'){
129 $sources = json_decode(get_option($source_temp_option_name), true);
130
131 if(!$sources) {
132 $sources = array();
133 }
134 $exists = false;
135
136 foreach($sources as $i => $source) {
137 if ($source['id'] === $blockid) {
138 $sources[$i]['source']['name'] = $source_name;
139 $sources[$i]['source']['url'] = $source_url;
140 $exists = true;
141 break;
142 }
143 }
144
145 if(!$exists) {
146 $sources[] = array('id' => $blockid, 'source' => array('name' => $source_name, 'url' => $source_url, 'count' => 1));
147 }
148
149 update_option($source_temp_option_name, json_encode($sources));
150 }
151 }
152
153 // Saved source data when post updated
154 public static function get_save_source_data_on_post_update( $source_option_name, $source_temp_option_name ) {
155
156 if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
157 return;
158 }
159 $temp_data = json_decode(get_option($source_temp_option_name), true);
160 $source_data = json_decode(get_option($source_option_name), true);
161 if(!$temp_data) {
162 $temp_data = array();
163 }
164 if(!$source_data) {
165 $source_data = array();
166 }
167
168 $sources = array_merge($temp_data, $source_data);
169
170 $unique_sources = array();
171 foreach ($sources as $source) {
172 $unique_sources[$source['id']] = $source;
173 }
174
175 $unique_sources = array_values($unique_sources);
176
177 delete_option($source_temp_option_name);
178
179 update_option($source_option_name, json_encode($unique_sources));
180 }
181
182 //Delete source data from option table when widget is removed
183 public static function get_delete_source_data($blockid, $source_option_name, $source_temp_option_name) {
184 if (!empty($blockid) && $blockid != 'undefined') {
185 $sources = json_decode(get_option($source_option_name), true);
186 $temp_sources = json_decode(get_option($source_temp_option_name), true);
187 if ($sources) {
188 foreach ($sources as $i => $source) {
189 if ($source['id'] === $blockid) {
190 unset($sources[$i]);
191 break;
192 }
193 }
194 update_option($source_option_name, json_encode(array_values($sources)));
195 }
196 if ($temp_sources) {
197 foreach ($temp_sources as $i => $source) {
198 if ($source['id'] === $blockid) {
199 unset($temp_sources[$i]);
200 break;
201 }
202 }
203 update_option($source_temp_option_name, json_encode(array_values($temp_sources)));
204 }
205 }
206 wp_die();
207 }
208
209 //Delete source temporary data when reload without update or publish
210 public static function get_delete_source_temp_data_on_reload($source_temp_option_name) {
211 $source_temp_data = json_decode(get_option($source_temp_option_name), true);
212 if ($source_temp_data ) {
213 delete_option( $source_temp_option_name );
214 }
215 }
216
217 public static function get_file_title($url){
218 return get_the_title(attachment_url_to_postid( $url ));
219 }
220
221 public static function get_hash(){
222 $hash_key = get_option(EMBEDPRESS_PLG_NAME . '_hash_key');
223 if(!$hash_key){
224 $hash_key = wp_hash_password(wp_generate_password(30));
225 update_option(EMBEDPRESS_PLG_NAME . '_hash_key', $hash_key);
226 }
227 return $hash_key;
228 }
229
230 public function lock_content_form_handler()
231 {
232
233 $client_id = isset($_POST['client_id']) ? $_POST['client_id'] : '';
234 $password = isset($_POST['password']) ? $_POST['password'] : '';
235 $epbase64 = isset($_POST['epbase']) ? $_POST['epbase'] : '';
236 $hash_key = isset($_POST['hash_key']) ? $_POST['hash_key'] : '';
237
238 // Set the decryption key and initialization vector (IV)
239 $key = self::get_hash();
240
241 // Decode the base64 encoded cipher
242 $cipher = base64_decode($epbase64);
243 // Decrypt the cipher using AES-128-CBC encryption
244
245 $wp_pass_key = hash('sha256', wp_salt(32) . md5($password));
246 $iv = substr($wp_pass_key, 0, 16);
247 if ($wp_pass_key === $hash_key) {
248 setcookie("password_correct_", $password, time() + 3600);
249
250 $embed = openssl_decrypt($cipher, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv) . '<script>
251 var now = new Date();
252 var time = now.getTime();
253 var expireTime = time + 1000 * 60 * 60 * 24 * 30;
254 now.setTime(expireTime);
255 document.cookie = "password_correct_' . $client_id . '=' . $hash_key . '; expires=" + now.toUTCString() + "; path=/";
256 </script>';
257 } else {
258 $embed = 0;
259 }
260
261 // Process the form data and return a response
262 $response = array(
263 'success' => true,
264 'password' => $password,
265 'embedHtml' => $embed
266 );
267
268 echo json_encode($response);
269
270 wp_die();
271 }
272
273 public static function display_password_form($client_id='', $embedHtml='', $pass_hash_key='', $attributes = [])
274 {
275 $lock_heading = !empty($attributes['lockHeading']) ? $attributes['lockHeading'] : '';
276 $lock_subheading = !empty($attributes['lockSubHeading']) ? $attributes['lockSubHeading'] : '';
277 $lock_error_message = !empty($attributes['lockErrorMessage']) ? $attributes['lockErrorMessage'] : '';
278 $footer_message = !empty($attributes['footerMessage']) ? $attributes['footerMessage'] : '';
279 $password_placeholder = !empty($attributes['passwordPlaceholder']) ? $attributes['passwordPlaceholder'] : '';
280 $button_text = !empty($attributes['submitButtonText']) ? $attributes['submitButtonText'] : '';
281 $unlocking_text = !empty($attributes['submitUnlockingText']) ? $attributes['submitUnlockingText'] : '';
282 $enable_footer_message = !empty($attributes['enableFooterMessage']) ? $attributes['enableFooterMessage'] : '';
283
284 // Set the encryption key and initialization vector (IV)
285 $key = self::get_hash();
286
287 $salt = wp_salt(32);
288 $wp_hash_key = hash('sha256', $salt . $pass_hash_key);
289 $iv = substr($wp_hash_key, 0, 16);
290
291
292 // Encrypt the plaintext using AES-128-CBC encryption
293 $cipher = openssl_encrypt($embedHtml, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
294
295 // Base64 encode the encrypted cipher
296 $encrypted_data = base64_encode($cipher);
297
298 $lock_icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><g fill="#6354a5" class="color134563 svgShape"><path d="M46.3 28.7h-3v-6.4C43.3 16.1 38.2 11 32 11c-6.2 0-11.3 5.1-11.3 11.3v6.4h-3v-6.4C17.7 14.4 24.1 8 32 8s14.3 6.4 14.3 14.3v6.4" fill="#6354a5" class="color000000 svgShape"></path><path d="M44.8 55.9H19.2c-2.6 0-4.8-2.2-4.8-4.8V31.9c0-2.6 2.2-4.8 4.8-4.8h25.6c2.6 0 4.8 2.2 4.8 4.8v19.2c0 2.7-2.2 4.8-4.8 4.8zM19.2 30.3c-.9 0-1.6.7-1.6 1.6v19.2c0 .9.7 1.6 1.6 1.6h25.6c.9 0 1.6-.7 1.6-1.6V31.9c0-.9-.7-1.6-1.6-1.6H19.2z" fill="#6354a5" class="color000000 svgShape"></path><path d="M35.2 36.7c0 1.8-1.4 3.2-3.2 3.2s-3.2-1.4-3.2-3.2 1.4-3.2 3.2-3.2 3.2 1.5 3.2 3.2" fill="#6354a5" class="color000000 svgShape"></path><path d="M32.8 36.7h-1.6l-1.6 9.6h4.8l-1.6-9.6" fill="#6354a5" class="color000000 svgShape"></path></g></svg>';
299
300 echo '
301 <div class="password-form-container">
302 <h2>'.esc_html( $lock_heading ).'</h2>
303 <p>'.esc_html( $lock_subheading ).' </p>
304 <form class="password-form" method="post" class="password-form" data-unlocking-text="'.esc_attr( $unlocking_text ).'">
305
306 <div class="password-field">
307 <span class="lock-icon">' . $lock_icon . '</span>
308 <input type="password" name="pass_' . esc_attr($client_id) . '" placeholder="' . esc_attr($password_placeholder) . '" required>
309 </div>
310 <input type="hidden" name="ep_client_id" value="' . esc_attr($client_id) . '">
311 <input type="hidden" name="ep_base_' . esc_attr($client_id) . '" value="' . esc_attr($encrypted_data) . '">
312 <input type="hidden" name="hash_key_' . esc_attr($client_id) . '" value="' . esc_attr($wp_hash_key ) . '">
313 <input type="submit" name="password_submit" value="'.esc_attr( $button_text ).'">
314 <div class="error-message hidden">'.esc_html( $lock_error_message ).'</div>
315 </form>
316 ' . ( ! empty( $enable_footer_message ) ? '<p class="need-access-message">' . esc_html( $footer_message ) . '</p>' : '' ) . '
317 </div>
318 ';
319 }
320
321 // Check if the user has already entered the correct password
322 public static function is_password_correct($client_id)
323 {
324 if (isset($_COOKIE['password_correct_' . $client_id])) {
325 return $_COOKIE['password_correct_' . $client_id];
326 } else {
327 return false;
328 }
329 }
330
331 public static function customLogo($embedHTML, $atts){
332 $x = !empty($atts['logoX']) ? $atts['logoX'] : 0;
333 $y = !empty($atts['logoY']) ? $atts['logoY'] : 0;
334 $uniqid = !empty($atts['url'])? '.ose-uid-' . md5($atts['url']): '';
335
336 $brandUrl = !empty($atts['customlogoUrl']) ? $atts['customlogoUrl'] : '';
337 $opacity = !empty($atts['logoOpacity']) ? $atts['logoOpacity'] : '';
338
339 $cssClass = !empty( $atts['url'] ) ? '.ose-uid-' . md5( $atts['url'] ) : '.ose-youtube';
340
341
342
343 ob_start(); ?>
344 <style type="text/css">
345 <?php echo esc_html($cssClass); ?>
346 {
347 position: relative;
348 }
349
350 <?php echo esc_html($cssClass); ?> .watermark {
351 border: 0;
352 position: absolute;
353 bottom: <?php echo esc_html($y); ?>%;
354 right: <?php echo esc_html($x); ?>%;
355 max-width: 150px;
356 max-height: 75px;
357 opacity: 0.25;
358 z-index: 5;
359 -o-transition: opacity 0.5s ease-in-out;
360 -moz-transition: opacity 0.5s ease-in-out;
361 -webkit-transition: opacity 0.5s ease-in-out;
362 transition: opacity 0.5s ease-in-out;
363 opacity: <?php echo esc_html($opacity); ?>;
364 }
365
366 <?php echo esc_html($cssClass); ?>
367 .watermark:hover {
368 opacity: 1;
369 }
370 </style>
371 <?php
372
373
374 $style = ob_get_clean();
375
376 if ( ! class_exists( '\simple_html_dom' ) ) {
377 include_once EMBEDPRESS_PATH_CORE . 'simple_html_dom.php';
378 }
379
380 $cta = '';
381 $img = '';
382
383 if(!empty($atts['customlogo'])){
384 $img = '<img src="'.esc_url($atts['customlogo']).'"/>';
385
386 $imgDom = str_get_html( $img );
387 $imgDom = $imgDom->find( 'img', 0 );
388 $imgDom->setAttribute( 'class', 'watermark ep-custom-logo' );
389 $imgDom->removeAttribute( 'style' );
390 $imgDom->setAttribute( 'width', 'auto' );
391 $imgDom->setAttribute( 'height', 'auto' );
392 ob_start();
393 echo $imgDom;
394
395 $cta .= ob_get_clean();
396
397 $imgDom->clear();
398 unset( $img, $imgDom );
399
400 if ( !empty($brandUrl) ) {
401 $cta = '<a href="'.esc_url($brandUrl).'" target="_blank">'.$cta.'</a>';
402 }
403 $dom = str_get_html( $embedHTML );
404
405 $wrapDiv = $dom->find( $uniqid, 0 );
406
407 if ( ! empty( $wrapDiv ) && is_object( $wrapDiv ) ) {
408 $wrapDiv->innertext .= $cta;
409 }
410
411 ob_start();
412 echo $wrapDiv;
413
414 $markup = ob_get_clean();
415
416 $dom->clear();
417 unset( $dom, $wrapDiv );
418
419 $embedHTML = $style . $markup;
420
421 }
422
423 return $embedHTML;
424
425 }
426
427
428 public static function embed_content_share($content_id='', $attributes = []){
429
430 $share_position = !empty($attributes['sharePosition']) ? $attributes['sharePosition'] : 'right';
431 $custom_thumnail = !empty($attributes['customThumbnail']) ? urlencode($attributes['customThumbnail']) : '';
432 $custom_title = !empty($attributes['customTitle']) ? urlencode($attributes['customTitle']) : '';
433 $custom_description = !empty($attributes['customDescription']) ? urlencode($attributes['customDescription']) : '';
434
435 $page_url = urlencode(get_permalink().'?hash='.$content_id);
436
437 $social_icons = '<div class="ep-social-share-wraper"><div class="ep-social-share share-position-'.esc_attr( $share_position ).'">';
438 $social_icons .= '<a href="https://www.facebook.com/sharer/sharer.php?u=' . $page_url . '" class="ep-social-icon facebook" target="_blank">
439 <svg width="64px" height="64px" fill="#000000" viewBox="0 -6 512 512" xmlns="http://www.w3.org/2000/svg">
440 <path d="M0 0h512v500H0z" fill="#475a96"/>
441 <path d="m375.72 112.55h-237.43c-8.137 0-14.73 6.594-14.73 14.73v237.43c0 8.135 6.594 14.73 14.73 14.73h127.83v-103.36h-34.781v-40.28h34.781v-29.705c0-34.473 21.055-53.244 51.807-53.244 14.73 0 27.391 1.097 31.08 1.587v36.026l-21.328 0.01c-16.725 0-19.963 7.947-19.963 19.609v25.717h39.887l-5.193 40.28h-34.693v103.36h68.012c8.135 0 14.73-6.596 14.73-14.73v-237.43c-1e-3 -8.137-6.596-14.73-14.731-14.73z" fill="#fff"/>
442 </svg>
443 </a>';
444 $social_icons .= '<a href="https://twitter.com/intent/tweet?url=' . $page_url . '&text=' . $custom_title . '" class="ep-social-icon twitter" target="_blank">
445 <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 248 204">
446 <path fill="#ffffff"
447 d="M221.95 51.29c.15 2.17.15 4.34.15 6.53 0 66.73-50.8 143.69-143.69 143.69v-.04c-27.44.04-54.31-7.82-77.41-22.64 3.99.48 8 .72 12.02.73 22.74.02 44.83-7.61 62.72-21.66-21.61-.41-40.56-14.5-47.18-35.07 7.57 1.46 15.37 1.16 22.8-.87-23.56-4.76-40.51-25.46-40.51-49.5v-.64c7.02 3.91 14.88 6.08 22.92 6.32C11.58 63.31 4.74 33.79 18.14 10.71c25.64 31.55 63.47 50.73 104.08 52.76-4.07-17.54 1.49-35.92 14.61-48.25 20.34-19.12 52.33-18.14 71.45 2.19 11.31-2.23 22.15-6.38 32.07-12.26-3.77 11.69-11.66 21.62-22.2 27.93 10.01-1.18 19.79-3.86 29-7.95-6.78 10.16-15.32 19.01-25.2 26.16z" />
448 </svg>
449 </a>';
450 $social_icons .= '<a href="http://pinterest.com/pin/create/button/?url=' . $page_url . '&media=' .$custom_thumnail . '&description=' . $custom_description . '" class="ep-social-icon pinterest" target="_blank">
451
452 <svg xmlns="http://www.w3.org/2000/svg" height="800" width="1200" viewBox="-36.42015 -60.8 315.6413 364.8"><path d="M121.5 0C54.4 0 0 54.4 0 121.5 0 173 32 217 77.2 234.7c-1.1-9.6-2-24.4.4-34.9 2.2-9.5 14.2-60.4 14.2-60.4s-3.6-7.3-3.6-18c0-16.9 9.8-29.5 22-29.5 10.4 0 15.4 7.8 15.4 17.1 0 10.4-6.6 26-10.1 40.5-2.9 12.1 6.1 22 18 22 21.6 0 38.2-22.8 38.2-55.6 0-29.1-20.9-49.4-50.8-49.4-34.6 0-54.9 25.9-54.9 52.7 0 10.4 4 21.6 9 27.7 1 1.2 1.1 2.3.8 3.5-.9 3.8-3 12.1-3.4 13.8-.5 2.2-1.8 2.7-4.1 1.6-15.2-7.1-24.7-29.2-24.7-47.1 0-38.3 27.8-73.5 80.3-73.5 42.1 0 74.9 30 74.9 70.2 0 41.9-26.4 75.6-63 75.6-12.3 0-23.9-6.4-27.8-14 0 0-6.1 23.2-7.6 28.9-2.7 10.6-10.1 23.8-15.1 31.9 11.4 3.5 23.4 5.4 36 5.4 67.1 0 121.5-54.4 121.5-121.5C243 54.4 188.6 0 121.5 0z" fill="#fff"/></svg>
453
454 </a>';
455
456 $social_icons .= '<a href="https://www.linkedin.com/sharing/share-offsite/?url='.$page_url.'&title='.$custom_title.'&summary='.$custom_description.'&source=LinkedIn" class="ep-social-icon linkedin" target="_blank">
457
458 <svg fill="#ffffff" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
459 viewBox="0 0 310 310" xml:space="preserve">
460 <g id="XMLID_801_">
461 <path id="XMLID_802_" d="M72.16,99.73H9.927c-2.762,0-5,2.239-5,5v199.928c0,2.762,2.238,5,5,5H72.16c2.762,0,5-2.238,5-5V104.73
462 C77.16,101.969,74.922,99.73,72.16,99.73z"/>
463 <path id="XMLID_803_" d="M41.066,0.341C18.422,0.341,0,18.743,0,41.362C0,63.991,18.422,82.4,41.066,82.4
464 c22.626,0,41.033-18.41,41.033-41.038C82.1,18.743,63.692,0.341,41.066,0.341z"/>
465 <path id="XMLID_804_" d="M230.454,94.761c-24.995,0-43.472,10.745-54.679,22.954V104.73c0-2.761-2.238-5-5-5h-59.599
466 c-2.762,0-5,2.239-5,5v199.928c0,2.762,2.238,5,5,5h62.097c2.762,0,5-2.238,5-5v-98.918c0-33.333,9.054-46.319,32.29-46.319
467 c25.306,0,27.317,20.818,27.317,48.034v97.204c0,2.762,2.238,5,5,5H305c2.762,0,5-2.238,5-5V194.995
468 C310,145.43,300.549,94.761,230.454,94.761z"/>
469 </g>
470 </svg>
471 </a>';
472 $social_icons .= '</div></div>';
473
474 return $social_icons ;
475 }
476
477
478
479 public static function ep_get_elementor_widget_settings($page_settings = '', $id = '', $widgetType = ''){
480
481 $data = json_decode($page_settings, true);
482
483 // Search for the element with the given ID
484 $element = null;
485 foreach ($data as $section) {
486 foreach ($section['elements'] as $column) {
487 foreach ($column['elements'] as $el) {
488 if ($el['id'] == $id && $el['elType'] == 'widget' && $el['widgetType'] == $widgetType) {
489 $element = $el;
490 break 3;
491 }
492 }
493 }
494 }
495
496 // Output the element code
497 if ($element) {
498 return $element;;
499 }
500
501 }
502
503 public static function ep_get_popup_icon() {
504 $svg = '<div class="ep-doc-popup-icon" ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" xml:space="preserve"><path fill="#fff" d="M5 3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-6l-2-2v8H5V5h8l-2-2H5zm9 0 2.7 2.7-7.5 7.5 1.7 1.7 7.5-7.5L21 10V3h-7z"/><path style="fill:none" d="M0 0h24v24H0z"/></svg></div>';
505
506 return $svg;
507 }
508 public static function ep_get_download_icon() {
509 $svg = '<div class="ep-doc-download-icon" ><svg width="25" height="25" viewBox="0 0 0.6 0.6" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" fill-rule="evenodd" d="M.525.4A.025.025 0 0 1 .55.422v.053A.075.075 0 0 1 .479.55H.125A.075.075 0 0 1 .05.479V.425A.025.025 0 0 1 .1.422v.053A.025.025 0 0 0 .122.5h.353A.025.025 0 0 0 .5.478V.425A.025.025 0 0 1 .525.4ZM.3.05a.025.025 0 0 1 .025.025v.24L.357.283A.025.025 0 0 1 .39.281l.002.002a.025.025 0 0 1 .002.033L.392.318.317.393.316.394.314.395.311.397.308.398.305.399.301.4H.295L.292.399.289.398.287.397.285.395A.025.025 0 0 1 .283.393L.208.318A.025.025 0 0 1 .241.281l.002.002.032.032v-.24A.025.025 0 0 1 .3.05Z"/></svg></div>';
510
511 return $svg;
512 }
513
514 public static function ep_get_print_icon() {
515 $svg = '<div class="ep-doc-print-icon" ><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 24 24">
516 <path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z" fill="#fff"/>
517 </svg></div>';
518
519 return $svg;
520 }
521
522 public static function ep_get_fullscreen_icon() {
523 $svg = '<div class="ep-doc-fullscreen-icon"><svg width="25" height="25" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
524 <path d="m3 15 .117.007a1 1 0 0 1 .876.876L4 16v4h4l.117.007a1 1 0 0 1 0 1.986L8 22H3l-.117-.007a1 1 0 0 1-.876-.876L2 21v-5l.007-.117a1 1 0 0 1 .876-.876L3 15Zm18 0a1 1 0 0 1 .993.883L22 16v5a1 1 0 0 1-.883.993L21 22h-5a1 1 0 0 1-.117-1.993L16 20h4v-4a1 1 0 0 1 .883-.993L21 15ZM8 2a1 1 0 0 1 .117 1.993L8 4H4v4a1 1 0 0 1-.883.993L3 9a1 1 0 0 1-.993-.883L2 8V3a1 1 0 0 1 .883-.993L3 2h5Zm13 0 .117.007a1 1 0 0 1 .876.876L22 3v5l-.007.117a1 1 0 0 1-.876.876L21 9l-.117-.007a1 1 0 0 1-.876-.876L20 8V4h-4l-.117-.007a1 1 0 0 1 0-1.986L16 2h5Z" fill="#fff"/>
525 </svg></div>';
526
527 return $svg;
528 }
529 public static function ep_get_minimize_icon() {
530 $svg = '<div class="ep-doc-minimize-icon" style="display:none"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" style="enable-background:new 0 0 385.331 385.331" xml:space="preserve" width="20" height="20"><path fill="#fff" d="M13.751 8.131h5.62c0.355 0 0.619 -0.28 0.619 -0.634 0 -0.355 -0.265 -0.615 -0.619 -0.614h-4.995V1.878c0 -0.355 -0.27 -0.624 -0.624 -0.624s-0.624 0.27 -0.624 0.624v5.62c0 0.002 0.001 0.003 0.001 0.004 0 0.002 -0.001 0.003 -0.001 0.005 0 0.348 0.276 0.625 0.624 0.624zM6.244 1.259c-0.354 0 -0.614 0.265 -0.614 0.619v4.995H0.624c-0.355 0 -0.624 0.27 -0.624 0.624 0 0.355 0.27 0.624 0.624 0.624h5.62c0.002 0 0.003 -0.001 0.004 -0.001 0.002 0 0.003 0.001 0.005 0.001 0.348 0 0.624 -0.276 0.624 -0.624V1.878c0 -0.354 -0.28 -0.619 -0.634 -0.619zm0.005 10.61H0.629c-0.355 0.001 -0.619 0.28 -0.619 0.634 0 0.355 0.265 0.615 0.619 0.614h4.995v5.005c0 0.355 0.27 0.624 0.624 0.624 0.355 0 0.624 -0.27 0.624 -0.624V12.502c0 -0.002 -0.001 -0.003 -0.001 -0.004 0 -0.002 0.001 -0.003 0.001 -0.005 0 -0.348 -0.276 -0.624 -0.624 -0.624zm13.127 0H13.756c-0.002 0 -0.003 0.001 -0.004 0.001 -0.002 0 -0.003 -0.001 -0.005 -0.001 -0.348 0 -0.624 0.276 -0.624 0.624v5.62c0 0.355 0.28 0.619 0.634 0.619 0.354 0.001 0.614 -0.265 0.614 -0.619v-4.995H19.376c0.355 0 0.624 -0.27 0.624 -0.624s-0.27 -0.624 -0.624 -0.625z"/><g/><g/><g/><g/><g/><g/></svg></div>';
531
532 return $svg;
533 }
534 public static function ep_get_draw_icon() {
535 $svg = '<div class="ep-doc-draw-icon"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m15 7.5 2.5 2.5m-10 10L19.25 8.25c0.69 -0.69 0.69 -1.81 0 -2.5v0c-0.69 -0.69 -1.81 -0.69 -2.5 0L5 17.5V20h2.5Zm0 0h8.379C17.05 20 18 19.05 18 17.879v0c0 -0.563 -0.224 -1.103 -0.621 -1.5L17 16M4.5 5c2 -2 5.5 -1 5.5 1 0 2.5 -6 2.5 -6 5 0 0.876 0.533 1.526 1.226 2" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>';
536
537 return $svg;
538 }
539
540 public static function get_google_presentation_url($embedded_url){
541 $parsed_url = parse_url($embedded_url);
542 $base_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $parsed_url['path'];
543 $base_url = strtok($base_url, '?');
544 $base_url = rtrim($base_url, '/');
545 return $base_url;
546
547 }
548
549 public static function check_media_format($url) {
550 $pattern1 = '/\.(mp4|mov|avi|wmv|flv|mkv|webm|mpeg|mpg)$/i';
551 $pattern2 = '/\.(mp3|wav|ogg|aac)$/i';
552
553 $isVideo = preg_match($pattern1, $url);
554 $isAudio = preg_match($pattern2, $url);
555
556 $is_self_hosted = false;
557 $format = '';
558
559 if (!empty($isVideo) || !empty($isAudio)) {
560 $is_self_hosted = true;
561 if (!empty($isVideo)) {
562 $format = 'video';
563 } else if (!empty($isAudio)) {
564 $format = 'audio';
565 }
566 }
567
568 if (!$is_self_hosted) {
569 return [
570 'selhosted' => false,
571 ];
572 }
573
574 return [
575 'selhosted' => true,
576 'format' => $format,
577 ];
578 }
579
580
581
582
583 }
584
585 ?>
586