&). * @return string */ function et_pb_build_extended_font_icon_value( $icon_value, $icon_type = null, $font_weight = null, $decode_amp = false ) { if ( et_pb_maybe_extended_icon( $icon_value ) ) { return $icon_value; } if ( ! $icon_type ) { $icon_type = 'divi'; } if ( ! $font_weight ) { $font_weight = et_pb_get_normal_font_weight_value(); } if ( et_pb_maybe_old_divi_font_icon( $icon_value, false ) ) { // the font icon value is saved in the following format: %%index_number%%. $icon_index = (int) str_replace( '%', '', $icon_value ); $icon_symbols = et_pb_get_font_icon_symbols(); $icon_value = isset( $icon_symbols[ $icon_index ] ) ? $icon_symbols[ $icon_index ] : ''; } elseif ( et_pb_maybe_old_single_utf_divi_icon( $icon_value ) ) { $index = array_search( $icon_value, et_pb_get_decoded_divi_icons(), true ); $font_icons = et_pb_get_extended_font_icon_symbols(); if ( $index && ! empty( $font_icons[ $index ] ) && ! empty( $font_icons[ $index ]['unicode'] ) ) { $icon_value = $font_icons[ $index ]['unicode']; } } if ( $decode_amp ) { $icon_value = str_replace( '&', '&', $icon_value ); } return $icon_value . '||' . $icon_type . '||' . $font_weight; } } if ( ! function_exists( 'et_pb_get_extended_icon_data' ) ) { /** * Depending on the $icon_data_type, returns string unicode icon value or icon type. * * @since ? * * @param string $icon_data the string value of the icon. * @param string $icon_data_type could be either 'icon_value' or 'icon_type'. * * @return string */ function et_pb_get_extended_icon_data( $icon_data, $icon_data_type ) { if ( et_pb_maybe_extended_icon( $icon_data ) ) { $extended_icon_data = explode( '||', $icon_data ); if ( ! empty( $extended_icon_data ) ) { switch ( $icon_data_type ) { case 'icon_value': return ( ! empty( $extended_icon_data[0] ) ) ? $extended_icon_data[0] : false; case 'icon_type': return ( ! empty( $extended_icon_data[1] ) ) ? $extended_icon_data[1] : false; case 'font_weight': return ( ! empty( $extended_icon_data[2] ) ) ? $extended_icon_data[2] : false; } } } } } if ( ! function_exists( 'et_pb_maybe_extended_icon' ) ) { /** * Checking if the passed icon value is extended icon type ( like a '0||divi' ). * * @since ? * * @param string $icon icon data. * * @return bool */ function et_pb_maybe_extended_icon( $icon ) { return ! empty( $icon ) && false !== strpos( $icon, '||' ); } } if ( ! function_exists( 'et_pb_get_icon_font_family' ) ) { /** * Return CSS font-family property for icon. * * @since ? * * @param string $icon icon data. * * @return string */ function et_pb_get_icon_font_family( $icon ) { return et_pb_maybe_fa_font_icon( $icon ) ? 'FontAwesome' : 'ETmodules'; } } if ( ! function_exists( 'et_pb_get_normal_font_weight_value' ) ) { /** * Return CSS `normal` font-weight value. * * @since ? * * @return int */ function et_pb_get_normal_font_weight_value() { return 400; } } if ( ! function_exists( 'et_pb_get_icon_font_weight' ) ) { /** * Return CSS font-weight property for icon. * * @since ? * * @param string $icon icon data. * * @return int */ function et_pb_get_icon_font_weight( $icon ) { return 900 === (int) et_pb_get_extended_icon_data( $icon, 'font_weight' ) ? 900 : et_pb_get_normal_font_weight_value(); } } if ( ! function_exists( 'et_pb_extended_process_font_icon' ) ) { /** * Return CSS font-family property for icon. * * @since ? * * @param string $icon icon data. * * @return string */ function et_pb_extended_process_font_icon( $icon ) { return et_pb_maybe_extended_icon( $icon ) ? et_pb_get_extended_font_icon_value( $icon, true ) : esc_attr( et_pb_process_font_icon( $icon ) ); } } if ( ! function_exists( 'et_pb_get_extended_icon_value_for_css' ) ) { /** * Getting icon's unicode value from passed icon data and converting the icon value to the CSS-value * for the CSS property 'content:'( for example, '0||divi' will be converted to '"\30"' ). * * @since ? * * @param string $icon_data icon_data. * * @return string */ function et_pb_get_extended_icon_value_for_css( $icon_data ) { $icon_value = et_pb_get_extended_font_icon_value( $icon_data ); $icon_value = strtolower( str_replace( array( '&#x', '&#x' ), '\\', $icon_value ) ); $icon_value = str_replace( ';', '', $icon_value ); return '"' . $icon_value . '"'; } } if ( ! function_exists( 'et_pb_get_social_net_fa_icons' ) ) { /** * List of Social Networks Font Awesome icons. * * @since ? * * @return array */ function et_pb_get_social_net_fa_icons() { return array( 'amazon', 'bandcamp', 'telegram', 'bitbucket', 'behance', 'buffer', 'codepen', 'deviantart', 'flipboard', 'foursquare', 'github', 'goodreads', 'google', 'houzz', 'itunes', 'last_fm', 'line', 'medium', 'meetup', 'odnoklassniki', 'patreon', 'periscope', 'quora', 'researchgate', 'reddit', 'snapchat', 'soundcloud', 'spotify', 'steam', 'tripadvisor', 'tiktok', 'twitch', 'vk', 'weibo', 'whatsapp', 'xing', 'yelp', ); } } if ( ! function_exists( 'et_pb_get_social_net_divi_icons' ) ) { /** * List of Social Networks used in the icons_base_social.scss file. * * @since ? * * @return array */ function et_pb_get_social_net_divi_icons() { return array( 'pinterest', 'linkedin', 'tumblr', 'skype', 'flikr', 'myspace', 'dribbble', 'youtube', 'vimeo', ); } } if ( ! function_exists( 'et_pb_get_decode_extended_font_icon_symbol' ) ) : /** * Returns decoded font icon value. * * @since ? * * @param string $font_icon_value font icon value. * * @return array */ function et_pb_get_decode_extended_font_icon_symbol( $font_icon_value ) { return html_entity_decode( $font_icon_value, ENT_QUOTES, 'UTF-8' ); } endif; if ( ! function_exists( 'et_pb_get_decoded_extended_font_icon_symbols' ) ) : /** * Returns full list of all icons with decoded utf values. * * @since ? * * @return array */ function et_pb_get_decoded_extended_font_icon_symbols() { $cache_key = 'et_pb_get_decoded_extended_font_icon_symbols'; if ( ! et_core_cache_has( $cache_key ) ) { $font_icons = et_pb_get_extended_font_icon_symbols(); foreach ( $font_icons as &$font_icon ) { $font_icon['decoded_unicode'] = et_pb_get_decode_extended_font_icon_symbol( $font_icon['unicode'] ); } et_core_cache_set( $cache_key, $font_icons ); } else { $font_icons = et_core_cache_get( $cache_key ); } return $font_icons; } endif; if ( ! function_exists( 'et_pb_get_decoded_divi_icons' ) ) : /** * Returns Divi icons decoded utf values. * * @since ? * * @return array */ function et_pb_get_decoded_divi_icons() { $cache_key = 'et_pb_get_decoded_divi_icons'; if ( ! et_core_cache_has( $cache_key ) ) { $font_icons = et_pb_get_extended_font_icon_symbols(); $decoded_divi_icons = array(); foreach ( $font_icons as $font_icon ) { if ( ! $font_icon['is_divi_icon'] ) { break; } $decoded_divi_icons[] = et_pb_get_decode_extended_font_icon_symbol( $font_icon['unicode'] ); } et_core_cache_set( $cache_key, $decoded_divi_icons ); } else { $decoded_divi_icons = et_core_cache_get( $cache_key ); } return $decoded_divi_icons; } endif; if ( ! function_exists( 'et_pb_get_font_icon_field_names' ) ) : /** * Returns the list of font icon fields with `select_icon` option. * * @since ? * * @return array */ function et_pb_get_font_icon_field_names() { return array( 'font_icon', 'button_icon', 'hover_icon', 'scroll_down_icon', 'open_toggle_icon', 'toggle_icon', 'button_one_icon', 'button_two_icon', ); } endif; if ( ! function_exists( 'et_pb_get_all_font_icon_option_names_string' ) ) : /** * Returns string with names of all font_icon fields in all responsive, sticky, hover modes separated by '|'. * * @since ? * * @return string */ function et_pb_get_all_font_icon_option_names_string() { $cache_key = 'et_pb_get_font_icon_option_names'; if ( ! et_core_cache_has( $cache_key ) ) { $font_icon_names = array(); foreach ( et_pb_get_font_icon_field_names() as $font_icon_field ) { $font_icon_names[] = $font_icon_field; $font_icon_names[] = $font_icon_field . '_tablet'; $font_icon_names[] = $font_icon_field . '_phone'; $font_icon_names[] = $font_icon_field . et_pb_hover_options()->get_suffix(); $font_icon_names[] = $font_icon_field . et_pb_sticky_options()->get_suffix(); } $font_icon_option_names = implode( '|', $font_icon_names ); et_core_cache_set( $cache_key, $font_icon_option_names ); } else { $font_icon_option_names = et_core_cache_get( $cache_key ); } return $font_icon_option_names; } endif; if ( ! function_exists( 'et_pb_get_font_icon_names_regex' ) ) : /** * Returns the regex that will be used to check containing of the font icon option in the content. * * @since ? * * @param bool $maybe_fa_icon_type define what kind of font icon we need o get regex. * @param bool $use_only_defined_icon_fields values will be searched only in certain fields that can contain icon values (see: `et_pb_get_font_icon_field_names()`). * * @return string */ function et_pb_get_font_icon_names_regex( $maybe_fa_icon_type = false, $use_only_defined_icon_fields = false ) { $icon_type = $maybe_fa_icon_type ? 'fa' : 'divi'; return ! $use_only_defined_icon_fields ? '/\=\"([^"]*)\|\|(' . $icon_type . ')\|\|(400|900)\"/mi' : '/(' . et_pb_get_all_font_icon_option_names_string() . ')\=\"([^"]*)\|\|(' . $icon_type . ')\|\|(400|900)\"/mi'; } endif; if ( ! function_exists( 'et_pb_check_if_post_contains_fa_font_icon' ) ) : /** * Check if post content contains FontAwesome icon. * * @since ? * * @param string $content post's content. * * @return bool */ function et_pb_check_if_post_contains_fa_font_icon( $content ) { return ! empty( preg_match_all( et_pb_get_font_icon_names_regex( true ), $content ) ); } endif; if ( ! function_exists( 'et_pb_check_if_post_contains_divi_font_icon' ) ) : /** * Check if post content contains Divi icon. * * @since ? * * @param string $content post's content. * @param bool $use_only_defined_icon_fields values will be searched only in certain fields that can contain icon values (see: `et_pb_get_font_icon_field_names()`). * * @return bool */ function et_pb_check_if_post_contains_divi_font_icon( $content, $use_only_defined_icon_fields = false ) { // Check the non-extended icon value. $old_divi_icon_regex = ! $use_only_defined_icon_fields ? '/\=\"%%([^"]*)%%\"/mi' : '/(' . et_pb_get_all_font_icon_option_names_string() . ')\=\"%%([^"]*)%%\"/mi'; $single_char_divi_icon_regex = '/(' . et_pb_get_all_font_icon_option_names_string() . ')\=\"[\s\S]\"/miu'; return ! empty( preg_match_all( et_pb_get_font_icon_names_regex(), $content ) ) || ! empty( preg_match_all( $old_divi_icon_regex, $content ) ) || ! empty( preg_match_all( $single_char_divi_icon_regex, $content ) ); } endif; if ( ! function_exists( 'et_pb_check_if_post_contains_network_with_fa_icon' ) ) : /** * Check if post content contains a social network attribute with FA icon. * * @param string $content to search for attribute in. * * @since ? * * @return bool */ function et_pb_check_if_post_contains_network_with_fa_icon( $content ) { $regex = '/social_network\=\"(' . implode( '|', et_pb_get_social_net_fa_icons() ) . ')\"/mi'; return ! empty( preg_match_all( $regex, $content ) ); } endif; if ( ! function_exists( 'et_pb_get_font_icon_modules' ) ) : /** * Returns the list of Divi modules with `select_icon` option. * * @param string $group certain group of modules . * * @since ? * * @return array|null */ function et_pb_get_font_icon_modules( $group = false ) { $font_icon_modules_used_in_migrations = array( 'button' => array( 'et_pb_button', 'et_pb_comments', 'et_pb_contact_form', 'et_pb_cta', 'et_pb_fullwidth_header', 'et_pb_fullwidth_post_slider', 'et_pb_login', 'et_pb_post_slider', 'et_pb_pricing_tables', 'et_pb_pricing_table', 'et_pb_signup', 'et_pb_slider', 'et_pb_slide', 'et_pb_wc_add_to_cart', 'et_pb_wc_cart_notice', ), 'blurb' => array( 'et_pb_blurb', ), 'overlay' => array( 'et_pb_blog', 'et_pb_filterable_portfolio', 'et_pb_fullwidth_image', 'et_pb_fullwidth_portfolio', 'et_pb_gallery', 'et_pb_image', 'et_pb_portfolio', 'et_pb_shop', 'et_pb_wc_related_products', 'et_pb_wc_upsells', ), 'toggle' => array( 'et_pb_toggle', ), ); $other_select_icon_modules = array( 'select_icon' => array( 'et_pb_icon', 'et_pb_video', 'et_pb_video_slider', 'et_pb_video_slider_item', 'et_pb_testimonial', 'et_pb_accordion', 'et_pb_accordion_item', ), ); if ( false === $group ) { // Return all modules that use select_icon. $all_modules = array(); $all_select_icon_modules = array_merge( $font_icon_modules_used_in_migrations, $other_select_icon_modules ); foreach ( $all_select_icon_modules as $select_icon_module ) { $all_modules = array_merge( $all_modules, $select_icon_module ); } return $all_modules; } elseif ( isset( $font_icon_modules_used_in_migrations[ $group ] ) ) { // Return certain modules list by $group flag. return $font_icon_modules_used_in_migrations[ $group ]; } return null; } endif; if ( ! function_exists( 'et_pb_get_extended_font_icon_symbols' ) ) : /** * Returns full list of all icons used in the Divi with ['search_terms'], * unicode icon value ['unicode'], icon name ['name'] * groups in which the icon is included ['styles'], * bool flag which determined is this icon a divi icon or FontAwesome icon['is_divi_icon']. * * @since ? * * @return array */ function et_pb_get_extended_font_icon_symbols() { $cache_key = 'et_pb_get_extended_font_icon_symbols'; if ( ! et_core_cache_has( $cache_key ) ) { $full_icons_list_path = __DIR__ . '/full_icons_list.json'; if ( file_exists( $full_icons_list_path ) ) { // phpcs:disable WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- Can't use wp_remote_get() for local file $icons_data = json_decode( file_get_contents( $full_icons_list_path ), true ); // phpcs:enable if ( JSON_ERROR_NONE === json_last_error() ) { et_core_cache_set( $cache_key, $icons_data ); return $icons_data; } } et_wrong( 'Problem with loading the icon data on this path: ' . $full_icons_list_path ); } else { return et_core_cache_get( $cache_key ); } } endif;