nodewords_tokens.module in Nodewords: D6 Meta Tags 6.2
Implement tokens that can be used to set the content of meta tags.
File
nodewords_tokens/nodewords_tokens.moduleView source
<?php
define('NODEWORDS_DESCRIPTION_GENERATION_BODY', 1);
define('NODEWORDS_DESCRIPTION_GENERATION_TEASER', 2);
define('NODEWORDS_DESCRIPTION_GENERATION_TEASER_BODY', 3);
/**
* @file
* Implement tokens that can be used to set the content of meta tags.
*/
/**
* Implements hook_form_FORM_ID_alter().
*/
function nodewords_tokens_form_nodewords_admin_settings_form_alter(&$form, $form_state) {
$form['tokens_generation'] = array(
'#type' => 'fieldset',
'#title' => t('Tokens generation options'),
'#description' => t('These options change the way tokens are generated.'),
'#collapsible' => TRUE,
'#weight' => 8,
'#group' => 'nodewords',
);
$form['tokens_generation']['description'] = array(
'#type' => 'fieldset',
'#title' => t('Token %token options', array(
'%token' => 'metatags-description',
)),
'#collapsible' => TRUE,
);
$form['tokens_generation']['description']['nodewords_use_alt_attribute'] = array(
'#type' => 'checkbox',
'#title' => t('Replace the tag IMG content with the attribute ALT'),
'#default_value' => variable_get('nodewords_use_alt_attribute', TRUE),
);
$options = array(
'imagebrowser' => 'imagebrowser.module',
'img_assist' => 'img_assist.module',
);
$form['tokens_generation']['description']['nodewords_filter_modules_output'] = array(
'#type' => 'checkboxes',
'#title' => t('Filter the text added by third-party modules in the node teaser'),
'#options' => $options,
'#default_value' => variable_get('nodewords_filter_modules_output', array()),
'#checkall' => TRUE,
);
$form['tokens_generation']['description']['nodewords_filter_regexp'] = array(
'#type' => 'textarea',
'#title' => t('Custom regular expression'),
'#description' => t('A regular expression used to filter the text added in the node teaser from a third-party module. The regular expression uses the <a href="http://www.php.net/manual/en/pcre.pattern.php">Perl compatible</a> syntax.'),
'#element_validate' => array(
'nodewords_tokens_filter_regex_validate',
),
'#default_value' => variable_get('nodewords_filter_regexp', ''),
'#wysiwyg' => FALSE,
);
$options = array(
NODEWORDS_DESCRIPTION_GENERATION_BODY => t('Generate the token from the node body'),
NODEWORDS_DESCRIPTION_GENERATION_TEASER => t('Generate the token from the node teaser'),
NODEWORDS_DESCRIPTION_GENERATION_TEASER_BODY => t('Generate the token from the node teaser, or the node body when the node teaser is empty'),
);
$form['tokens_generation']['description']['nodewords_description_generation_source'] = array(
'#type' => 'radios',
'#title' => t('Generation source'),
'#options' => $options,
'#default_value' => variable_get('nodewords_description_generation_source', NODEWORDS_DESCRIPTION_GENERATION_TEASER),
);
$form['tokens_generation']['taxonomy_keywords'] = array(
'#type' => 'fieldset',
'#title' => t('Token %token options', array(
'%token' => 'metatags-taxonomy-keywords',
)),
'#collapsible' => TRUE,
);
if (module_exists('taxonomy')) {
$options = array();
foreach (taxonomy_get_vocabularies() as $vocabulary) {
$options[$vocabulary->vid] = check_plain($vocabulary->name);
}
if ($count = count($options)) {
$form['tokens_generation']['taxonomy_keywords']['nodewords_keyword_vids'] = array(
'#type' => $count > 10 ? 'select' : 'checkboxes',
'#title' => t('Auto-keywords vocabularies'),
'#description' => t('Select the vocabularies which contain terms you want to add to the content of the token %token.', array(
'%token' => 'metatags-taxonomy-keywords',
)),
'#default_value' => variable_get('nodewords_keyword_vids', array()),
'#options' => $options,
);
if ($count > 10) {
$form['tokens_generation']['taxonomy_keywords']['nodewords_keyword_vids']['#multiple'] = TRUE;
}
elseif ($count > 2) {
// Add support for Check All if the checkboxes are more than two.
$form['tokens_generation']['taxonomy_keywords']['nodewords_keyword_vids']['#checkall'] = TRUE;
}
}
}
if (empty($options)) {
$form['tokens_generation']['taxonomy_keywords']['nodewords_keyword_vids'] = array(
'#type' => 'value',
'#default_value' => variable_get('nodewords_keyword_vids', array()),
);
$form['tokens_generation']['taxonomy_keywords']['taxonomy_message'] = array(
'#value' => module_exists('taxonomy') ? t('There are no vocabularies currently defined.') : t('The module %module is not enabled; if you want to use taxonomy terms to automatically set the content of the meta tag KEYWORDS, you first need to <a href="@modules-page">enable %module</a>', array(
'%module' => 'taxonomy.module',
'@modules-page' => url('admin/build/modules'),
)),
'#prefix' => '<div class="messages">',
'#suffix' => '</div>',
);
}
$form['tokens_generation']['global_keywords'] = array(
'#type' => 'fieldset',
'#title' => t('Global keywords token options'),
'#collapsible' => TRUE,
);
$form['tokens_generation']['global_keywords']['nodewords_global_keywords_1'] = array(
'#type' => 'textfield',
'#title' => t('Global keywords - first group'),
'#description' => t('Enter a comma separated list of keywords. Avoid duplication of words as this will lower your search engine ranking.'),
'#default_value' => variable_get('nodewords_global_keywords_1', ''),
'#size' => 60,
);
$form['tokens_generation']['global_keywords']['nodewords_global_keywords_2'] = array(
'#type' => 'textfield',
'#title' => t('Global keywords - second group'),
'#description' => t('Enter a comma separated list of keywords. Avoid duplication of words as this will lower your search engine ranking.'),
'#default_value' => variable_get('nodewords_global_keywords_2', ''),
'#size' => 60,
);
}
/**
* Function to validate the regular expression.
*
*/
function nodewords_tokens_filter_regex_validate($element, &$form_state) {
if (!empty($element['#value'])) {
$value = trim($element['#value']);
if (empty($value)) {
form_error($element, t('The regular expression contains only spaces, and other not printable characters.'));
}
}
}
/**
* Implements hook_token_list().
*/
function nodewords_tokens_token_list($type = 'all') {
$tokens = array();
if ($type == 'all' || $type == 'global') {
$tokens['global']['metatags-global-keywords-1'] = t('The global keywords.');
$tokens['global']['metatags-global-keywords-2'] = t('The global keywords.');
$tokens['global']['metatags-global-keywords-1-raw'] = t('The raw global keywords.');
$tokens['global']['metatags-global-keywords-2-raw'] = t('The raw global keywords.');
}
if ($type == 'all' || $type == 'node') {
$tokens['node']['metatags-description'] = t('The node description generated from the node body, or the node teaser.');
$tokens['node']['metatags-description-raw'] = t('The node description generated from the node body, or the node teaser. WARNING - raw user input.');
$tokens['node']['metatags-taxonomy-keywords'] = t('The node keywords generated from the taxonomy terms associated with the node.');
$tokens['node']['metatags-taxonomy-keywords-raw'] = t('The node keywords generated from the taxonomy terms associated with the node. WARNING - raw user input.');
}
return $tokens;
}
/**
* Implements hook_token_values().
*
* @param $object
* The module name of the search routine.
*/
function nodewords_tokens_token_values($type, $object = NULL, $options = array()) {
$values = array();
if ($type == 'global') {
$value = nodewords_unique_values(variable_get('nodewords_global_keywords_1', ''));
$values['metatags-global-keywords-1-raw'] = $value;
$values['metatags-global-keywords-1'] = check_plain($value);
$value = nodewords_unique_values(variable_get('nodewords_global_keywords_2', ''));
$values['metatags-global-keywords-2-raw'] = $value;
$values['metatags-global-keywords-2'] = check_plain($value);
}
if ($type == 'node' && !empty($object)) {
$values['metatags-description-raw'] = _nodewords_tokens_metatag_from_node_content($object);
$values['metatags-description'] = check_plain($values['metatags-description-raw']);
$value = '';
if (module_exists('taxonomy')) {
foreach (taxonomy_node_get_terms($object) as $term) {
if (in_array($term->vid, variable_get('nodewords_keyword_vids', array()))) {
$value .= ',' . $term->name;
}
}
}
$value = nodewords_unique_values($value);
$values['metatags-taxonomy-keywords-raw'] = $value;
$values['metatags-taxonomy-keywords'] = check_plain($value);
}
return $values;
}
/**
* Create the content of a meta tag from a node teaser.
*
* @param $node
* The node object the meta tag refers to.
* @param $content
* The meta tag content.
* @param $options
* An array of options.
*
* @return
* The string used as meta tag content.
*/
function _nodewords_tokens_metatag_from_node_content($node, $options = array()) {
$default_options = array(
'size' => variable_get('nodewords_max_size', 350),
'source' => variable_get('nodewords_description_generation_source', NODEWORDS_DESCRIPTION_GENERATION_TEASER),
);
$filters = filter_list_format($node->format);
$options += $default_options;
$result = '';
$source = $options['source'];
$bool = $source == NODEWORDS_DESCRIPTION_GENERATION_TEASER || $source == NODEWORDS_DESCRIPTION_GENERATION_TEASER_BODY;
if ($bool) {
// Check for the presence of the PHP evaluator filter in the current
// format. If the text contains PHP code, do not split it up to prevent
// parse errors.
if (isset($filters['php/0']) && strpos($node->teaser, '<?') !== FALSE) {
$result = '';
}
else {
// Replace the tag IMG with the attribute ALT, and strip off all the
// HTML tags.
$result = strip_tags(preg_replace_callback("/<img\\s[^>]*alt=[\"']([^\"']*)[\"'][^>]*>/i", '_nodewords_tokens_teaser_match_callback', $node->teaser));
// Remove the strings added from third-party modules.
$modules = array_filter(variable_get('nodewords_filter_modules_output', array()));
$regexps = array(
'imagebrowser' => '/\\[ibimage[^\\]]*\\]/i',
'img_assist' => '/\\[img_assist[^\\]]*\\]/i',
);
foreach ($regexps as $module => $regexp) {
if (isset($modules[$module])) {
$result = preg_replace($regexp, '', $result);
}
}
// Remove the text matching the regular expression.
$regexp = trim(variable_get('nodewords_filter_regexp', ''));
if (!empty($regexp)) {
$result = preg_replace('/' . $regexp . '/i', '', $result);
}
$result = preg_replace('/(\\r\\n?|\\n)/', ' ', node_teaser(trim($result), $node->format, $options['size']));
}
}
$bool = $source == NODEWORDS_DESCRIPTION_GENERATION_BODY || $source == NODEWORDS_DESCRIPTION_GENERATION_TEASER_BODY && empty($result);
if ($bool) {
// We check for the presence of the PHP evaluator filter in the current
// format. If the text contains PHP code, we do not split it up to prevent
// parse errors.
if (isset($filters['php/0']) && strpos($node->body, '<?') !== FALSE) {
return '';
}
// Replace the tag IMG with the attribute ALT, and strip off all the
// HTML tags.
$result = strip_tags(preg_replace_callback("/<img\\s[^>]*alt=[\"']([^\"']*)[\"'][^>]*>/i", '_nodewords_tokens_teaser_match_callback', $node->body));
$result = preg_replace('/(\\r\\n?|\\n)/', ' ', node_teaser(trim($result), $node->format, $options['size']));
}
return $result;
}
/**
* Helper function for preg_match_callback(), called when replacing the tag IMG
* in the teaser, when using it as meta tag DESCRIPTION content.
*/
function _nodewords_tokens_teaser_match_callback($matches) {
static $bool;
if (!isset($bool)) {
$bool = variable_get('nodewords_use_alt_attribute', FALSE);
}
if ($bool && !empty($matches[1])) {
return ' ' . $matches[1] . ' ';
}
return '';
}
Functions
Name | Description |
---|---|
nodewords_tokens_filter_regex_validate | Function to validate the regular expression. |
nodewords_tokens_form_nodewords_admin_settings_form_alter | Implements hook_form_FORM_ID_alter(). |
nodewords_tokens_token_list | Implements hook_token_list(). |
nodewords_tokens_token_values | Implements hook_token_values(). |
_nodewords_tokens_metatag_from_node_content | Create the content of a meta tag from a node teaser. |
_nodewords_tokens_teaser_match_callback | Helper function for preg_match_callback(), called when replacing the tag IMG in the teaser, when using it as meta tag DESCRIPTION content. |