source on its own array key, without adding either * the `width` or `height` attributes, since these are added dynamically, * before rendering the SVG code. * * All icons are assumed to have equal width and height, hence the option * to only specify a `$size` parameter in the svg methods. * * @since 1.0.0 */ class Seedlet_SVG_Icons { /** * Gets the SVG code for a given icon. */ public static function get_svg( $group, $icon, $size ) { if ( 'ui' == $group ) { $arr = self::$ui_icons; } elseif ( 'social' == $group ) { $arr = self::$social_icons; } else { $arr = array(); } if ( array_key_exists( $icon, $arr ) ) { $repl = sprintf( '\s*<', $svg ); // Remove white space between SVG tags. return $svg; } return null; } /** * Detects the social network from a URL and returns the SVG code for its icon. */ public static function get_social_link_svg( $uri, $size ) { static $regex_map; // Only compute regex map once, for performance. if ( ! isset( $regex_map ) ) { $regex_map = array(); $map = &self::$social_icons_map; // Use reference instead of copy, to save memory. foreach ( array_keys( self::$social_icons ) as $icon ) { $domains = array_key_exists( $icon, $map ) ? $map[ $icon ] : array( sprintf( '%s.com', $icon ) ); $domains = array_map( 'trim', $domains ); // Remove leading/trailing spaces, to prevent regex from failing to match. $domains = array_map( 'preg_quote', $domains ); $regex_map[ $icon ] = sprintf( '/(%s)/i', implode( '|', $domains ) ); } } foreach ( $regex_map as $icon => $regex ) { if ( preg_match( $regex, $uri ) ) { return self::get_svg( 'social', $icon, $size ); } } return null; } /** * User Interface icons – svg sources. * * @var array */ static $ui_icons = array( 'calendar' => /* calendar */ '', 'category' => /* category */ '', 'check' => /* check */ '', 'chevron_left' => /* chevron_left */ '', 'chevron_right' => /* chevron_right */ '', 'close' => /* close */ '', 'comment' => /* comment */ '', 'download' => /* download */ '', 'dropdown' => /* dropdown */ '', 'edit' => /* edit */ '', 'link' => /* link */ '', 'menu' => /* menu */ '', 'person' => /* person */ '', 'shopping_cart' => /* shopping_cart */ '', 'tag' => /* tag */ '', ); /** * Social Icons – domain mappings. * * By default, each Icon ID is matched against a .com TLD. To override this behavior, * specify all the domains it covers (including the .com TLD too, if applicable). * * @var array */ static $social_icons_map = array( '500px' => array( '500px.com', ), 'amazon' => array( 'amazon.com', 'amazon.cn', 'amazon.in', 'amazon.fr', 'amazon.de', 'amazon.it', 'amazon.nl', 'amazon.es', 'amazon.co', 'amazon.ca', ), 'apple' => array( 'apple.com', 'itunes.com', ), 'bandcamp' => array( 'bandcamp.com', ), 'behance' => array( 'behance.net', ), 'codepen' => array( 'codepen.io', ), 'deviantart' => array( 'deviantart.com', ), 'digg' => array( 'digg.com', ), 'discord' => array( 'discord.gg', 'discordapp.com', ), 'dribbble' => array( 'dribbble.com', ), 'dropbox' => array( 'dropbox.com', ), 'etsy' => array( 'etsy.com', ), 'eventbrite' => array( 'eventbrite.com', ), 'facebook' => array( 'facebook.com', 'fb.me', ), 'feed' => array( 'feed', ), 'flickr' => array( 'flickr.com', ), 'foursquare' => array( 'foursquare.com', ), 'ghost' => array( 'ghost.org', ), 'github' => array( 'github.com', ), 'google' => array( 'google.com', ), 'google-plus' => array( 'plus.google.com', ), 'goodreads' => array( 'goodreads.com', ), 'instagram' => array( 'instagram.com', ), 'lastfm' => array( 'last.fm', ), 'linkedin' => array( 'linkedin.com', ), 'mail' => array( 'mailto:', ), 'mastodon' => array( 'mastodon.', 'mstdn.', 'counter.social', 'fosstodon.org', 'gc2.jp', 'hachyderm.io', 'infosec.exchange', 'mas.to', 'pawoo.net', ), 'medium' => array( 'medium.com', ), 'meetup' => array( 'meetup.com', ), 'nextdoor' => array( 'nextdoor.com', ), 'patreon' => array( 'patreon.com', ), 'phone' => array( 'tel:', ), 'pinterest' => array( 'pinterest.', ), 'pocket' => array( 'getpocket.com', ), 'ravelry' => array( 'ravelry.com', ), 'reddit' => array( 'reddit.com', ), 'skype' => array( 'skype.com', 'skype:', ), 'slideshare' => array( 'slideshare.net', ), 'snapchat' => array( 'snapchat.com', ), 'soundcloud' => array( 'soundcloud.com', ), 'spotify' => array( 'spotify.com', ), 'stackoverflow' => array( 'stackoverflow.com', ), 'strava' => array( 'strava.com', ), 'stumbleupon' => array( 'stumbleupon.com', ), 'telegram' => array( 'telegram.me', ), 'threads' => array( 'threads.net', ), 'tiktok' => array( 'tiktok.com', ), 'tumblr' => array( 'tumblr.com', ), 'twitch' => array( 'twitch.tv', ), 'twitter' => array( 'twitter.com', 'x.com', ), 'vimeo' => array( 'vimeo.com', ), 'vk' => array( 'vk.com', ), 'whatsapp' => array( 'whatsapp.com', ), 'woocommerce' => array( 'woocommerce.com', ), 'wordpress' => array( 'wordpress.com', 'wordpress.org', ), 'youtube' => array( 'youtube.com', ), 'yelp' => array( 'yelp.com', ), ); /** * Social Icons – svg sources. * * @var array */ static $social_icons = array( '500px' => '', 'amazon' => '', 'apple' => '', 'bandcamp' => '', 'behance' => '', 'chain' => '', 'codepen' => '', 'deviantart' => '', 'digg' => '', 'discord' => '', 'dribbble' => '', 'dropbox' => '', 'etsy' => '', 'eventbrite' => '', 'facebook' => '', 'feed' => '', 'flickr' => '', 'foursquare' => '', 'github' => '', 'goodreads' => ' ', 'instagram' => '', 'lastfm' => '', 'linkedin' => '', 'mail' => '', 'mastodon' => '', 'meetup' => '', 'medium' => '', 'nextdoor' => '', 'patreon' => '', 'pinterest' => '', 'pocket' => '', 'ravelry' => '', 'reddit' => '', 'skype' => '', 'slideshare' => '', 'snapchat' => '', 'soundcloud' => '', 'spotify' => '', 'stackoverflow' => '', 'strava' => '', 'stumbleupon' => '', 'telegram' => '', 'threads' => '', 'tiktok' => '', 'tumblr' => '', 'twitch' => '', 'twitter' => '', 'vimeo' => '', 'vk' => '', 'whatsapp' => '', 'wordpress' => '', 'yelp' => '', 'youtube' => '', 'phone' => '', ); }