static fn() => current_user_can( 'edit_posts' ),
'callback' => static fn( WP_REST_Request $request ): array => get_icon_data( $request ),
'methods' => WP_REST_Server::READABLE,
[
'args' => [
'sets' => [
'required' => false,
'type' => 'string',
],
'set' => [
'required' => false,
'type' => 'string',
],
],
],
]
);
}
/**
* Description of expected behavior.
*
* @since 1.0.0
*
* @return array
*/
function get_icon_sets(): array {
return apply_filters(
'blockify_icon_sets',
[
'social' => DIR . 'assets/svg/social',
'wordpress' => DIR . 'assets/svg/wordpress',
]
);
}
/**
* Returns icon data for rest endpoint
*
* @since 0.4.8
*
* @param WP_REST_Request $request Request object.
*
* @return mixed array|string
*/
function get_icon_data( WP_REST_Request $request ) {
$icon_data = [];
$icon_sets = get_icon_sets();
foreach ( $icon_sets as $icon_set => $set_dir ) {
$icons = glob( $set_dir . '/*.svg' );
foreach ( $icons as $icon ) {
$name = basename( $icon, '.svg' );
$icon = file_get_contents( $icon );
if ( $icon_set === 'WordPress' ) {
$icon = str_replace(
[ 'fill="none"' ],
[ 'fill="currentColor"' ],
$icon
);
}
// Remove comments.
$icon = preg_replace( '//', '', $icon );
$icon_data[ $icon_set ][ $name ] = trim( $icon );
}
}
if ( $request->get_param( 'set' ) ) {
$set = $request->get_param( 'set' );
if ( $request->get_param( 'icon' ) ) {
// TODO: Is string being used anywhere?
return $icon_data[ $set ][ $request->get_param( 'icon' ) ];
}
return $icon_data[ $set ];
}
if ( $request->get_param( 'sets' ) ) {
return array_keys( $icon_data );
}
return $icon_data;
}
/**
* Renders image icon styles on front end.
*
* @since 0.2.0
*
* @param string $content Block HTML.
* @param array $block Block data.
*
* @return string
*/
function get_icon_html( string $content, array $block ): string {
$content = ! $content ? '
' : $content;
$dom = dom( $content );
$figure = get_dom_element( 'figure', $dom );
$img = get_dom_element( 'img', $figure );
if ( ! $figure || ! $img ) {
return $content;
}
$link = get_dom_element( 'a', $figure );
$span = change_tag_name( $img, 'span' );
$classes = explode( ' ', $figure->getAttribute( 'class' ) );
$styles = css_string_to_array( $figure->getAttribute( 'style' ) );
$classes = array_diff( $classes, [ 'wp-block-image', 'is-style-icon' ] );
// phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled
$icon_set = $block['attrs']['iconSet'] ?? 'wordpress';
$icon_name = $block['attrs']['iconName'] ?? 'star-empty';
$classes = [
'wp-block-image__icon',
'blockify-icon',
'blockify-icon-' . $icon_set . '-' . $icon_name,
...$classes,
];
$color = $styles['----wp--custom--icon--color'] ?? 'currentColor';
if ( $color && $color !== 'currentColor' ) {
$styles['--wp--custom--icon--color'] = $color;
}
unset( $styles['--wp--custom--icon--url'] );
$aria_label = $img->getAttribute( 'alt' ) ? $img->getAttribute( 'alt' ) : str_replace( '-', ' ', $icon_name ) . __( ' icon', 'blockify' );
$span->setAttribute( 'class', implode( ' ', $classes ) );
if ( $styles ) {
$span->setAttribute( 'style', css_array_to_string( $styles ) );
}
$span->setAttribute( 'aria-label', $aria_label );
$span->removeAttribute( 'src' );
$span->removeAttribute( 'alt' );
$figure->setAttribute( 'class', 'wp-block-image is-style-icon' );
$figure->setAttribute( 'style', '' );
if ( $link ) {
$link->appendChild( $span );
} else {
$figure->appendChild( $span );
}
$svg_string = $block['attrs']['iconSvgString'] ?? get_icon( $icon_set, $icon_name );
if ( ! $svg_string ) {
$svg_string = get_icon( $icon_set, $icon_name );
}
$css = <<saveHTML();
}
/**
* Returns array of all registered icons.
*
* @since 1.0.0
*
* @return array
*/
function get_icons(): array {
$icons = [];
$icon_sets = get_icon_sets();
foreach ( $icon_sets as $icon_set => $dir ) {
$icons[ $icon_set ] = [];
foreach ( glob( $dir . '/*.svg' ) as $file ) {
$icons[ $icon_set ][ basename( $file, '.svg' ) ] = trim( file_get_contents( $file ) );
}
}
return $icons;
}
/**
* Returns svg string for given icon.
*
* @since 1.0.0
*
* @param string $set Icon set.
* @param string $name Icon name.
*
* @return string
*/
function get_icon( string $set, string $name ): string {
return get_icons()[ $set ][ $name ] ?? '';
}