/**
  * Implements Drupal\field\Plugin\Type\Formatter\FormatterInterface::viewElements().
  *
  *
  * Useful values:
  *
  *   $entity->date_id
  *     If set, this will show only an individual date on a field with
  *     multiple dates. The value should be a string that contains
  *     the following values, separated with periods:
  *     - module name of the module adding the item
  *     - node nid
  *     - field name
  *     - delta value of the field to be displayed
  *     - other information the module's custom theme might need
  *
  *     Used by the calendar module and available for other uses.
  *     example: 'date:217:field_date:3:test'
  *
  *   $entity->date_repeat_show
  *     If true, tells the theme to show all the computed values
  *     of a repeating date. If not true or not set, only the
  *     start date and the repeat rule will be displayed.
  */
 public function viewElements(EntityInterface $entity, $langcode, array $items)
 {
     $field = $this->field;
     $instance = $this->instance;
     $settings = $this->settings;
     $view_mode = $this->viewMode;
     $weight = $this->weight;
     $label = $this->label;
     $definition = $this->getDefinition();
     $formatter = $definition['id'];
     $elements = array();
     $variables = array('entity' => $entity, 'field' => $field, 'instance' => $instance, 'langcode' => $langcode, 'items' => $items, 'dates' => array(), 'attributes' => array(), 'rdf_mapping' => array(), 'add_rdf' => module_exists('rdf'));
     // If there is an RDf mapping for this date field, pass it down to the theme.
     $rdf_mapping = array();
     if (!empty($entity->rdf_mapping) && function_exists('rdf_rdfa_attributes')) {
         if (!empty($entity->rdf_mapping[$field['field_name']])) {
             $variables['rdf_mapping'] = $rdf_mapping = $entity->rdf_mapping[$field['field_name']];
         }
     }
     // Give other modules a chance to prepare the entity before formatting it.
     drupal_alter('date_formatter_pre_view', $entity, $variables);
     // See if we are only supposed to display a selected
     // item from multiple value date fields.
     $selected_deltas = array();
     if (!empty($entity->date_id)) {
         foreach ((array) $entity->date_id as $key => $id) {
             list($module, $nid, $field_name, $selected_delta, $other) = explode('.', $id . '.');
             if ($field_name == $field['field_name']) {
                 $selected_deltas[] = $selected_delta;
             }
         }
     }
     foreach ($items as $delta => $item) {
         if (!empty($entity->date_id) && !in_array($delta, $selected_deltas)) {
             continue;
         } else {
             $variables['delta'] = $delta;
             $variables['item'] = $item;
             $variables['dates'] = date_formatter_process($formatter, $entity, $field, $instance, $langcode, $item, $settings);
             $variables['attributes'] = !empty($rdf_mapping) ? rdf_rdfa_attributes($rdf_mapping, $item['value']) : array();
             $output = theme('date_display_combination', $variables);
             if (!empty($output)) {
                 $elements[$delta] = array('#markup' => $output);
             }
         }
     }
     return $elements;
 }
 /**
  * Helper function to test attribute generation.
  *
  * @param array $expected_attributes
  *   The expected return of rdf_rdfa_attributes.
  * @param array $field_mapping
  *   The field mapping to merge into the RDF mapping config.
  * @param mixed $data
  *   The data to pass into the datatype callback, if specified.
  */
 protected function _testAttributes($expected_attributes, $field_mapping, $data = NULL)
 {
     $mapping = rdf_get_mapping('node', 'article')->setFieldMapping('field_test', $field_mapping)->getPreparedFieldMapping('field_test');
     $attributes = rdf_rdfa_attributes($mapping, $data);
     ksort($expected_attributes);
     ksort($attributes);
     $this->assertEqual($expected_attributes, $attributes);
 }