diff options
author | Steven Wittens <steven@10.no-reply.drupal.org> | 2005-06-01 03:32:22 +0000 |
---|---|---|
committer | Steven Wittens <steven@10.no-reply.drupal.org> | 2005-06-01 03:32:22 +0000 |
commit | 5257b684ff5d3d8173c1854fddbfd7cd2ca2ac30 (patch) | |
tree | ee2a3e67922bcf95e9213fa2b36f3a3fd48b9a12 /modules | |
parent | 0b008c55ffd0068a27cc2dd136a6bd2a2f6109c9 (diff) | |
download | brdo-5257b684ff5d3d8173c1854fddbfd7cd2ca2ac30.tar.gz brdo-5257b684ff5d3d8173c1854fddbfd7cd2ca2ac30.tar.bz2 |
- #18836: Cleanup teaser generation code, and refine handling of PHP code teasers.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/node.module | 73 | ||||
-rw-r--r-- | modules/node/node.module | 73 |
2 files changed, 44 insertions, 102 deletions
diff --git a/modules/node.module b/modules/node.module index 15bbc9b24..043a6c4c1 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, '<!--break-->'); - // 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, '<?') != false) { - return $body; + // 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 a valid delimiter has been specified, use it to chop of the teaser. @@ -177,60 +182,26 @@ function node_teaser($body) { return substr($body, 0, $delimiter); } - // If we have a short body, return the entire body. + // If we have a short body, the entire body is the teaser. if (strlen($body) < $size) { return $body; } // In some cases, no delimiter has been specified (e.g. when posting using // the Blogger API). In this case, we try to split at paragraph boundaries. - if ($length = strpos($body, '</p>', $size)) { - return substr($body, 0, $length + 4); - } - - if ($length = strpos($body, '<br />', $size)) { - return substr($body, 0, $length); - } - - if ($length = strpos($body, '<br>', $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); - } - - 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); + $breakpoints = array('</p>' => 4, '<br />' => 0, '<br>' => 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 all else fails, simply truncate the string. + + // If all else fails, we simply truncate the string. return truncate_utf8($body, $size); } - /** * Determine the module that defines the node type of the given node. * @@ -1216,7 +1187,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) { @@ -1496,7 +1467,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: diff --git a/modules/node/node.module b/modules/node/node.module index 15bbc9b24..043a6c4c1 100644 --- a/modules/node/node.module +++ b/modules/node/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, '<!--break-->'); - // 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, '<?') != false) { - return $body; + // 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 a valid delimiter has been specified, use it to chop of the teaser. @@ -177,60 +182,26 @@ function node_teaser($body) { return substr($body, 0, $delimiter); } - // If we have a short body, return the entire body. + // If we have a short body, the entire body is the teaser. if (strlen($body) < $size) { return $body; } // In some cases, no delimiter has been specified (e.g. when posting using // the Blogger API). In this case, we try to split at paragraph boundaries. - if ($length = strpos($body, '</p>', $size)) { - return substr($body, 0, $length + 4); - } - - if ($length = strpos($body, '<br />', $size)) { - return substr($body, 0, $length); - } - - if ($length = strpos($body, '<br>', $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); - } - - 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); + $breakpoints = array('</p>' => 4, '<br />' => 0, '<br>' => 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 all else fails, simply truncate the string. + + // If all else fails, we simply truncate the string. return truncate_utf8($body, $size); } - /** * Determine the module that defines the node type of the given node. * @@ -1216,7 +1187,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) { @@ -1496,7 +1467,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: |