diff --git a/modules/node.module b/modules/node.module index ad5995e476a..35ba82bc974 100644 --- a/modules/node.module +++ b/modules/node.module @@ -153,23 +153,28 @@ function node_mark($nid, $timestamp) { } /** - * Automatically generate a teaser for the given body text. + * Automatically generate a teaser for a node body in a given format. */ -function node_teaser($body) { +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, we return the entire body. + // If the size is zero, and there is no delimiter, the entire body is the teaser. if ($size == 0 && $delimiter == 0) { return $body; } - // If the body contains PHP code, do not split it up to prevent parse errors. - if (strpos($body, '', $size)) { - return substr($body, 0, $length + 4); - } - - if ($length = strpos($body, '
', $size)) { - return substr($body, 0, $length); - } - - if ($length = strpos($body, '
', $size)) { - return substr($body, 0, $length); - } - - if ($length = strpos($body, "\n", $size)) { - return substr($body, 0, $length); - } - - // When even the first paragraph is too long, try to split at the end of + // When even the first paragraph is too long, we try to split at the end of // the next sentence. - if ($length = strpos($body, '. ', $size)) { - return substr($body, 0, $length + 1); + $breakpoints = array('

' => 4, '
' => 0, '
' => 0, "\n" => 0, '. ' => 1, '! ' => 1, '? ' => 1, '。' => 1, '؟ ' => 1); + foreach ($breakpoints as $point => $charnum) { + if ($length = strpos($body, $point, $size)) { + return substr($body, 0, $length + $charnum); + } } - if ($length = strpos($body, '! ', $size)) { - return substr($body, 0, $length + 1); - } - - if ($length = strpos($body, '? ', $size)) { - return substr($body, 0, $length + 1); - } - - if ($length = strpos($body, '。', $size)) { - return substr($body, 0, $length + 1); - } - - if ($length = strpos($body, '、', $size)) { - return substr($body, 0, $length + 1); - } - - if ($length = strpos($body, '؟ ', $size)) { - return substr($body, 0, $length + 1); - } - - // If all else fails, simply truncate the string. + // If all else fails, we simply truncate the string. return truncate_utf8($body, $size); } @@ -1212,7 +1184,7 @@ function node_validate($node) { // Auto-generate the teaser, but only if it hasn't been set (e.g. by a // module-provided 'teaser' form item). if (!isset($node->teaser)) { - $node->teaser = node_teaser($node->body); + $node->teaser = node_teaser($node->body, $node->format); } if (node_last_changed($node->nid) > $node->changed) { @@ -1492,7 +1464,7 @@ function node_preview($node) { // Extract a teaser, if it hasn't been set (e.g. by a module-provided // 'teaser' form item). if (!isset($node->teaser)) { - $node->teaser = node_teaser($node->body); + $node->teaser = node_teaser($node->body, $node->format); } // Display a preview of the node: