*
*/
/**
* 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 ) );
}