''); function __construct(array $info, array $data = NULL) { $this->info = $info; if (isset($data)) { $this->data = $data; } } public function getForm(array $options = array()) { return array(); } public function getValue(array $options = array()) { return tidyValue($this->data['value']); } public function getElement(array $options = array()) { $element = isset($this->info['element']) ? $this->info['element'] : array(); $value = $this->getValue($options); if (strlen($value) === 0) { return array(); } $element += array( '#theme' => 'metatag', '#tag' => 'meta', '#id' => 'metatag_' . $this->info['name'], '#name' => $this->info['name'], '#value' => $value, ); // Add header information if desired. if (!empty($this->info['header'])) { $element['#attached']['drupal_add_http_header'][] = array($this->info['header'], $value); } return array( '#attached' => array('drupal_add_html_head' => array(array($element, $element['#id']))), ); } /** * Remove unwanted formatting from a meta tag. * * @param $value string * The meta tag value to be tidied up. * * @return string * The meta tag value after it has been tidied up. */ public function tidyValue($value) { // Convert any HTML entities into regular characters. $value = decode_entities($value); // Remove any HTML code that might have been included. $value = strip_tags($value); // Strip errant whitespace. $value = str_replace(array("\r\n", "\n", "\r", "\t"), ' ', $value); $value = str_replace(' ', ' ', $value); $value = str_replace(' ', ' ', $value); $value = trim($value); return $value; } } /** * Text-based meta tag controller. */ class DrupalTextMetaTag extends DrupalDefaultMetaTag { public function getForm(array $options = array()) { $options += array( 'token types' => array(), ); $form['value'] = isset($this->info['form']) ? $this->info['form'] : array(); $form['value'] += array( '#type' => 'textfield', '#title' => $this->info['label'], '#description' => !empty($this->info['description']) ? $this->info['description'] : '', '#default_value' => isset($this->data['value']) ? $this->data['value'] : '', '#element_validate' => array('token_element_validate'), '#token_types' => $options['token types'], '#maxlength' => 1024, ); return $form; } public function getValue(array $options = array()) { $options += array( 'instance' => '', 'token data' => array(), 'clear' => TRUE, 'sanitize' => TRUE, 'raw' => FALSE, ); $name = "metatag:" . $options["instance"] . ":" . $this->info["name"]; $value = metatag_translate($name, $this->data['value']); if (empty($options['raw'])) { // Give other modules the opportunity to use hook_metatag_pattern_alter() // to modify defined token patterns and values before replacement. drupal_alter('metatag_pattern', $value, $options['token data']); $value = token_replace($value, $options['token data'], $options); } return $this->tidyValue($value); } } /** * Link type meta tag controller. */ class DrupalLinkMetaTag extends DrupalTextMetaTag { public function getElement(array $options = array()) { $element = isset($this->info['element']) ? $this->info['element'] : array(); $value = $this->getValue($options); if (strlen($value) === 0) { return array(); } $element += array( '#theme' => 'metatag_link_rel', '#tag' => 'link', '#id' => 'metatag_' . $this->info['name'], '#name' => $this->info['name'], '#value' => $value, ); if (!isset($this->info['header']) || !empty($this->info['header'])) { // Also send the generator in the HTTP header. // @todo This does not support 'rev' or alternate link headers. $element['#attached']['drupal_add_http_header'][] = array('Link', '<' . check_plain($value) . '>;' . drupal_http_header_attributes(array('rel' => $element['#name'])), TRUE); } return array( '#attached' => array('drupal_add_html_head' => array(array($element, $element['#id']))), ); } } /** * Title meta tag controller. * * This extends DrupalTextMetaTag as we need to alter variables in * template_preprocess_html() rather output a normal meta tag. */ class DrupalTitleMetaTag extends DrupalTextMetaTag { public function getElement(array $options = array()) { $element = array(); $value = check_plain($this->getValue($options)); $element['#attached']['metatag_set_preprocess_variable'][] = array('html', 'head_title', $value); $element['#attached']['metatag_set_preprocess_variable'][] = array('html', 'head_array', array('title' => $value)); return $element; } } /** * Multiple value meta tag controller. */ class DrupalListMetaTag extends DrupalDefaultMetaTag { function __construct(array $info, array $data = NULL) { // Ensure that the $data['value] argument is an array. if (empty($data['value'])) { $data['value'] = array(); } $data['value'] = (array) $data['value']; parent::__construct($info, $data); } public function getForm(array $options = array()) { $form['value'] = isset($this->info['form']) ? $this->info['form'] : array(); $form['value'] += array( '#type' => 'checkboxes', '#title' => $this->info['label'], '#description' => !empty($this->info['description']) ? $this->info['description'] : '', '#default_value' => isset($this->data['value']) ? $this->data['value'] : array(), ); return $form; } public function getValue(array $options = array()) { $values = array_keys(array_filter($this->data['value'])); sort($values); $value = implode(', ', $values); return $this->tidyValue($value); } } /** * Date interval meta tag controller. */ class DrupalDateIntervalMetaTag extends DrupalDefaultMetaTag { public function getForm(array $options = array()) { $form['value'] = array( '#type' => 'textfield', '#title' => t('@title interval', array('@title' => $this->info['label'])), '#default_value' => isset($this->data['value']) ? $this->data['value'] : '', '#element_validate' => array('element_validate_integer_positive'), '#maxlength' => 4, '#description' => isset($this->info['description']) ? $this->info['description'] : '', ); $form['period'] = array( '#type' => 'select', '#title' => t('@title interval type', array('@title' => $this->info['label'])), '#default_value' => isset($this->data['period']) ? $this->data['period'] : '', '#options' => array( '' => t('- none -'), 'day' => t('Day(s)'), 'week' => t('Week(s)'), 'month' => t('Month(s)'), 'year' => t('Year(s)'), ), ); return $form; } public function getValue(array $options = array()) { $value = ''; if (!empty($this->data['value'])) { $interval = intval($this->data['value']); if (!empty($interval) && !empty($this->data['period'])) { $period = $this->data['period']; $value = format_plural($interval, '@count ' . $period, '@count ' . $period . 's'); } } return $value; } }