View source
<?php
define('READ_MORE_PLACEMENT_DEFAULT', 'inline');
define('READ_MORE_TEXT_DEFAULT', '[node:read-more:link]');
define('READ_MORE_LINK_TEXT_DEFAULT', '<strong>Read more<span class="element-invisible"> about [node:title]</span></strong>');
define('READ_MORE_TITLE_DEFAULT', '[node:title]');
function read_more_menu() {
$items['admin/config/content/read_more'] = array(
'title' => 'Read More link',
'description' => 'Configures the <strong>Read More</strong> link that appears in node teasers.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'read_more_admin_settings',
),
'access arguments' => array(
'administer site configuration',
),
'file' => 'read_more.admin.inc',
'type' => MENU_NORMAL_ITEM,
);
$items['admin/config/content/read_more/settings'] = array(
'title' => 'Settings',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
return $items;
}
function read_more_preprocess_node(&$vars) {
if (variable_get('read_more_remove', TRUE)) {
unset($vars['content']['links']['node']['#links']['node-readmore']);
}
}
function read_more_node_view($node, $view_mode, $langcode) {
$attachments = variable_get('read_more_' . $node->type . '_view_modes', array());
if (!empty($attachments[$view_mode])) {
$display = variable_get('read_more_placement', READ_MORE_PLACEMENT_DEFAULT);
if ($display == 'disable') {
return;
}
if ($view_mode == 'rss') {
if (variable_get('read_more_rss', TRUE)) {
$node->readmore = NULL;
}
else {
return;
}
}
$read_more_link = read_more_link($node, $display, $view_mode);
if ($display == 'inline') {
$elements_array = variable_get('read_more_elements', array(
'p',
));
$elements = '(?:' . implode('|', $elements_array) . ')';
if (!variable_get('read_more_require_body_field', FALSE) || isset($node->content['body'])) {
if (isset($node->content['body'])) {
preg_match('!</?' . $elements . '[^>]*>\\s*$!i', $node->content['body'][0]['#markup'], $match, PREG_OFFSET_CAPTURE);
$insert_point = empty($match) ? -1 : strpos($view_mode, $node->content['body'][0]['#markup']) + $match[0][1];
$node->content['body'][0]['#markup'] = substr_replace($node->content['body'][0]['#markup'], drupal_render($read_more_link), $insert_point, 0);
}
else {
$display = 'after';
}
}
}
if ($display == 'after') {
$node->content['read_more'] = read_more_link($node, $display, $view_mode) + array(
'#weight' => 1,
);
}
}
if ($view_mode == 'full' && variable_get('read_more_anchor', FALSE)) {
$body = field_get_items('node', $node, 'body');
$teaser = field_view_value('node', $node, 'body', $body[0], 'teaser');
$teaser_rendered = $teaser['#markup'];
$node->content['body'][0]['#markup'] = substr_replace($node->content['body'][0]['#markup'], $teaser_rendered . '<a name="more"></a>', 0, strlen($teaser_rendered));
}
}
function read_more_link($node, $display, $view_mode) {
$uri = entity_uri('node', $node);
if (empty($uri)) {
return array();
}
return array(
'#theme' => 'read_more_link',
'#node' => $node,
'#display' => $display,
'#view_mode' => $view_mode,
);
}
function _read_more_link_options($uri) {
$link_options = $uri['options'];
$link_options['attributes']['title'] = _read_more_link_title($uri['options']['entity']);
$link_options['html'] = TRUE;
if (variable_get('read_more_anchor', FALSE)) {
$link_options['fragment'] = 'more';
}
if (variable_get('read_more_nofollow', TRUE)) {
$link_options['attributes']['rel'] = 'nofollow';
}
if (variable_get('read_more_newwindow', FALSE)) {
$link_options['attributes']['target'] = '_blank';
}
return $link_options;
}
function _read_more_link_uri($node, $options = array()) {
$uri = entity_uri('node', $node);
$uri['options'] = _read_more_link_options($uri);
$uri['options'] = $options + $uri['options'];
return $uri;
}
function _read_more_link_url($node, $options = array()) {
$uri = _read_more_link_uri($node, $options);
return url($uri['path'], $uri['options']);
}
function _read_more_filter_xss($text) {
$allowed_tags = array(
'abbr',
'acronym',
'b',
'big',
'cite',
'code',
'del',
'em',
'i',
'img',
'ins',
'small',
'span',
'strong',
'sub',
'sup',
);
return filter_xss($text, $allowed_tags);
}
function _read_more_wrapper($node, $view_mode) {
$link_wrapper = variable_get('read_more_text', READ_MORE_TEXT_DEFAULT);
$link_wrapper = _read_more_filter_xss($link_wrapper);
return token_replace($link_wrapper, array(
'node' => $node,
), array(
'read_more_view_mode' => $view_mode,
));
}
function _read_more_link($node, $view_mode) {
$link_text = _read_more_link_text($node);
$link_uri = _read_more_link_uri($node);
$view_mode_settings = variable_get('read_more_absolute_link_modes', array());
if (!empty($view_mode_settings[$view_mode])) {
$link_uri['options']['absolute'] = TRUE;
}
return l($link_text, $link_uri['path'], $link_uri['options']);
}
function _read_more_link_text($node) {
$link_text = variable_get('read_more_link_text', READ_MORE_LINK_TEXT_DEFAULT);
$link_text = _read_more_filter_xss($link_text);
$link_text = token_replace($link_text, array(
'node' => $node,
));
return $link_text;
}
function _read_more_link_title($node) {
$link_title = variable_get('read_more_title', READ_MORE_TITLE_DEFAULT);
$link_title = token_replace($link_title, array(
'node' => $node,
));
return $link_title;
}
function read_more_theme($existing, $type, $theme, $path) {
return array(
'read_more_link' => array(
'variables' => array(
'node' => NULL,
'display' => NULL,
'view_mode' => NULL,
),
),
);
}
function theme_read_more_link($vars) {
$display = $vars['display'];
$node = $vars['node'];
$view_mode = $vars['view_mode'];
if ($display == 'after') {
$element = 'div';
$separator = '';
}
else {
$element = 'span';
$separator = ' ';
}
return $separator . '<' . $element . ' class="read-more">' . _read_more_wrapper($node, $view_mode) . '</' . $element . '>';
}
function read_more_view_modes_options_list() {
$entity_info = entity_get_info('node');
$view_modes = array();
foreach ($entity_info['view modes'] as $key => $view_mode) {
$view_modes[$key] = $view_mode['label'];
}
return $view_modes;
}