*/ private const DASHICON_OPTIONS = [ ['value' => '...'], ]; /** * Legacy FA values to keep existing setups compatible. * * @var array */ private const FA_LEGACY_OPTIONS = [ ['value' => 'fa fa-'], ]; /** * @return array */ public static function get_options_for_react(): array { $options = array_merge(self::DASHICON_OPTIONS, self::FA_LEGACY_OPTIONS); /** * Filter icon options passed to React admin. * * @param array $options */ return apply_filters('ipscmi_order_cart_icon_options', $options); } /** * Normalize raw icon values to a stable class format. * * - dashicons: "dashicons dashicons-foo" * - font awesome: "fa fa-bar" (or existing fa style family) * * @param mixed $raw */ public static function normalize_icon_class($raw): string { if (is_array($raw)) { $raw = ''; } $raw = trim(sanitize_text_field((string) $raw)); if ('' === $raw) { return ''; } $tokens = preg_split('/\s+/', $raw); if (! is_array($tokens)) { $tokens = []; } $tokens = array_values( array_filter( array_map( static function ($token) { return is_string($token) ? trim($token) : ''; }, $tokens ) ) ); $dashicon = self::extract_dashicons_slug($tokens, $raw); if ('' !== $dashicon) { return 'dashicons ' . $dashicon; } $fa_icon = self::extract_fa_icon($tokens, $raw); if ('' !== $fa_icon) { $style = self::extract_fa_style($tokens); return trim($style . ' ' . $fa_icon); } $safe = []; foreach ($tokens as $token) { $token = sanitize_html_class($token); if ('' !== $token) { $safe[$token] = true; } } return implode(' ', array_keys($safe)); } /** * @param array $tokens */ private static function extract_dashicons_slug(array $tokens, string $raw): string { foreach ($tokens as $token) { if (0 === strpos($token, 'dashicons-')) { return sanitize_html_class($token); } } if (0 === strpos($raw, 'dashicons-')) { return sanitize_html_class($raw); } return ''; } /** * @param array $tokens */ private static function extract_fa_icon(array $tokens, string $raw): string { foreach ($tokens as $token) { if (0 === strpos($token, 'fa-')) { return sanitize_html_class(strtolower($token)); } } if (preg_match('/^fa-[a-z0-9-]+$/i', $raw)) { return sanitize_html_class(strtolower($raw)); } if (preg_match('/^[a-z0-9-]+$/i', $raw)) { return sanitize_html_class('fa-' . strtolower($raw)); } return ''; } /** * @param array $tokens */ private static function extract_fa_style(array $tokens): string { $styles = ['fa', 'fas', 'far', 'fab', 'fal', 'fad', 'fa-solid', 'fa-regular', 'fa-brands']; foreach ($tokens as $token) { if (in_array($token, $styles, true)) { return $token; } } return 'fa'; } }