--- modules\node\node.module.1.776.2.1 Tue Sep 04 12:04:13 2007 +++ modules\node\node.module Thu Nov 29 15:09:03 2007 @@ -139,11 +139,30 @@ function node_mark($nid, $timestamp) { } /** - * Automatically generate a teaser for a node body in a given format. + * 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. + * @param $size + * The desired character length of the teaser. If omitted, the default + * value will be used. Ignored if the special delimiter is present + * in $body. + * @return + * The generated teaser. */ -function node_teaser($body, $format = NULL) { +function node_teaser($body, $format = NULL, $size = NULL) { - $size = variable_get('teaser_length', 600); + if (!isset($size)) { + $size = variable_get('teaser_length', 600); + } // Find where the delimiter is in the body $delimiter = strpos($body, ''); @@ -169,40 +188,67 @@ function node_teaser($body, $format = NU } // If we have a short body, the entire body is the teaser. - if (strlen($body) < $size) { + 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); - $position = 0; - // Cache the reverse of the teaser. + + // 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); - // In some cases, no delimiter has been specified. In this case, we try to - // split at paragraph boundaries. - $breakpoints = array('
' => 0, '