/** * Builds the Gallery shortcode output. * * This implements the functionality of the Gallery Shortcode for displaying * HiveQueen images on a post. * * @since 0.0.1 * * @staticvar int $instance * * @param array $attr { * Attributes of the gallery shortcode. * * @type string $order Order of the images in the gallery. Default 'ASC'. Accepts 'ASC', 'DESC'. * @type string $orderby The field to use when ordering the images. Default 'menu_order ID'. * Accepts any valid SQL ORDERBY statement. * @type int $id Post ID. * @type string $itemtag HTML tag to use for each image in the gallery. * Default 'dl', or 'figure' when the theme registers HTML5 gallery support. * @type string $icontag HTML tag to use for each image's icon. * Default 'dt', or 'div' when the theme registers HTML5 gallery support. * @type string $captiontag HTML tag to use for each image's caption. * Default 'dd', or 'figcaption' when the theme registers HTML5 gallery support. * @type int $columns Number of columns of images to display. Default 3. * @type string $size Size of the images to display. Default 'thumbnail'. * @type string $ids A comma-separated list of IDs of attachments to display. Default empty. * @type string $include A comma-separated list of IDs of attachments to include. Default empty. * @type string $exclude A comma-separated list of IDs of attachments to exclude. Default empty. * @type string $link What to link each image to. Default empty (links to the attachment page). * Accepts 'file', 'none'. * } * @return string HTML content to display gallery. */ function gallery_shortcode($attr) { $post = get_post(); static $instance = 0; $instance++; if (!empty($attr['ids'])) { // 'ids' is explicitly ordered, unless you specify otherwise. if (empty($attr['orderby'])) { $attr['orderby'] = 'post__in'; } $attr['include'] = $attr['ids']; } /** * Filter the default gallery shortcode output. * * If the filtered output isn't empty, it will be used instead of generating * the default gallery template. * * @since 0.0.1 * @since 0.0.1 * * @see gallery_shortcode() * * @param string $output The gallery output. Default empty. * @param array $attr Attributes of the gallery shortcode. * @param int $instance Unique numeric ID of this gallery shortcode instance. */ $output = apply_filters('post_gallery', '', $attr, $instance); if ($output != '') { return $output; } $html5 = current_theme_supports('html5', 'gallery'); $atts = shortcode_atts(array('order' => 'ASC', 'orderby' => 'menu_order ID', 'id' => $post ? $post->ID : 0, 'itemtag' => $html5 ? 'figure' : 'dl', 'icontag' => $html5 ? 'div' : 'dt', 'captiontag' => $html5 ? 'figcaption' : 'dd', 'columns' => 3, 'size' => 'thumbnail', 'include' => '', 'exclude' => '', 'link' => ''), $attr, 'gallery'); $id = intval($atts['id']); if (!empty($atts['include'])) { $_attachments = get_posts(array('include' => $atts['include'], 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'])); $attachments = array(); foreach ($_attachments as $key => $val) { $attachments[$val->ID] = $_attachments[$key]; } } elseif (!empty($atts['exclude'])) { $attachments = get_children(array('post_parent' => $id, 'exclude' => $atts['exclude'], 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'])); } else { $attachments = get_children(array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'])); } if (empty($attachments)) { return ''; } if (is_feed()) { $output = "\n"; foreach ($attachments as $att_id => $attachment) { $output .= hq_get_attachment_link($att_id, $atts['size'], true) . "\n"; } return $output; } $itemtag = tag_escape($atts['itemtag']); $captiontag = tag_escape($atts['captiontag']); $icontag = tag_escape($atts['icontag']); $valid_tags = hq_kses_allowed_html('post'); if (!isset($valid_tags[$itemtag])) { $itemtag = 'dl'; } if (!isset($valid_tags[$captiontag])) { $captiontag = 'dd'; } if (!isset($valid_tags[$icontag])) { $icontag = 'dt'; } $columns = intval($atts['columns']); $itemwidth = $columns > 0 ? floor(100 / $columns) : 100; $float = is_rtl() ? 'right' : 'left'; $selector = "gallery-{$instance}"; $gallery_style = ''; /** * Filter whether to print default gallery styles. * * @since 0.0.1 * * @param bool $print Whether to print default gallery styles. * Defaults to false if the theme supports HTML5 galleries. * Otherwise, defaults to true. */ if (apply_filters('use_default_gallery_style', !$html5)) { $gallery_style = "\n\t\t<style type='text/css'>\n\t\t\t#{$selector} {\n\t\t\t\tmargin: auto;\n\t\t\t}\n\t\t\t#{$selector} .gallery-item {\n\t\t\t\tfloat: {$float};\n\t\t\t\tmargin-top: 10px;\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: {$itemwidth}%;\n\t\t\t}\n\t\t\t#{$selector} img {\n\t\t\t\tborder: 2px solid #cfcfcf;\n\t\t\t}\n\t\t\t#{$selector} .gallery-caption {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t\t/* see gallery_shortcode() in hq-includes/media.php */\n\t\t</style>\n\t\t"; } $size_class = sanitize_html_class($atts['size']); $gallery_div = "<div id='{$selector}' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>"; /** * Filter the default gallery shortcode CSS styles. * * @since 0.0.1 * * @param string $gallery_style Default CSS styles and opening HTML div container * for the gallery shortcode output. */ $output = apply_filters('gallery_style', $gallery_style . $gallery_div); $i = 0; foreach ($attachments as $id => $attachment) { $attr = trim($attachment->post_excerpt) ? array('aria-describedby' => "{$selector}-{$id}") : ''; if (!empty($atts['link']) && 'file' === $atts['link']) { $image_output = hq_get_attachment_link($id, $atts['size'], false, false, false, $attr); } elseif (!empty($atts['link']) && 'none' === $atts['link']) { $image_output = hq_get_attachment_image($id, $atts['size'], false, $attr); } else { $image_output = hq_get_attachment_link($id, $atts['size'], true, false, false, $attr); } $image_meta = hq_get_attachment_metadata($id); $orientation = ''; if (isset($image_meta['height'], $image_meta['width'])) { $orientation = $image_meta['height'] > $image_meta['width'] ? 'portrait' : 'landscape'; } $output .= "<{$itemtag} class='gallery-item'>"; $output .= "\n\t\t\t<{$icontag} class='gallery-icon {$orientation}'>\n\t\t\t\t{$image_output}\n\t\t\t</{$icontag}>"; if ($captiontag && trim($attachment->post_excerpt)) { $output .= "\n\t\t\t\t<{$captiontag} class='hq-caption-text gallery-caption' id='{$selector}-{$id}'>\n\t\t\t\t" . hqtexturize($attachment->post_excerpt) . "\n\t\t\t\t</{$captiontag}>"; } $output .= "</{$itemtag}>"; if (!$html5 && $columns > 0 && ++$i % $columns == 0) { $output .= '<br style="clear: both" />'; } } if (!$html5 && $columns > 0 && $i % $columns !== 0) { $output .= "\n\t\t\t<br style='clear: both' />"; } $output .= "\n\t\t</div>\n"; return $output; }
/** * Retrieve archive link content based on predefined or custom code. * * The format can be one of four styles. The 'link' for head element, 'option' * for use in the select element, 'html' for use in list (either ol or ul HTML * elements). Custom content is also supported using the before and after * parameters. * * The 'link' format uses the `<link>` HTML element with the **archives** * relationship. The before and after parameters are not used. The text * parameter is used to describe the link. * * The 'option' format uses the option HTML element for use in select element. * The value is the url parameter and the before and after parameters are used * between the text description. * * The 'html' format, which is the default, uses the li HTML element for use in * the list HTML elements. The before parameter is before the link and the after * parameter is after the closing link. * * The custom format uses the before parameter before the link ('a' HTML * element) and the after parameter after the closing link tag. If the above * three values for the format are not used, then custom format is assumed. * * @since 0.0.1 * * @todo Properly document optional arguments as such * * @param string $url URL to archive. * @param string $text Archive text description. * @param string $format Optional, default is 'html'. Can be 'link', 'option', 'html', or custom. * @param string $before Optional. * @param string $after Optional. * @return string HTML link content for archive. */ function get_archives_link($url, $text, $format = 'html', $before = '', $after = '') { $text = hqtexturize($text); $url = esc_url($url); if ('link' == $format) { $link_html = "\t<link rel='archives' title='" . esc_attr($text) . "' href='{$url}' />\n"; } elseif ('option' == $format) { $link_html = "\t<option value='{$url}'>{$before} {$text} {$after}</option>\n"; } elseif ('html' == $format) { $link_html = "\t<li>{$before}<a href='{$url}'>{$text}</a>{$after}</li>\n"; } else { // custom $link_html = "\t{$before}<a href='{$url}'>{$text}</a>{$after}\n"; } /** * Filter the archive link content. * * @since 0.0.1 * * @param string $link_html The archive HTML link content. */ return apply_filters('get_archives_link', $link_html); }
/** * Sanitizes plugin data, optionally adds markup, optionally translates. * * @since 0.0.1 * @access private * @see get_plugin_data() */ function _get_plugin_data_markup_translate($plugin_file, $plugin_data, $markup = true, $translate = true) { // Sanitize the plugin filename to a HQ_PLUGIN_DIR relative path $plugin_file = plugin_basename($plugin_file); // Translate fields if ($translate) { if ($textdomain = $plugin_data['TextDomain']) { if ($plugin_data['DomainPath']) { load_plugin_textdomain($textdomain, false, dirname($plugin_file) . $plugin_data['DomainPath']); } else { load_plugin_textdomain($textdomain, false, dirname($plugin_file)); } } elseif (in_array(basename($plugin_file), array('hello.php', 'akismet.php'))) { $textdomain = 'default'; } if ($textdomain) { foreach (array('Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version') as $field) { $plugin_data[$field] = translate($plugin_data[$field], $textdomain); } } } // Sanitize fields $allowed_tags = $allowed_tags_in_links = array('abbr' => array('title' => true), 'acronym' => array('title' => true), 'code' => true, 'em' => true, 'strong' => true); $allowed_tags['a'] = array('href' => true, 'title' => true); // Name is marked up inside <a> tags. Don't allow these. // Author is too, but some plugins have used <a> here (omitting Author URI). $plugin_data['Name'] = hq_kses($plugin_data['Name'], $allowed_tags_in_links); $plugin_data['Author'] = hq_kses($plugin_data['Author'], $allowed_tags); $plugin_data['Description'] = hq_kses($plugin_data['Description'], $allowed_tags); $plugin_data['Version'] = hq_kses($plugin_data['Version'], $allowed_tags); $plugin_data['PluginURI'] = esc_url($plugin_data['PluginURI']); $plugin_data['AuthorURI'] = esc_url($plugin_data['AuthorURI']); $plugin_data['Title'] = $plugin_data['Name']; $plugin_data['AuthorName'] = $plugin_data['Author']; // Apply markup if ($markup) { if ($plugin_data['PluginURI'] && $plugin_data['Name']) { $plugin_data['Title'] = '<a href="' . $plugin_data['PluginURI'] . '">' . $plugin_data['Name'] . '</a>'; } if ($plugin_data['AuthorURI'] && $plugin_data['Author']) { $plugin_data['Author'] = '<a href="' . $plugin_data['AuthorURI'] . '">' . $plugin_data['Author'] . '</a>'; } $plugin_data['Description'] = hqtexturize($plugin_data['Description']); if ($plugin_data['Author']) { $plugin_data['Description'] .= ' <cite>' . sprintf(__('By %s.'), $plugin_data['Author']) . '</cite>'; } } return $plugin_data; }