/** * Automatically generate a teaser for a node body. * * If the end of the teaser is not indicated using the delimiter * then we try to end it at a sensible place, such as the end of a paragraph, * a line break, or the end of a sentence (in that order of preference). * * @param $body * The content for which a teaser will be generated. * @param $format * The format of the content. If the content contains PHP code, we do not * split it up to prevent parse errors. If the line break filter is present * then we treat newlines embedded in $body as line breaks. * @return * The generated teaser. */ function node_teaser($body, $format = NULL) { $size = variable_get('teaser_length', 600); // Find where the delimiter is in the body $delimiter = strpos($body, ''); // If the size is zero, and there is no delimiter, the entire body is the teaser. if ($size == 0 && $delimiter === FALSE) { return $body; } // If a valid delimiter has been specified, use it to chop off the teaser. if ($delimiter !== FALSE) { return substr($body, 0, $delimiter); } // We check for the presence of the PHP evaluator filter in the current // format. If the body contains PHP code, we do not split it up to prevent // parse errors. if (isset($format)) { $filters = filter_list_format($format); if (isset($filters['filter/1']) && strpos($body, '') !== FALSE) { return $body; } } // If we have a short body, the entire body is the teaser. if (strlen($body) <= $size) { return $body; } // If the delimiter has not been specified, try to split at paragraph or // sentence boundaries. // The teaser may not be longer than maximum length specified. Initial slice. $teaser = truncate_utf8($body, $size); // Store the actual length of the UTF8 string -- which might not be the same // as $size. $max_rpos = strlen($teaser); // How much to cut off the end of the teaser 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 teaser. We use strpos on the reversed needle and // haystack for speed and convenience. $reversed = strrev($teaser); // Build an array of arrays of break points grouped by preference. $break_points = array(); // A paragraph near the end of sliced teaser is most preferable. $break_points[] = array('
' => 0); // If no complete paragraph then treat line breaks as paragraphs. $line_breaks = array('