Index: includes/theme.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/theme.inc,v retrieving revision 1.437 diff -u -p -r1.437 theme.inc --- includes/theme.inc 20 Sep 2008 20:22:23 -0000 1.437 +++ includes/theme.inc 1 Oct 2008 16:57:18 -0000 @@ -304,65 +304,78 @@ function _theme_process_registry(&$cache include_once DRUPAL_ROOT . '/' . $info['path'] . '/' . $info['file']; } - if (isset($info['template']) && !isset($info['path'])) { - $result[$hook]['template'] = $path . '/' . $info['template']; - } // If 'arguments' have been defined previously, carry them forward. // This should happen if a theme overrides a Drupal defined theme // function, for example. if (!isset($info['arguments']) && isset($cache[$hook])) { $result[$hook]['arguments'] = $cache[$hook]['arguments']; } - // Likewise with theme paths. These are used for template naming suggestions. - // Theme implementations can occur in multiple paths. Suggestions should follow. - if (!isset($info['theme paths']) && isset($cache[$hook])) { - $result[$hook]['theme paths'] = $cache[$hook]['theme paths']; - } - // Check for sub-directories. - $result[$hook]['theme paths'][] = isset($info['path']) ? $info['path'] : $path; - - // Check for default _preprocess_ functions. Ensure arrayness. - if (!isset($info['preprocess functions']) || !is_array($info['preprocess functions'])) { - $info['preprocess functions'] = array(); - $prefixes = array(); - if ($type == 'module') { - // Default preprocessor prefix. - $prefixes[] = 'template'; - // Add all modules so they can intervene with their own preprocessors. This allows them - // to provide preprocess functions even if they are not the owner of the current hook. - $prefixes += module_list(); - } - elseif ($type == 'theme_engine' || $type == 'base_theme_engine') { - // Theme engines get an extra set that come before the normally named preprocessors. - $prefixes[] = $name . '_engine'; - // The theme engine also registers on behalf of the theme. The theme or engine name can be used. - $prefixes[] = $name; - $prefixes[] = $theme; - } - else { - // This applies when the theme manually registers their own preprocessors. - $prefixes[] = $name; - } - foreach ($prefixes as $prefix) { - if (function_exists($prefix . '_preprocess')) { - $info['preprocess functions'][] = $prefix . '_preprocess'; + // The following apply only to theming hooks implemented as templates. + if (isset($info['template'])) { + // Prepend the current theming path when none is set. + if (!isset($info['path'])) { + $result[$hook]['template'] = $path . '/' . $info['template']; + } + + // These are used for template naming suggestions. Theme implementations + // can occur in multiple paths. Suggestions should follow. + if (!isset($info['theme paths']) && isset($cache[$hook])) { + $result[$hook]['theme paths'] = $cache[$hook]['theme paths']; + } + // Check for sub-directories. + $result[$hook]['theme paths'][] = isset($info['path']) ? $info['path'] : $path; + + // Preprocess functions work in two distinct phases with the "post_preprocess" + // functions always being executed after normal preprocess functions. + $preprocess_phases = array( + 'preprocess functions' => 'preprocess', + 'post preprocess functions' => 'post_preprocess', + ); + foreach ($preprocess_phases as $phase_key => $preprocess_phase) { + // Check for default _preprocess_ functions. Ensure arrayness. + if (!isset($info[$phase_key]) || !is_array($info[$phase_key])) { + $info[$phase_key] = array(); + $prefixes = array(); + if ($type == 'module') { + // Default preprocessor prefix. + $prefixes[] = 'template'; + // Add all modules so they can intervene with their own preprocessors. This allows them + // to provide preprocess functions even if they are not the owner of the current hook. + $prefixes += module_list(); + } + elseif ($type == 'theme_engine' || $type == 'base_theme_engine') { + // Theme engines get an extra set that come before the normally named preprocessors. + $prefixes[] = $name . '_engine'; + // The theme engine also registers on behalf of the theme. The theme or engine name can be used. + $prefixes[] = $name; + $prefixes[] = $theme; + } + else { + // This applies when the theme manually registers their own preprocessors. + $prefixes[] = $name; + } + foreach ($prefixes as $prefix) { + if (function_exists($prefix . '_' . $preprocess_phase)) { + $info[$phase_key][] = $prefix . '_' . $preprocess_phase; + } + if (function_exists($prefix . '_' . $preprocess_phase . '_' . $hook)) { + $info[$phase_key][] = $prefix . '_' . $preprocess_phase . '_' . $hook; + } + } } - if (function_exists($prefix . '_preprocess_' . $hook)) { - $info['preprocess functions'][] = $prefix . '_preprocess_' . $hook; + // Check for the override flag and prevent the cached preprocess functions from being used. + // This allows themes or theme engines to remove preprocessors set earlier in the registry build. + if (!empty($info['override ' . $phase_key])) { + // Flag not needed inside the registry. + unset($result[$hook]['override ' . $phase_key]); } + elseif (isset($cache[$hook][$phase_key]) && is_array($cache[$hook][$phase_key])) { + $info[$phase_key] = array_merge($cache[$hook][$phase_key], $info[$phase_key]); + } + $result[$hook][$phase_key] = $info[$phase_key]; } } - // Check for the override flag and prevent the cached preprocess functions from being used. - // This allows themes or theme engines to remove preprocessors set earlier in the registry build. - if (!empty($info['override preprocess functions'])) { - // Flag not needed inside the registry. - unset($result[$hook]['override preprocess functions']); - } - elseif (isset($cache[$hook]['preprocess functions']) && is_array($cache[$hook]['preprocess functions'])) { - $info['preprocess functions'] = array_merge($cache[$hook]['preprocess functions'], $info['preprocess functions']); - } - $result[$hook]['preprocess functions'] = $info['preprocess functions']; } // Merge the newly created theme hooks into the existing cache. @@ -639,11 +652,12 @@ function theme() { } } - if (isset($info['preprocess functions']) && is_array($info['preprocess functions'])) { - // This construct ensures that we can keep a reference through - // call_user_func_array. - $args = array(&$variables, $hook); - foreach ($info['preprocess functions'] as $preprocess_function) { + // This construct ensures that we can keep a reference through + // call_user_func_array. + $args = array(&$variables, $hook); + // Preprocess in two phases. + foreach (array('preprocess functions', 'post preprocess functions') as $preprocess_phase) { + foreach ($info[$preprocess_phase] as $preprocess_function) { if (drupal_function_exists($preprocess_function)) { call_user_func_array($preprocess_function, $args); } @@ -1743,6 +1757,9 @@ function template_preprocess(&$variables // Tell all templates where they are located. $variables['directory'] = path_to_theme(); + // Initialize html class attribute for the current hook. + $variables['classes_array'] = array($hook); + // Set default variables that depend on the database. $variables['is_admin'] = FALSE; $variables['is_front'] = FALSE; @@ -1762,6 +1779,14 @@ function template_preprocess(&$variables } /** + * A default post preprocess function used to alter variables as late as possible. + */ +function template_post_preprocess(&$variables, $hook) { + // Flatten out classes. + $variables['classes'] = implode(' ', str_replace('_', '-', $variables['classes_array'])); +} + +/** * Process variables for page.tpl.php * * Most themes utilize their own copy of page.tpl.php. The default is located @@ -1858,32 +1883,29 @@ function template_preprocess_page(&$vari // Compile a list of classes that are going to be applied to the body element. // This allows advanced theming based on context (home page, node of certain type, etc.). - $body_classes = array(); // Add a class that tells us whether we're on the front page or not. - $body_classes[] = $variables['is_front'] ? 'front' : 'not-front'; + $variables['classes_array'][] = $variables['is_front'] ? 'front' : 'not-front'; // Add a class that tells us whether the page is viewed by an authenticated user or not. - $body_classes[] = $variables['logged_in'] ? 'logged-in' : 'not-logged-in'; + $variables['classes_array'][] = $variables['logged_in'] ? 'logged-in' : 'not-logged-in'; // Add arg(0) to make it possible to theme the page depending on the current page // type (e.g. node, admin, user, etc.). To avoid illegal characters in the class, // we're removing everything disallowed. We are not using 'a-z' as that might leave // in certain international characters (e.g. German umlauts). - $body_classes[] = preg_replace('![^abcdefghijklmnopqrstuvwxyz0-9-_]+!s', '', 'page-' . form_clean_id(drupal_strtolower(arg(0)))); + $variables['classes_array'][] = preg_replace('![^abcdefghijklmnopqrstuvwxyz0-9-_]+!s', '', 'page-' . form_clean_id(drupal_strtolower(arg(0)))); // If on an individual node page, add the node type. if (isset($variables['node']) && $variables['node']->type) { - $body_classes[] = 'node-type-' . form_clean_id($variables['node']->type); + $variables['classes_array'][] = 'node-type-' . form_clean_id($variables['node']->type); } // Add information about the number of sidebars. if ($variables['layout'] == 'both') { - $body_classes[] = 'two-sidebars'; + $variables['classes_array'][] = 'two-sidebars'; } elseif ($variables['layout'] == 'none') { - $body_classes[] = 'no-sidebars'; + $variables['classes_array'][] = 'no-sidebars'; } else { - $body_classes[] = 'one-sidebar sidebar-' . $variables['layout']; + $variables['classes_array'][] = 'one-sidebar sidebar-' . $variables['layout']; } - // Implode with spaces. - $variables['body_classes'] = implode(' ', $body_classes); // Build a list of suggested template files in order of specificity. One // suggestion is made for every element of the current path, though @@ -1955,6 +1977,24 @@ function template_preprocess_node(&$vari // Flatten the node object's member fields. $variables = array_merge((array)$node, $variables); + + // Gather node classes. + $variables['classes_array'][] = 'node-' . $node->type; + if ($variables['promote']) { + $variables['classes_array'][] = 'node-promoted'; + } + if ($variables['sticky']) { + $variables['classes_array'][] = 'node-sticky'; + } + if (!$variables['status']) { + $variables['classes_array'][] = 'node-unpublished'; + } + if ($variables['teaser']) { + $variables['classes_array'][] = 'node-teaser'; + } + if (isset($variables['preview'])) { + $variables['classes_array'][] = 'node-preview'; + } // Display info only on certain node types. if (theme_get_setting('toggle_node_info_' . $node->type)) { @@ -1997,6 +2037,8 @@ function template_preprocess_block(&$var $variables['block_zebra'] = ($block_counter[$variables['block']->region] % 2) ? 'odd' : 'even'; $variables['block_id'] = $block_counter[$variables['block']->region]++; + $variables['classes_array'][] = 'block-' . $variables['block']->module; + $variables['template_files'][] = 'block-' . $variables['block']->region; $variables['template_files'][] = 'block-' . $variables['block']->module; $variables['template_files'][] = 'block-' . $variables['block']->module . '-' . $variables['block']->delta; Index: includes/theme.maintenance.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/theme.maintenance.inc,v retrieving revision 1.19 diff -u -p -r1.19 theme.maintenance.inc --- includes/theme.maintenance.inc 1 Oct 2008 00:27:29 -0000 1.19 +++ includes/theme.maintenance.inc 1 Oct 2008 16:57:18 -0000 @@ -266,21 +266,19 @@ function template_preprocess_maintenance $variables['closure'] = ''; // Compile a list of classes that are going to be applied to the body element. - $body_classes = array(); - $body_classes[] = 'in-maintenance'; + $variables['classes_array'][] = 'in-maintenance'; if (isset($variables['db_is_active']) && !$variables['db_is_active']) { - $body_classes[] = 'db-offline'; + $variables['classes_array'][] = 'db-offline'; } if ($variables['layout'] == 'both') { - $body_classes[] = 'two-sidebars'; + $variables['classes_array'][] = 'two-sidebars'; } elseif ($variables['layout'] == 'none') { - $body_classes[] = 'no-sidebars'; + $variables['classes_array'][] = 'no-sidebars'; } else { - $body_classes[] = 'one-sidebar sidebar-' . $variables['layout']; + $variables['classes_array'][] = 'one-sidebar sidebar-' . $variables['layout']; } - $variables['body_classes'] = implode(' ', $body_classes); // Dead databases will show error messages so supplying this template will // allow themers to override the page and the content completely. Index: modules/comment/comment-folded.tpl.php =================================================================== RCS file: /cvs/drupal/drupal/modules/comment/comment-folded.tpl.php,v retrieving revision 1.4 diff -u -p -r1.4 comment-folded.tpl.php --- modules/comment/comment-folded.tpl.php 14 May 2008 13:12:40 -0000 1.4 +++ modules/comment/comment-folded.tpl.php 1 Oct 2008 16:57:18 -0000 @@ -11,11 +11,29 @@ * - $author: Comment author. Can be link or plain text. * - $date: Date and time of posting. * - $comment: Full comment object. + * - $classes: String of classes that can be used to style contextually through + * CSS. It can be manipulated through the variable $classes_array from + * preprocess functions. The default values can be one or more of the following: + * - comment-folded: The current template type, i.e., "theming hook". + * - comment-by-anonymous: Comment by an unregistered user. + * - comment-by-node-author: Comment by the author of the parent node. + * The following applies only to viewers who are registered users: + * - comment-unpublished: An unpublished comment visible only to administrators. + * - comment-by-viewer: Comment by the user currently viewing the page. + * - comment-new: New comment since last the visit. + * + * These two variables are provided for context: + * - $comment: Full comment object. + * - $node: Node object the comments are attached to. + * + * Other variables: + * - $classes_array: Array of html class attribute values. It is flattened + * into a string within the variable $classes. * * @see template_preprocess_comment_folded() * @see theme_comment_folded() */ ?> -
+
Index: modules/comment/comment-wrapper.tpl.php =================================================================== RCS file: /cvs/drupal/drupal/modules/comment/comment-wrapper.tpl.php,v retrieving revision 1.4 diff -u -p -r1.4 comment-wrapper.tpl.php --- modules/comment/comment-wrapper.tpl.php 14 May 2008 13:12:40 -0000 1.4 +++ modules/comment/comment-wrapper.tpl.php 1 Oct 2008 16:57:18 -0000 @@ -8,6 +8,10 @@ * Available variables: * - $content: All comments for a given page. Also contains comment form * if enabled. + * - $classes: String of classes that can be used to style contextually through + * CSS. It can be manipulated through the variable $classes_array from + * preprocess functions. The default value has the following: + * - comment-wrapper: The current template type, i.e., "theming hook". * * The following variables are provided for contextual information. * - $node: Node object the comments are attached to. @@ -18,14 +22,15 @@ * - COMMENT_MODE_FLAT_EXPANDED * - COMMENT_MODE_THREADED_COLLAPSED * - COMMENT_MODE_THREADED_EXPANDED - * - $display_order - * - COMMENT_ORDER_NEWEST_FIRST - * - COMMENT_ORDER_OLDEST_FIRST + * + * Other variables: + * - $classes_array: Array of html class attribute values. It is flattened + * into a string within the variable $classes. * * @see template_preprocess_comment_wrapper() * @see theme_comment_wrapper() */ ?> -
+
Index: modules/comment/comment.module =================================================================== RCS file: /cvs/drupal/drupal/modules/comment/comment.module,v retrieving revision 1.652 diff -u -p -r1.652 comment.module --- modules/comment/comment.module 27 Sep 2008 20:37:00 -0000 1.652 +++ modules/comment/comment.module 1 Oct 2008 16:57:18 -0000 @@ -133,7 +133,7 @@ function comment_theme() { ), 'comment_folded' => array( 'template' => 'comment-folded', - 'arguments' => array('comment' => NULL), + 'arguments' => array('comment' => NULL, 'node' => NULL), ), 'comment_flat_collapsed' => array( 'arguments' => array('comment' => NULL, 'node' => NULL), @@ -1576,7 +1576,7 @@ function theme_comment_view($comment, $n $output .= theme('comment', $comment, $node, $links); } else { - $output .= theme('comment_folded', $comment); + $output .= theme('comment_folded', $comment, $node); } return $output; @@ -1608,6 +1608,25 @@ function template_preprocess_comment(&$v else { $variables['status'] = ($comment->status == COMMENT_NOT_PUBLISHED) ? 'comment-unpublished' : 'comment-published'; } + // Gather comment classes. + if ($comment->uid === 0) { + $variables['classes_array'][] = 'comment-by-anonymous'; + } + else { + // Published class is not needed. It is either 'comment-preview' or 'comment-unpublished'. + if ($variables['status'] != 'comment-published') { + $variables['classes_array'][] = $variables['status']; + } + if ($comment->uid === $variables['node']->uid) { + $variables['classes_array'][] = 'comment-by-node-author'; + } + if ($comment->uid === $variables['user']->uid) { + $variables['classes_array'][] = 'comment-by-viewer'; + } + if ($comment->new) { + $variables['classes_array'][] = 'comment-new'; + } + } } /** @@ -1622,6 +1641,25 @@ function template_preprocess_comment_fol $variables['date'] = format_date($comment->timestamp); $variables['new'] = $comment->new ? t('new') : ''; $variables['title'] = l($comment->subject, comment_node_url() . '/' . $comment->cid, array('fragment' => "comment-$comment->cid")); + // Gather comment classes. + if ($comment->uid === 0) { + $variables['classes_array'][] = 'comment-by-anonymous'; + } + else { + if ($comment->status == COMMENT_NOT_PUBLISHED) { + $variables['classes_array'][] = 'comment-unpublished'; + } + if ($comment->uid === $variables['node']->uid) { + $variables['classes_array'][] = 'comment-by-node-author'; + } + if ($comment->uid === $variables['user']->uid) { + $variables['classes_array'][] = 'comment-by-viewer'; + } + if ($comment->new) { + $variables['classes_array'][] = 'comment-new'; + } + } + } /** Index: modules/comment/comment.tpl.php =================================================================== RCS file: /cvs/drupal/drupal/modules/comment/comment.tpl.php,v retrieving revision 1.7 diff -u -p -r1.7 comment.tpl.php --- modules/comment/comment.tpl.php 14 May 2008 13:12:41 -0000 1.7 +++ modules/comment/comment.tpl.php 1 Oct 2008 16:57:18 -0000 @@ -17,16 +17,31 @@ * comment-unpublished, comment-published or comment-preview. * - $submitted: By line with date and time. * - $title: Linked title. + * - $classes: String of classes that can be used to style contextually through + * CSS. It can be manipulated through the variable $classes_array from + * preprocess functions. The default values can be one or more of the following: + * - comment: The current template type, i.e., "theming hook". + * - comment-by-anonymous: Comment by an unregistered user. + * - comment-by-node-author: Comment by the author of the parent node. + * - comment-preview: When previewing a new or edited comment. + * The following applies only to viewers who are registered users: + * - comment-unpublished: An unpublished comment visible only to administrators. + * - comment-by-viewer: Comment by the user currently viewing the page. + * - comment-new: New comment since last the visit. * - * These two variables are provided for context. + * These two variables are provided for context: * - $comment: Full comment object. * - $node: Node object the comments are attached to. * + * Other variables: + * - $classes_array: Array of html class attribute values. It is flattened + * into a string within the variable $classes. + * * @see template_preprocess_comment() * @see theme_comment() */ ?> -
+
new): ?> Index: modules/node/node.tpl.php =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.tpl.php,v retrieving revision 1.4 diff -u -p -r1.4 node.tpl.php --- modules/node/node.tpl.php 25 Jan 2008 21:21:44 -0000 1.4 +++ modules/node/node.tpl.php 1 Oct 2008 16:57:18 -0000 @@ -20,6 +20,19 @@ * - $terms: the themed list of taxonomy term links output from theme_links(). * - $submitted: themed submission information output from * theme_node_submitted(). + * - $classes: String of classes that can be used to style contextually through + * CSS. It can be manipulated through the variable $classes_array from + * preprocess functions. The default values can be one or more of the following: + * - node: The current template type, i.e., "theming hook". + * - node-[type]: The current node type. For example, if the node is a + * "Blog entry" it would result in "node-blog". Note that the machine + * name will often be in a short form of the human readable label. + * - node-teaser: Nodes in teaser form. + * - node-preview: Nodes in preview mode. + * The following are controlled through the node publishing options. + * - node-promoted: Nodes promoted to the front page. + * - node-sticky: Nodes ordered above other non-sticky nodes in teaser listings. + * - node-unpublished: Unpublished nodes visible only to administrators. * * Other variables: * - $node: Full node object. Contains data that may not be safe. @@ -27,6 +40,8 @@ * - $comment_count: Number of comments attached to the node. * - $uid: User ID of the node author. * - $created: Time the node was published formatted in Unix timestamp. + * - $classes_array: Array of html class attribute values. It is flattened + * into a string within the variable $classes. * - $zebra: Outputs either "even" or "odd". Useful for zebra striping in * teaser listings. * - $id: Position of the node. Increments each time it's output. @@ -48,7 +63,7 @@ * @see template_preprocess_node() */ ?> -
+
Index: modules/system/block.tpl.php =================================================================== RCS file: /cvs/drupal/drupal/modules/system/block.tpl.php,v retrieving revision 1.6 diff -u -p -r1.6 block.tpl.php --- modules/system/block.tpl.php 14 Apr 2008 17:48:41 -0000 1.6 +++ modules/system/block.tpl.php 1 Oct 2008 16:57:18 -0000 @@ -12,8 +12,17 @@ * - $block->module: Module that generated the block. * - $block->delta: An ID for the block, unique within each module. * - $block->region: The block region embedding the current block. + * - $classes: String of classes that can be used to style contextually through + * CSS. It can be manipulated through the variable $classes_array from + * preprocess functions. The default values can be one or more of the following: + * - block: The current template type, i.e., "theming hook". + * - block-[module]: The module generating the block. For example, the user module + * is responsible for handling the default user navigation block. In that case + * the class would be "block-user". * - * Helper variables: + * Other variables: + * - $classes_array: Array of html class attribute values. It is flattened + * into a string within the variable $classes. * - $block_zebra: Outputs 'odd' and 'even' dependent on each block region. * - $zebra: Same output as $block_zebra but independent of any block region. * - $block_id: Counter dependent on each block region. @@ -26,7 +35,7 @@ * @see template_preprocess_block() */ ?> -
+
subject): ?>

subject ?>

Index: modules/system/box.tpl.php =================================================================== RCS file: /cvs/drupal/drupal/modules/system/box.tpl.php,v retrieving revision 1.3 diff -u -p -r1.3 box.tpl.php --- modules/system/box.tpl.php 16 Dec 2007 21:01:45 -0000 1.3 +++ modules/system/box.tpl.php 1 Oct 2008 16:57:18 -0000 @@ -9,11 +9,19 @@ * Available variables: * - $title: Box title. * - $content: Box content. + * - $classes: String of classes that can be used to style contextually through + * CSS. It can be manipulated through the variable $classes_array from + * preprocess functions. The default value has the following: + * - box: The current template type, i.e., "theming hook". + * + * Other variables: + * - $classes_array: Array of html class attribute values. It is flattened + * into a string within the variable $classes. * * @see template_preprocess() */ ?> -
+

Index: modules/system/maintenance-page.tpl.php =================================================================== RCS file: /cvs/drupal/drupal/modules/system/maintenance-page.tpl.php,v retrieving revision 1.3 diff -u -p -r1.3 maintenance-page.tpl.php --- modules/system/maintenance-page.tpl.php 1 Jul 2008 20:36:40 -0000 1.3 +++ modules/system/maintenance-page.tpl.php 1 Oct 2008 16:57:18 -0000 @@ -25,7 +25,7 @@ - +