* */ /** * Lytro.com Short Code Attributes Definition * * This helper function returns an array all available * shortcode attributes, their validation method, default * value and more. * * Keys: * validate: a callable function or regular expression used to validate the input * default: default value for shortcode attribute * query_arg: the related lytro query argument name * * @since 4.5.0 */ function jetpack_lytro_shortcode_attributes() { return array( 'username' => array( 'default' => '', ), 'photo' => array( // could be ID or URL, validated separately 'default' => 0, ), 'width' => array( 'validate' => '#^\d+$#', 'default' => 400, ), 'height' => array( 'validate' => '#^\d+$#', 'default' => 415, ), 'show_arrow' => array( 'query_arg' => 'showArrow', 'validate' => '#^(true|false)$#', 'default' => 'true', ), 'show_border' => array( 'query_arg' => 'showBorder', 'validate' => '#^(true|false)$#', 'default' => 'true', ), 'show_first_time_user' => array( 'query_arg' => 'showFTU', 'validate' => '#^(true|false)$#', 'default' => 'true', ), 'allow_full_view' => array( 'query_arg' => 'allowFullView', 'validate' => '#^(true|false)$#', 'default' => 'true', ), 'enable_help' => array( 'query_arg' => 'enableHelp', 'validate' => '#^(true|false)$#', 'default' => 'true', ), 'enable_attribution' => array( 'query_arg' => 'enableAttribution', 'validate' => '#^(true|false)$#', 'default' => 'true', ), 'enable_logo' => array( 'query_arg' => 'enableLogo', 'validate' => '#^(true|false)$#', 'default' => 'true', ), 'enable_fullscreen' => array( 'query_arg' => 'enableFullscreen', 'validate' => '#^(true|false)$#', 'default' => 'true', ), 'enable_play' => array( 'query_arg' => 'enablePlay', 'validate' => '#^(true|false)$#', 'default' => 'true', ), 'bg_color' => array( 'query_arg' => 'bgColor', 'validate' => '/^#(?:[0-9a-fA-F]{3}){1,2}$/', 'default' => '', ), ); } /** * Lytro.com Shortcode * * Allows embedding Lytro "living pictures" using [lytro photo="200"] or * [lytro photo="http://www.lytro.com/..."]. Additional attributes * like show_border, show_arrow, etc have priority over the ones supplied * in the URL. * * @since 4.5.0 * * @param array $atts Shortcode attributes * * @uses jetpack_lytro_shortcode_attributes() * @return string Embed HTML or a */ function jetpack_lytro_shortcode_handler( $atts ) { $defaults = array(); $attributes = jetpack_lytro_shortcode_attributes(); foreach ( $attributes as $key => $attribute ) { if ( isset( $attribute['default'] ) ) { $defaults[$key] = $attribute['default']; } } $atts = shortcode_atts( $defaults, $atts ); // There has to at least be a photo attribute. if ( empty( $atts['photo'] ) ) { return ''; } // The photo attribute might be a URL if ( ! is_numeric( $atts['photo'] ) ) { $atts = array_merge( $atts, jetpack_lytro_shortcode_url_to_atts( $atts['photo'] ) ); } // Validate all attributes by callable function or regular expression. foreach ( $atts as $key => $value ) { $attribute = $attributes[$key]; if ( isset( $attribute['validate'] ) ) { $validate = $attribute['validate']; $valid = is_callable( $validate ) ? call_user_func( $validate, $value ) : preg_match( $validate, $value ); if ( ! $valid ) { $atts[$key] = $defaults[$key]; } } } // The photo attribute might have changed, make sure it's still valid. if ( ! is_numeric( $atts['photo'] ) || ! $atts['photo'] ) { return ''; } // Build a query which is then appended to the iframe src. $query_args = array(); foreach ( $atts as $key => $value ) { $attribute = $attributes[$key]; if ( isset( $attribute['query_arg'] ) && ! empty( $attribute['query_arg'] ) && ! empty( $value ) ) { $query_args[$attribute['query_arg']] = $value; } } if ( ! empty( $atts['username'] ) ) { $src = sprintf( 'https://pictures.lytro.com/%s/pictures/%d/embed', $atts['username'], $atts['photo'] ); } else { $src = sprintf( 'https://pictures.lytro.com/pictures/%d/embed', $atts['photo'] ); } // Add query args and build the iframe. $src = add_query_arg( $query_args, $src ); return ''; } add_shortcode( 'lytro', 'jetpack_lytro_shortcode_handler' ); /** * Lytro Shortcode URL to Shortcode Attributes * * This helper function parses a Lytro.com URL * and returns an attributes array. * * @since 4.5.0 * * @uses jetpack_lytro_shortcode_attributes() */ function jetpack_lytro_shortcode_url_to_atts( $url ) { $attributes = jetpack_lytro_shortcode_attributes(); $atts = array(); $url = str_replace( '&', '&', $url ); if ( preg_match( '#^https?://(www\.)?lytro\.com/living-pictures/([0-9]+)/?#i', $url, $matches ) ) { $atts['photo'] = $matches[2]; } elseif ( preg_match( '#^https?://(www\.)?pictures\.lytro\.com/([^/]+)/pictures/([0-9]+)/?#i', $url, $matches ) ) { $atts['username'] = $matches[2]; $atts['photo'] = $matches[3]; } $url = parse_url( $url ); if ( isset( $url['query'] ) ) { parse_str( $url['query'], $qargs ); // Get the attributes with query_args and fill in the $atts array foreach ( $attributes as $key => $attribute ) { if ( isset( $attribute['query_arg'] ) && in_array( $attribute['query_arg'], array_keys( $qargs ) ) ) { $atts[$key] = $qargs[$attribute['query_arg']]; } } } return $atts; } /** * Lytro Shortcode Reversal * * Example * * * * Converts to: * [lytro photo="202" show_border="true" width="400" height="415"] * * @since 4.5.0 * * @uses jetpack_lytro_shortcode_url_to_atts() * @uses wpcom_shortcodereverse_parseattr() */ function wpcom_shortcodereverse_lytro( $atts ) { $atts = wpcom_shortcodereverse_parseattr( $atts ); $shortcode_atts = array(); // Grab the src URL and convert to shortcode attributes if ( $atts['src'] ) { $shortcode_atts = jetpack_lytro_shortcode_url_to_atts( $atts['src'] ); } // Width and height too if ( $atts['width'] ) { $shortcode_atts['width'] = $atts['width']; } if ( $atts['height'] ) { $shortcode_atts['height'] = $atts['height']; } // Generate the shortcode. $shortcode = ''; foreach ( $shortcode_atts as $key => $value ) { $shortcode .= " $key='" . esc_attr( $value ) . "'"; } $shortcode = "[lytro {$shortcode}]"; return $shortcode; } Filter_Embedded_HTML_Objects::register( '#^https?://(www\.)?lytro\.com/living-pictures/#i', 'wpcom_shortcodereverse_lytro', true ); Filter_Embedded_HTML_Objects::register( '#^https?://(www\.)?pictures\.lytro\.com/([^/]+)/pictures/([0-9]+)/embed#i', 'wpcom_shortcodereverse_lytro', true ); /** * Register Embed Handler * * Registers a WordPress Embed handler to allow embedding * Lytro images by publishing the Lytro URL on a line by itself. * * @since 4.5.0 * * @uses wp_embed_register_handler */ function jetpack_lytro_register_embed_handler() { wp_embed_register_handler( 'lytro', '#^https?://(www\.)?lytro\.com/living-pictures/([0-9]+)/?#i', 'jetpack_lytro_embed_handler' ); wp_embed_register_handler( 'lytro-v2', '#^https?://(www\.)?pictures\.lytro\.com/([^/]+)/pictures/([0-9]+)/?#i', 'jetpack_lytro_embed_handler' ); } add_action( 'init', 'jetpack_lytro_register_embed_handler' ); /** * Lytro Embed Handler * * The embed handler function which converts a Lytro URL * on a line by itself into an embedded Lytro image. * * @since 4.5.0 * * @see jetpack_lytro_register_embed_handler * @uses jetpack_lytro_shortcode_url_to_atts * @uses jetpack_lytro_shortcode_handler */ function jetpack_lytro_embed_handler( $matches, $attr, $url, $rawattr ) { return jetpack_lytro_shortcode_handler( jetpack_lytro_shortcode_url_to_atts( $url ) ); }