', $close = '' ) { if ( ! $class ) { return; } if ( is_array( $class ) ) { // First HTML class will become context for the element. $context = array_shift( $class ); // Remaining classes will simply be added to the element. $classes = join( ' ', array_map( 'esc_attr', $class ) ); } else { $context = $class; $classes = ''; } $hook = str_replace( '-', '_', $context ); /** * Filter array of all supplied callable functions for this context. * * @since 1.0.0 * * @param arrray $callbacks Array of callback functions (may be with args). */ $callbacks = apply_filters( "bayleaf_markup_{$hook}", $callbacks ); printf( $open, bayleaf_get_attr( $context, [ 'class' => $classes ] ) ); // WPCS xss ok. Contains HTML, other values escaped. foreach ( $callbacks as $callback ) { $callback = (array) $callback; $function = array_shift( $callback ); if ( is_callable( $function ) ) { call_user_func_array( $function, $callback ); } } echo $close; // WPCS xss ok. Contains HTML. } /** * Outputs an HTML element's attributes. * * The purposes of this is to provide a way to hook into the attributes for specific * HTML elements and create new or modify existing attributes, without modifying actual * markup templates. * * @since 1.0.0 * * @param str $slug The slug/ID of the element (e.g., 'sidebar'). * @param array $attr Array of attributes to pass in (overwrites filters). */ function bayleaf_attr( $slug, $attr = [] ) { echo bayleaf_get_attr( $slug, $attr ); // WPCS xss ok. Values escaped by called function. } /** * Gets an HTML element's attributes. * * This code is inspired (but totally modified) from Stargazer WordPress Theme, * Copyright 2013 – 2018 Justin Tadlock. Stargazer is distributed * under the terms of the GNU GPL. * * @since 1.0.0 * * @param str $slug The slug/ID of the element (e.g., 'sidebar'). * @param array $attr Array of attributes to pass in (overwrites filters). * @return string */ function bayleaf_get_attr( $slug, $attr = [] ) { if ( ! $slug ) { return ''; } $out = ''; if ( false !== $attr ) { if ( isset( $attr['class'] ) ) { $attr['class'] .= ' ' . $slug; } else { $attr['class'] = $slug; } } $hook = str_replace( '-', '_', $slug ); /** * Filter element's attributes. * * @since 1.0.0 */ $attr = apply_filters( "bayleaf_get_attr_{$hook}", $attr, $slug ); if ( $attr ) { foreach ( $attr as $name => $value ) { $out .= sprintf( ' %s="%s"', esc_html( $name ), esc_attr( $value ) ); } } return $out; } /** * Output a font icon. * * @since 1.0.0 * * @param array $args Parameters needed to display a font icon. */ function bayleaf_icon( $args = [] ) { $icon_markup = bayleaf_get_icon( $args ); if ( $icon_markup ) { echo $icon_markup; // WPCS xss ok. Contains HTML, Other values escaped. } } /** * Return font icon SVG markup. * * This function incorporates code from Twenty Seventeen WordPress Theme, * Copyright 2016-2017 WordPress.org. Twenty Seventeen is distributed * under the terms of the GNU GPL. * * @param array $args { * Parameters needed to display an SVG. * * @type string $icon Required SVG icon filename. * @type string $title Optional SVG title. * @type string $desc Optional SVG description. * } * @return string Font icon SVG markup. */ function bayleaf_get_icon( $args = [] ) { // Make sure $args are an array. if ( empty( $args ) ) { return esc_html__( 'Please define default parameters in the form of an array.', 'bayleaf' ); } // Define an icon. if ( false === array_key_exists( 'icon', $args ) ) { return esc_html__( 'Please define an SVG icon filename.', 'bayleaf' ); } // Set defaults. $defaults = [ 'icon' => '', 'title' => '', 'desc' => '', 'fallback' => false, ]; // Parse args. $args = wp_parse_args( $args, $defaults ); // Set aria hidden. $aria_hidden = ' aria-hidden="true"'; // Set ARIA. $aria_labelledby = ''; /* * Bayleaf doesn't use the SVG title or description attributes; non-decorative icons are * described with .screen-reader-text. However, child themes can use the title and description * to add information to non-decorative SVG icons to improve accessibility. * * Example 1 with title: 'arrow-right', 'title' => __( 'This is the title', 'textdomain' ) ] ); ?> * * Example 2 with title and description: 'arrow-right', 'title' => __( 'This is the title', 'textdomain' ), 'desc' => __( 'This is the description', 'textdomain' ) ] ); ?> * * See https://www.paciellogroup.com/blog/2013/12/using-aria-enhance-svg-accessibility/. */ if ( $args['title'] ) { $aria_hidden = ''; $unique_id = uniqid(); $aria_labelledby = ' aria-labelledby="title-' . $unique_id . '"'; if ( $args['desc'] ) { $aria_labelledby = ' aria-labelledby="title-' . $unique_id . ' desc-' . $unique_id . '"'; } } // Begin SVG markup. $svg = ''; // Display the title. if ( $args['title'] ) { $svg .= '' . esc_html( $args['title'] ) . ''; // Display the desc only if the title is already set. if ( $args['desc'] ) { $svg .= '' . esc_html( $args['desc'] ) . ''; } } /* * Display the icon. * * The whitespace around `` is intentional - it is a work around to a keyboard navigation bug in Safari 10. * * See https://core.trac.wordpress.org/ticket/38387. */ $svg .= ' '; // Add some markup to use as a fallback for browsers that do not support SVGs. if ( $args['fallback'] ) { $svg .= ''; } $svg .= ''; return $svg; } /** * Get navigation menu markup. * * Create navigation menu markup based on arguments provided. * * @since 1.0.0 * * @param string $nav_id Menu container ID. * @param string $label Menu label. * @param array $args Additional wp_nav_menu args. */ function bayleaf_nav_menu( $nav_id, $label, $args = [] ) { $menu = sprintf( '

%s

', esc_html( $label ) ); $menu .= wp_nav_menu( array_merge( $args, [ 'echo' => false ] ) ); printf( '', esc_attr( $nav_id ), esc_attr( $nav_id ), esc_attr( $label ), $menu ); // WPCS xss ok. $menu contains HTML, variable values escaped properly. } /** * Get widget markup. * * Create widget markup based on arguments provided. * * @since 1.0.0 * * @param string $id Widget ID. * @param string $class Widget HTML class. * @param string $label Widget label. * @param string $widget Registered sidebar to be displayed. * @param bool $aside Aside or Article. */ function bayleaf_widgets( $id, $class, $label, $widget = 'sidebar', $aside = true ) { // Return if no ID. if ( ! $id ) { return; } // Short circuit filter. $check = apply_filters( "bayleaf_widgets_{$id}", false, $widget ); if ( false !== $check ) { return; } // Return if sidebar is not in use. if ( ! is_active_sidebar( $widget ) ) { return; } ?>
> 0x10 ); $rgb_array['green'] = 0xFF & ( $color_val >> 0x8 ); $rgb_array['blue'] = 0xFF & $color_val; } elseif ( 3 === strlen( $hex_color ) ) { $rgb_array['red'] = hexdec( str_repeat( substr( $hex_color, 0, 1 ), 2 ) ); $rgb_array['green'] = hexdec( str_repeat( substr( $hex_color, 1, 1 ), 2 ) ); $rgb_array['blue'] = hexdec( str_repeat( substr( $hex_color, 2, 1 ), 2 ) ); } else { return false; // Invalid hex color code. } return $as_string ? implode( $sep, $rgb_array ) : $rgb_array; }