array(
'title' => t('Administer Pictures'),
'description' => t('Administer Pictures'),
),
);
}
/**
* Implements hook_menu().
*/
function picture_menu() {
$items = array();
$items['admin/config/media/picture'] = array(
'title' => 'Picture',
'description' => 'Manage Pictures',
'page callback' => 'drupal_get_form',
'page arguments' => array('picture_admin_breakpoints'),
'access arguments' => array('administer pictures'),
'file' => 'picture.admin.inc',
);
$items['admin/config/media/picture/groups'] = array(
'title' => 'Groups',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 10,
);
$items['admin/config/media/picture/settings'] = array(
'title' => 'Settings',
'type' => MENU_LOCAL_TASK,
'weight' => 20,
'description' => 'Pictures settings',
'page callback' => 'drupal_get_form',
'page arguments' => array('picture_admin_settings'),
'access arguments' => array('administer pictures'),
'file' => 'picture.admin.inc',
);
$items['admin/config/media/picture/groups/global'] = array(
'title' => 'Map breakpoints and image styles',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -1,
);
$items['admin/config/media/picture/groups/import'] = array(
'title' => 'Import mappings',
'page arguments' => array('picture_admin_import_form'),
'type' => MENU_LOCAL_TASK,
'access arguments' => array('administer pictures'),
'file' => 'picture.admin.inc',
'weight' => 999,
);
$breakpoint_groups = breakpoints_breakpoint_group_load_all();
foreach ($breakpoint_groups as $breakpoint_group_name => $breakpoint_group) {
if (!empty($breakpoint_group->machine_name)) {
$items['admin/config/media/picture/groups/' . $breakpoint_group->machine_name] = array(
'title' => $breakpoint_group->name,
'page arguments' => array('picture_admin_breakpoints', $breakpoint_group->machine_name),
'type' => MENU_LOCAL_TASK,
'access arguments' => array('administer pictures'),
'file' => 'picture.admin.inc',
'weight' => 15,
);
$items['admin/config/media/picture/groups/' . $breakpoint_group->machine_name . '/export'] = array(
'title' => 'Export ' . check_plain($breakpoint_group->name) . ' mappings',
'page callback' => 'drupal_get_form',
'page arguments' => array('picture_admin_export_form', $breakpoint_group->machine_name),
'type' => MENU_LOCAL_ACTION,
'access arguments' => array('administer pictures', $breakpoint_group->machine_name),
'access callback' => 'picture_mappings_export_access',
'file' => 'picture.admin.inc',
'weight' => 15,
);
}
}
$items['admin/config/media/picture/ckeditor'] = array(
'title' => 'CKEditor',
'type' => MENU_LOCAL_TASK,
'description' => 'Choose picture groups to present in the CKEditor image dialog',
'page callback' => 'drupal_get_form',
'page arguments' => array('picture_ckeditor_settings'),
'access arguments' => array('administer pictures'),
'file' => 'picture.admin.inc',
'weight' => 0,
);
return $items;
}
/**
* Access callback.
*/
function picture_mappings_export_access($perm, $mapping_name) {
return picture_mapping_load($mapping_name) && user_access($perm);
}
/**
* Load mappings.
*/
function picture_mapping_load($name = NULL) {
ctools_include('export');
if ($name) {
$mappings = ctools_export_load_object('picture_mapping', 'names', array($name));
$mapping = isset($mappings[$name]) ? $mappings[$name] : FALSE;
return $mapping;
}
return ctools_export_load_object('picture_mapping');
}
/**
* Load all mappings.
*/
function picture_mapping_load_all() {
ctools_include('export');
return ctools_export_load_object('picture_mapping');
}
/**
* Save mappings.
*/
function picture_mapping_save(&$mapping) {
ctools_include('export');
$update = isset($mapping->id) ? array('id') : array();
return drupal_write_record('picture_mapping', $mapping, $update);
}
/**
* Implements hook_library().
*/
function picture_library() {
$libraries = array();
switch (variable_get('picture_implementation', PICTURE_IMPLEMENTATION_DEFAULT)) {
case PICTURE_IMPLEMENTATION_PICTUREFILL2:
$libraries['picturefill'] = array(
'title' => t('Picturefill'),
'website' => 'https://github.com/scottjehl/picturefill',
'version' => '2.0',
'js' => array(
drupal_get_path('module', 'picture') . '/picturefill2/picturefill.js' => array(
'type' => 'file',
'weight' => -10,
'group' => JS_DEFAULT,
'scope' => 'footer',
'need_jquery' => FALSE,
),
),
);
break;
case PICTURE_IMPLEMENTATION_PICTUREFILL:
$libraries['matchmedia'] = array(
'title' => t('Matchmedia'),
'website' => 'https://github.com/attiks/picturefill-proposal',
'version' => '0.1',
'js' => array(
drupal_get_path('module', 'picture') . '/picturefill/matchmedia.js' => array(
'type' => 'file',
'weight' => -10,
'group' => JS_DEFAULT,
'scope' => 'footer',
'need_jquery' => FALSE,
),
),
);
$libraries['picturefill'] = array(
'title' => t('Picturefill'),
'website' => 'https://github.com/attiks/picturefill-proposal',
'version' => '0.1',
'js' => array(
drupal_get_path('module', 'picture') . '/picturefill/picturefill.js' => array(
'type' => 'file',
'weight' => -10,
'group' => JS_DEFAULT,
'scope' => 'footer',
'need_jquery' => FALSE,
),
),
);
$libraries['picture.ajax'] = array(
'title' => t('Ajax support for picture'),
'version' => VERSION,
'js' => array(
drupal_get_path('module', 'picture') . '/picture.js' => array(
'type' => 'file',
'weight' => -10,
'group' => JS_DEFAULT,
'scope' => 'footer',
'need_jquery' => FALSE,
),
),
);
break;
case PICTURE_IMPLEMENTATION_WEBLINC:
$libraries['matchmedia'] = array(
'title' => t('Matchmedia'),
'website' => 'https://github.com/weblinc/media-match',
'version' => '0.1',
'js' => array(
drupal_get_path('module', 'picture') . '/weblinc/media.js' => array(
'type' => 'file',
'weight' => -10,
'group' => JS_DEFAULT,
'scope' => 'footer',
'need_jquery' => FALSE,
),
drupal_get_path('module', 'picture') . '/weblinc/media.extension.js' => array(
'type' => 'file',
'weight' => -10,
'group' => JS_DEFAULT,
'scope' => 'footer',
'need_jquery' => FALSE,
),
),
'css' => array(
drupal_get_path('module', 'picture') . '/weblinc/media.css' => array('type' => 'file'),
),
);
$libraries['picturefill'] = array(
'title' => t('Picturefill'),
'website' => 'https://github.com/weblinc/picture',
'version' => '0.1',
'js' => array(
drupal_get_path('module', 'picture') . '/weblinc/picture.js' => array(
'type' => 'file',
'weight' => -10,
'group' => JS_DEFAULT,
'scope' => 'footer',
'need_jquery' => FALSE,
),
),
);
$libraries['picture.ajax'] = array(
'title' => t('Ajax support for picture'),
'version' => VERSION,
'js' => array(
drupal_get_path('module', 'picture') . '/picture.weblinc.js' => array(
'type' => 'file',
'weight' => -10,
'group' => JS_DEFAULT,
'scope' => 'footer',
'need_jquery' => FALSE,
),
),
'css' => array(
drupal_get_path('module', 'picture') . '/picture.weblinc.css' => array('type' => 'file'),
),
);
break;
}
return $libraries;
}
/**
* Empty picture object.
*/
function picture_empty_object() {
return (object)picture_empty_array();
}
/**
* Empty picture array.
*/
function picture_empty_array() {
return array(
'machine_name' => '',
'breakpoint_group' => '',
'mapping' => array(),
);
}
/**
* Validate mappings.
*/
function picture_mapping_validate($mapping) {
if (!is_object($mapping)) {
return FALSE;
}
foreach (array('machine_name', 'breakpoint_group', 'mapping') as $property) {
if (!property_exists($mapping, $property)) {
return FALSE;
}
}
return TRUE;
}
/**
* Implements hook_theme().
*/
function picture_theme() {
return array(
'picture' => array(
'variables' => array(
'style_name' => NULL,
'path' => NULL,
'uri' => NULL,
'width' => NULL,
'height' => NULL,
'alt' => '',
'title' => NULL,
'attributes' => array(),
'breakpoints' => array(),
),
),
'picture_formatter' => array(
'variables' => array(
'item' => NULL,
'path' => NULL,
'image_style' => NULL,
'attributes' => array(),
'breakpoints' => array(),
),
),
'picture_formatter_colorbox' => array(
'variables' => array(
'item' => NULL,
'path' => NULL,
'image_style' => NULL,
'breakpoints' => array(),
'colorbox_group' => array(),
'colorbox_image_style' => NULL,
'colorbox_group_id' => NULL,
'colorbox_caption' => NULL,
),
),
'picture_source' => array(
'variables' => array(
'src' => NULL,
'dimension' => NULL,
'media' => NULL,
),
),
);
}
/**
* Implements hook_field_formatter_info().
*/
function picture_field_formatter_info() {
$formatters = array(
'picture' => array(
'label' => t('Picture'),
'field types' => array('image'),
'settings' => array(
'picture_group' => '',
'fallback_image_style' => '',
'image_link' => '',
'colorbox_settings' => array(
'colorbox_group' => '',
'colorbox_gallery' => 'post',
'colorbox_gallery_custom' => '',
'colorbox_caption' => 'auto',
'colorbox_caption_custom' => '',
'colorbox_multivalue_index' => NULL,
),
),
),
);
return $formatters;
}
/**
* Implements hook_field_formatter_settings_form().
*/
function picture_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
$display = $instance['display'][$view_mode];
$settings = $display['settings'];
$options = picture_get_mapping_options();
if ($options) {
$element['picture_group'] = array(
'#title' => t('Picture group'),
'#type' => 'select',
'#default_value' => $settings['picture_group'],
'#required' => TRUE,
'#options' => $options,
);
}
// No picture mappings.
else {
$element['picture_group'] = array(
'#title' => t('Picture group'),
'#type' => 'item',
'#markup' => t(
'There are no picture groups defined. !create_link.',
array('!create_link' => l(t('Create a picture group'), 'admin/config/media/picture'))
)
);
}
$image_styles = image_style_options(FALSE);
$element['fallback_image_style'] = array(
'#title' => t('Fallback image style'),
'#type' => 'select',
'#default_value' => $settings['fallback_image_style'],
'#empty_option' => t('Automatic'),
'#options' => $image_styles,
);
$link_types = picture_link_types($instance);
$element['image_link'] = array(
'#title' => t('Link image to'),
'#type' => 'select',
'#default_value' => $settings['image_link'],
'#empty_option' => t('Nothing'),
'#options' => $link_types,
'#attributes' => array(
'class' => array('picture-image-link'),
),
);
// Settings for the colorbox option.
$element['colorbox_settings'] = array(
'#type' => 'fieldset',
'#tree' => TRUE,
'#title' => t('Colorbox settings'),
'#collapsed' => FALSE,
'#collapsible' => TRUE,
'#states' => array(
'visible' => array(
':input[name$="[settings][image_link]"].picture-image-link' => array('value' => 'colorbox'),
),
),
);
$element['colorbox_settings']['colorbox_group'] = array(
'#title' => t('Colorbox group'),
'#type' => 'select',
'#default_value' => $settings['colorbox_settings']['colorbox_group'],
'#required' => FALSE,
'#options' => picture_get_mapping_options(),
);
$gallery = array(
'post' => t('Per post gallery'),
'page' => t('Per page gallery'),
'field_post' => t('Per field in post gallery'),
'field_page' => t('Per field in page gallery'),
'custom' => t('Custom'),
'none' => t('No gallery'),
);
$element['colorbox_settings']['colorbox_gallery'] = array(
'#title' => t('Gallery (image grouping)'),
'#type' => 'select',
'#default_value' => $settings['colorbox_settings']['colorbox_gallery'],
'#options' => $gallery,
'#description' => t('How Colorbox should group the image galleries.'),
'#attributes' => array(
'class' => array('picture-colorbox-gallery'),
),
);
$element['colorbox_settings']['colorbox_gallery_custom'] = array(
'#title' => t('Custom gallery'),
'#type' => 'textfield',
'#maxlength' => 32,
'#default_value' => $settings['colorbox_settings']['colorbox_gallery_custom'],
'#description' => t('All images on a page with the same gallery value (rel attribute) will be grouped together. It must only contain lowercase letters, numbers, hyphen and underscores.'),
'#element_validate' => array('colorbox_gallery_custom_validate'),
'#required' => FALSE,
'#states' => array(
'visible' => array(
':input[name$="[settings][colorbox_settings][colorbox_gallery]"].picture-colorbox-gallery' => array('value' => 'custom'),
),
),
);
$caption = array(
'auto' => t('Automatic'),
'title' => t('Title text'),
'alt' => t('Alt text'),
'node_title' => t('Content title'),
'custom' => t('Custom (with tokens)'),
'none' => t('None'),
);
$element['colorbox_settings']['colorbox_caption'] = array(
'#title' => t('Caption'),
'#type' => 'select',
'#default_value' => $settings['colorbox_settings']['colorbox_caption'],
'#options' => $caption,
'#description' => t('Automatic will use the first none empty value of the title, the alt text and the content title.'),
'#attributes' => array(
'class' => array('picture-colorbox-caption'),
),
);
$element['colorbox_settings']['colorbox_caption_custom'] = array(
'#title' => t('Custom caption'),
'#type' => 'textfield',
'#default_value' => $settings['colorbox_settings']['colorbox_caption_custom'],
'#states' => array(
'visible' => array(
':input[name$="[settings][colorbox_settings][colorbox_caption]"].picture-colorbox-caption' => array('value' => 'custom'),
),
),
);
// Allow users to hide or set a custom recursion limit.
// The module token_tweaks sets a global recursion limit that can not be bypassed.
if (module_exists('token') && $recursion_limit = min(variable_get('token_tree_recursion_limit', 3), variable_get('colorbox_token_recursion_limit', 3))) {
$element['colorbox_settings']['colorbox_token'] = array(
'#type' => 'fieldset',
'#title' => t('Replacement patterns'),
'#theme' => 'token_tree',
'#token_types' => array($instance['entity_type'], 'file'),
'#recursion_limit' => $recursion_limit,
'#dialog' => TRUE,
'#states' => array(
'visible' => array(
':input[name$="[settings][colorbox_settings][colorbox_caption]"].picture-colorbox-caption' => array('value' => 'custom'),
),
),
);
}
else {
$element['colorbox_settings']['colorbox_token'] = array(
'#type' => 'fieldset',
'#title' => t('Replacement patterns'),
'#description' => '' . t('For token support the token module must be installed.', array('@token_url' => 'http://drupal.org/project/token')) . '',
'#states' => array(
'visible' => array(
':input[name$="[settings][colorbox_settings][colorbox_caption]"].picture-colorbox-caption' => array('value' => 'custom'),
),
),
);
}
return $element;
}
/**
* Returns a list of picture mappings for use in a select list.
*/
function picture_get_mapping_options() {
$picture_mapping_options = array();
$picture_mappings = picture_mapping_load_all();
if ($picture_mappings && !empty($picture_mappings)) {
foreach ($picture_mappings as $machine_name => $picture_mapping) {
$breakpoint_group = breakpoints_breakpoint_group_load($picture_mapping->breakpoint_group);
if ($breakpoint_group) {
$picture_mapping_options[$machine_name] = $breakpoint_group->name;
}
}
}
return $picture_mapping_options;
}
/**
* Implements hook_field_formatter_settings_summary().
*/
function picture_field_formatter_settings_summary($field, $instance, $view_mode) {
$display = $instance['display'][$view_mode];
$settings = $display['settings'];
$summary = array();
if (isset($settings['picture_group']) && !empty($settings['picture_group'])) {
$picture_mapping = picture_mapping_load($settings['picture_group']);
$breakpoint_group = breakpoints_breakpoint_group_load($picture_mapping->breakpoint_group);
if ($breakpoint_group) {
$summary[] = t('Picture group: @picture_group', array('@picture_group' => $breakpoint_group->name));
}
else {
$summary[] = t("Picture group doesn't exists");
}
}
else {
$summary[] = t("You have to select a mapping first.");
}
$image_styles = image_style_options(FALSE);
unset($image_styles['']);
if (isset($image_styles[$settings['fallback_image_style']])) {
$summary[] = t('Fallback Image style: @style', array('@style' => $image_styles[$settings['fallback_image_style']]));
}
else {
$summary[] = t('Automatic fallback');
}
$link_types = picture_link_types($instance);
// Display this setting only if image is linked.
if (isset($link_types[$settings['image_link']])) {
$summary[] = filter_xss_admin($link_types[$settings['image_link']]);
}
// Display the settings for the colorbox if chosen.
if ($settings['image_link'] == 'colorbox') {
$summary[] = t('Colorbox Group: @setting', array('@setting' => $settings['colorbox_settings']['colorbox_group']));
$gallery = array(
'post' => t('Per post gallery'),
'page' => t('Per page gallery'),
'field_post' => t('Per field in post gallery'),
'field_page' => t('Per field in page gallery'),
'custom' => t('Custom'),
'none' => t('No gallery'),
);
$summary[] = t('Colorbox Gallery: @setting', array('@setting' => $gallery[$settings['colorbox_settings']['colorbox_gallery']]));
if ($settings['colorbox_settings']['colorbox_gallery'] == 'custom') {
$summary[] = '→ ' . t('Colorbox Gallery Custom: @setting', array('@setting' => $settings['colorbox_settings']['colorbox_gallery_custom']));
}
$caption = array(
'auto' => t('Automatic'),
'title' => t('Title text'),
'alt' => t('Alt text'),
'node_title' => t('Content title'),
'custom' => t('Custom (with tokens)'),
'none' => t('None'),
);
$summary[] = t('Colorbox Caption: @setting', array('@setting' => $caption[$settings['colorbox_settings']['colorbox_caption']]));
if ($settings['colorbox_settings']['colorbox_caption'] == 'custom') {
$summary[] = '→ ' . t('Colorbox Caption Custom: @setting', array('@setting' => $settings['colorbox_settings']['colorbox_caption_custom']));
}
}
return implode('
', $summary);
}
/**
* Implements hook_field_formatter_view().
*/
function picture_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
$element = array();
// Check if the formatter involves a link.
$image_link = $display['settings']['image_link'];
if ($image_link == 'content') {
$uri = entity_uri($entity_type, $entity);
}
elseif ($image_link == 'file') {
$link_file = TRUE;
}
elseif ($image_link) {
if (isset($entity->$image_link)) {
// Support for field translations.
$language = field_language($entity_type, $entity, $field['field_name']);
$link_field = $entity->$image_link;
if (isset($link_field[$language])) {
$link_values = $link_field[$language];
}
}
}
$fallback_image_style = '';
$mappings = picture_mapping_load($display['settings']['picture_group']);
$breakpoint_styles = picture_get_mapping_breakpoints($mappings, $fallback_image_style);
if (isset($display['settings']['fallback_image_style']) && !empty($display['settings']['fallback_image_style'])) {
$fallback_image_style = $display['settings']['fallback_image_style'];
}
// Assume regular display.
$formatter = 'picture_formatter';
$colorbox_breakpoints = array();
$colorbox_fallback_image_style = '';
// Check for colorbox link.
if (module_exists('colorbox') && $display['settings']['image_link'] == 'colorbox') {
$formatter = 'picture_formatter_colorbox';
$mappings = picture_mapping_load($display['settings']['colorbox_settings']['colorbox_group']);
$colorbox_breakpoints = picture_get_mapping_breakpoints($mappings, $colorbox_fallback_image_style);
}
foreach ($items as $delta => $item) {
if (isset($link_file)) {
$uri = array(
'path' => file_create_url($item['uri']),
'options' => array(),
);
}
// Handle multiple link with image values.
if (isset($link_values)) {
if (isset($link_values[$delta]['url'])) {
$uri = array(
'path' => $link_values[$delta]['url'],
'options' => array('attributes' => $link_values[$delta]['attributes']),
);
// Handle query fragment if there is any.
if (!empty($link_values[$delta]['query'])) {
$uri['options']['query'] = $link_values[$delta]['query'];
}
}
// If there are more image values than link values unset the link.
else {
unset($uri);
}
}
$element[$delta] = array(
'#theme' => $formatter,
'#attached' => array('library' => array(
array('picture', 'matchmedia'),
array('picture', 'picturefill'),
array('picture', 'picture.ajax'),
)),
'#item' => $item,
'#image_style' => $fallback_image_style,
'#breakpoints' => $breakpoint_styles,
'#path' => isset($uri) ? $uri : '',
'#colorbox_group' => $colorbox_breakpoints,
'#colorbox_image_style' => $colorbox_fallback_image_style,
);
// Add css and js for colorbox.
if ($formatter == 'picture_formatter_colorbox') {
$element[$delta]['#attached']['css'][drupal_get_path('module', 'picture') . '/picture_colorbox.css'] = array('type' => 'file');
$element[$delta]['#attached']['js'][drupal_get_path('module', 'picture') . '/picture_colorbox.js'] = array('type' => 'file');
if (!variable_get('colorbox_inline', 0)) {
$element[$delta]['#attached']['js'][drupal_get_path('module', 'colorbox') . '/js/colorbox_inline.js'] = array('type' => 'file');
}
$colorbox_settings = $display['settings']['colorbox_settings'];
// Add the group ID.
list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
$entity_id = !empty($id) ? $entity_type . '-' . $id : 'entity-id';
// If this is a file entity field check for the referencing entity to do
// the proper grouping.
if (isset($entity->referencing_entity) && isset($entity->referencing_field)) {
// Because we don't have the entity type we use some "magic" to get a
// unique entity identifier.
$entity_id = spl_object_hash($entity->referencing_entity);
$colorbox_group_field = $entity->referencing_field;
}
else {
$colorbox_group_field = $field['field_name'];
}
switch ($colorbox_settings['colorbox_gallery']) {
case 'post':
$gallery_id = 'gallery-' . $entity_id;
break;
case 'page':
$gallery_id = 'gallery-all';
break;
case 'field_post':
$gallery_id = 'gallery-' . $entity_id . '-' . $colorbox_group_field;
break;
case 'field_page':
$gallery_id = 'gallery-' . $colorbox_group_field;
break;
case 'custom':
$gallery_id = $colorbox_settings['colorbox_gallery_custom'];
break;
default:
$gallery_id = '';
}
$element[$delta]['#colorbox_group_id'] = $gallery_id;
// Add the caption.
$entity_title = entity_label($entity_type, $entity);
switch ($colorbox_settings['colorbox_caption']) {
case 'auto':
// If the title is empty use alt or the entity title in that order.
if (!empty($item['title'])) {
$caption = $item['title'];
}
elseif (!empty($item['alt'])) {
$caption = $item['alt'];
}
elseif (!empty($entity_title)) {
$caption = $entity_title;
}
else {
$caption = '';
}
break;
case 'title':
$caption = $item['title'];
break;
case 'alt':
$caption = $item['alt'];
break;
case 'node_title':
$caption = $entity_title;
break;
case 'custom':
$caption = token_replace($colorbox_settings['colorbox_caption_custom'], array($entity_type => $entity, 'file' => (object) $item), array('clear' => TRUE));
break;
default:
$caption = '';
}
// Shorten the caption for the example styles or when caption shortening
// is active.
$colorbox_style = variable_get('colorbox_style', 'default');
$trim_length = variable_get('colorbox_caption_trim_length', 75);
if (((strpos($colorbox_style, 'colorbox/example') !== FALSE) || variable_get('colorbox_caption_trim', 0)) && (drupal_strlen($caption) > $trim_length)) {
$caption = drupal_substr($caption, 0, $trim_length - 5) . '...';
}
$element[$delta]['#colorbox_caption'] = $caption;
}
}
return $element;
}
/**
* Theme picture.
*/
function theme_picture_formatter($variables) {
if (!isset($variables['breakpoints']) || empty($variables['breakpoints'])) {
return theme('image_formatter', $variables);
}
$item = $variables['item'];
// Do not output an empty 'title' attribute.
if (isset($item['title']) && drupal_strlen($item['title']) == 0) {
unset($item['title']);
}
$item['style_name'] = $variables['image_style'];
$item['breakpoints'] = $variables['breakpoints'];
$item['attributes'] = $variables['attributes'];
if (!isset($item['path']) && isset($variables['uri'])) {
$item['path'] = $variables['uri'];
}
$output = theme('picture', $item);
if (is_array($variables['path']) && isset($variables['path']['path'])) {
$path = $variables['path']['path'];
$options = isset($variables['path']['options']) ? $variables['path']['options'] : array();
$options['html'] = TRUE;
$output = l($output, $path, $options);
}
return $output;
}
/**
* Theme function to add support for colorbox.
*/
function theme_picture_formatter_colorbox($variables) {
if (!isset($variables['breakpoints']) || empty($variables['breakpoints'])) {
return theme('image_formatter', $variables);
}
$item = $variables['item'];
// Do not output an empty 'title' attribute.
if (isset($item['title']) && drupal_strlen($item['title']) == 0) {
unset($item['title']);
}
$item['style_name'] = $variables['image_style'];
$item['breakpoints'] = $variables['breakpoints'];
if (!isset($item['path']) && isset($variables['uri'])) {
$item['path'] = $variables['uri'];
}
$output = theme('picture', $item);
if (isset($variables['colorbox_group'])) {
$item['breakpoints'] = $variables['colorbox_group'];
$item['style_name'] = $variables['colorbox_image_style'];
$id = 'picture-colorbox-' . user_password();
$colorbox = '