readmore.module in Readmore 7
Same filename and directory in other branches
Basic functional for readmore module.
File
readmore.moduleView source
<?php
/**
* @file
* Basic functional for readmore module.
*/
define('READMORE_MODULE_PATH', drupal_get_path('module', 'readmore'));
include_once DRUPAL_ROOT . '/' . READMORE_MODULE_PATH . '/readmore.field.inc';
/**
* Implements hook_theme().
*/
function readmore_theme() {
$base = array(
'path' => READMORE_MODULE_PATH . '/theme',
);
return array(
'readmore' => array(
'variables' => array(
'summary' => NULL,
'other' => NULL,
'ellips' => NULL,
),
'template' => 'readmore',
) + $base,
);
}
/**
* Truncate string by a number of characters.
*
* @param string $text
* The string to truncate.
* @param string $format
* The format of the content.
* @param int $size
* An upper limit on the returned string length.
* @param bool $wordsafe
* If TRUE, attempt to truncate on a word boundary.
*
* @return string
* Return truncated string.
*/
function readmore_truncate_string($text, $format = NULL, $size = NULL, $wordsafe = FALSE, $use_break = TRUE) {
if (!isset($size)) {
// If size is not set then use default.
$size = 500;
}
if ($use_break) {
// Find where the delimiter is in the body.
$delimiter = strpos($text, '<!--break-->');
if ($delimiter) {
// Set new size.
$size = $delimiter;
}
}
// We check for the presence of the PHP evaluator filter in the current
// format. If the body contains PHP code just return as is.
if (isset($format)) {
$filters = filter_list_format($format);
if (isset($filters['php_code']) && $filters['php_code']->status && strpos($text, '<?') !== FALSE) {
return $text;
}
}
// The summary may not be longer than maximum length specified. Initial slice.
$summary = truncate_utf8($text, $size, $wordsafe, FALSE);
if ($wordsafe) {
// Store the actual length of the truncated string.
$max_rpos = drupal_strlen($summary);
// How much to cut off the end of the summary so that it doesn't end in the
// middle of a paragraph, sentence, or word.
// Initialize it to maximum in order to find the minimum.
$min_rpos = $max_rpos;
// Store the reverse of the summary.
$reversed = strrev($summary);
// Build an array of arrays of break points grouped by preference.
$break_points = array();
// A paragraph near the end of sliced summary is most preferable.
$break_points[] = array(
'</p>' => 0,
);
// If no complete paragraph then treat line breaks as paragraphs.
$line_breaks = array(
'<br />' => 6,
'<br>' => 4,
);
// Newline only indicates a line break if line break converter
// filter is present.
if (isset($filters['filter_autop'])) {
$line_breaks["\n"] = 1;
}
$break_points[] = $line_breaks;
// If the first paragraph is too long, split at the end of a sentence.
$break_points[] = array(
'. ' => 1,
'! ' => 1,
'? ' => 1,
'。' => 0,
'؟ ' => 1,
);
// Iterate over the groups of break points until a break point is found.
foreach ($break_points as $points) {
// Look for each break point, starting at the end of the summary.
foreach ($points as $point => $offset) {
// The summary is already reversed, but the break point isn't.
$rpos = strpos($reversed, strrev($point));
if ($rpos !== FALSE) {
$min_rpos = min($rpos + $offset, $min_rpos);
}
}
// If a break point was found in this group, slice and stop searching.
if ($min_rpos !== $max_rpos) {
// Don't slice with length 0. Length must be <0 to slice from RHS.
$summary = $min_rpos === 0 ? $summary : drupal_substr($summary, 0, 0 - $min_rpos);
break;
}
}
}
return $summary;
}
Functions
Name | Description |
---|---|
readmore_theme | Implements hook_theme(). |
readmore_truncate_string | Truncate string by a number of characters. |
Constants
Name | Description |
---|---|
READMORE_MODULE_PATH | @file Basic functional for readmore module. |