- Theme system changes. Please consult http://drupal.org/node/view/9576 for details.

4.5.x
Dries Buytaert 2004-08-20 07:51:27 +00:00
parent 6e14528192
commit 6ea5c56ded
54 changed files with 3341 additions and 2551 deletions

View File

@ -3,7 +3,7 @@
#
# Protect files and directories from prying eyes:
<Files ~ "(\.(conf|inc|module|pl|sh|sql|theme)|Entries|Repositories|Root|scripts|updates)$">
<Files ~ "(\.(conf|inc|module|pl|sh|sql|theme|engine|xtmpl)|Entries|Repositories|Root|scripts|updates)$">
order deny,allow
deny from all
</Files>

View File

@ -732,7 +732,8 @@ INSERT INTO system VALUES ('modules/node.module','node','module','',1,0,0);
INSERT INTO system VALUES ('modules/page.module','page','module','',1,0,0);
INSERT INTO system VALUES ('modules/story.module','story','module','',1,0,0);
INSERT INTO system VALUES ('modules/taxonomy.module','taxonomy','module','',1,0,0);
INSERT INTO system VALUES ('themes/xtemplate/xtemplate.theme','xtemplate','theme','Internet explorer, Netscape, Opera',1,0,0);
INSERT INTO system VALUES ('themes/bluemarine/xtemplate.xtmpl','bluemarine','theme','themes/engines/xtemplate/xtemplate.engine',1,0,0);
INSERT INTO system VALUES ('themes/engines/xtemplate/xtemplate.engine','xtemplate','theme_engine','',1,0,0);
INSERT INTO users (uid, name, mail) VALUES ('0', '', '');
INSERT INTO users_roles (uid, rid) VALUES (0, 1);
@ -743,7 +744,7 @@ INSERT INTO role (rid, name) VALUES (2, 'authenticated user');
INSERT INTO permission VALUES (2,'access comments, access content, post comments, post comments without approval',0);
REPLACE variable SET name='update_start', value='s:10:"2004-02-21;"';
REPLACE variable SET name='theme_default', value='s:9:"xtemplate";';
REPLACE variable SET name='theme_default', value='s:10:"bluemarine";';
REPLACE blocks SET module = 'user', delta = '0', status = '1';
REPLACE blocks SET module = 'user', delta = '1', status = '1';

View File

@ -717,10 +717,11 @@ INSERT INTO system VALUES ('modules/node.module','node','module','',1,0,0);
INSERT INTO system VALUES ('modules/page.module','page','module','',1,0,0);
INSERT INTO system VALUES ('modules/story.module','story','module','',1,0,0);
INSERT INTO system VALUES ('modules/taxonomy.module','taxonomy','module','',1,0,0);
INSERT INTO system VALUES ('themes/xtemplate/xtemplate.theme','xtemplate','theme','Internet explorer, Netscape, Opera',1,0,0);
INSERT INTO system VALUES ('themes/bluemarine/xtemplate.xtmpl','bluemarine','theme','themes/engines/xtemplate/xtemplate.engine',1,0,0);
INSERT INTO system VALUES ('themes/engines/xtemplate/xtemplate.engine','xtemplate','theme_engine','',1,0,0);
INSERT INTO variable(name,value) VALUES('update_start', 's:10:"2004-02-21";');
INSERT INTO variable(name,value) VALUES('theme_default','s:9:"xtemplate";');
INSERT INTO variable(name,value) VALUES('theme_default','s:10:"bluemarine";');
INSERT INTO users(uid,name,mail) VALUES(0,'','');
INSERT INTO users_roles(uid,rid) VALUES(0, 1);

View File

@ -74,7 +74,8 @@ $sql_updates = array(
"2004-08-10" => "update_100",
"2004-08-11" => "update_101",
"2004-08-12" => "update_102",
"2004-08-17" => "update_103"
"2004-08-17" => "update_103",
"2004-08-19" => "update_104"
);
function update_32() {
@ -1522,6 +1523,34 @@ function update_103() {
return $ret;
}
function update_104() {
$ret = array();
if (variable_get('theme_default', 'xtemplate') == 'chameleon') {
$ret[] = update_sql("DELETE FROM {system} WHERE name = 'chameleon'");
$ret[] = update_sql("INSERT INTO system VALUES ('themes/chameleon/chameleon.theme','chameleon','theme','',1,0,0)");
$ret[] = update_sql("INSERT INTO system VALUES ('themes/chameleon/marvin/style.css','marvin','theme','themes/chameleon/chameleon.theme',1,0,0)");
if (variable_get("chameleon_stylesheet", "themes/chameleon/pure/chameleon.css") == "themes/chameleon/marvin/chameleon.css") {
variable_set('theme_default', 'chameleon/marvin');
}
else {
variable_set('theme_default', 'chameleon');
}
}
elseif (variable_get('theme_default', 'xtemplate') == 'xtemplate') {
$ret[] = update_sql("DELETE FROM {system} WHERE name = 'xtemplate'");
$ret[] = update_sql("INSERT INTO system VALUES ('themes/bluemarine/bluemarine.theme','bluemarine','theme','themes/engines/xtemplate/xtemplate.engine',1,0,0)");
$ret[] = update_sql("INSERT INTO system VALUES ('themes/pushbutton/pushbutton.theme','pushbutton','theme','themes/engines/xtemplate/xtemplate.engine',1,0,0)");
$ret[] = update_sql("INSERT INTO system VALUES ('themes/engines/xtemplate/xtemplate.engine','xtemplate','theme_engine','',1,0,0)");
if (variable_get('xtemplate_template', 'default') == 'pushbutton') {
variable_set('theme_default', 'pushbutton');
}
else {
variable_set('theme_default', 'bluemarine');
}
}
return $ret;
}
function update_sql($sql) {
$edit = $_POST["edit"];
$result = db_query($sql);

View File

@ -87,9 +87,7 @@ function drupal_get_html_head() {
$output = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n";
$output .= "<base href=\"$base_url/\" />\n";
$output .= "<style type=\"text/css\" media=\"all\">\n";
$output .= "@import url(misc/drupal.css);\n";
$output .= "</style>\n";
$output .= theme('stylesheet_import', 'misc/drupal.css');
return $output . drupal_set_html_head();
}

View File

@ -437,7 +437,7 @@ function file_scan_directory($dir, $mask, $nomask = array('.', '..', 'CVS'), $ca
}
elseif (ereg($mask, $file)) {
$name = basename($file);
$files["$dir/$file"]->path = "$dir/$file";
$files["$dir/$file"]->filename = "$dir/$file";
$files["$dir/$file"]->name = substr($name, 0, strrpos($name, '.'));
if ($callback) {
$callback("$dir/$file");

View File

@ -33,16 +33,52 @@ function theme_help($section) {
* The name of the currently selected theme.
*/
function init_theme() {
global $user;
global $user, $custom_theme, $theme_engine, $theme_key;
$themes = list_themes();
// Only select the user selected theme if it is available in the
// list of enabled themes.
$theme = $user->theme && $themes[$user->theme] ? $user->theme : variable_get('theme_default', 0);
$theme = $user->theme && $themes[$user->theme] ? $user->theme : variable_get('theme_default', 'bluemarine');
include_once($themes[$theme]->filename);
// Allow modules to override the present theme... only select custom theme
// if it is available in the list of enabled themes.
$theme = $custom_theme && $themes[$custom_theme] ? $custom_theme : $theme;
// Store the identifier for retrieving theme settings with.
$theme_key = $theme;
// If we're using a style, load its appropriate theme,
// which is stored in the style's description field.
// Also load the stylesheet using drupal_set_html_head().
// Otherwise, load the theme.
if (strpos($themes[$theme]->filename, '.css')) {
// File is a style; put it in the html_head buffer
// Set theme to its template/theme
drupal_set_html_head(theme('stylesheet_import', $themes[$theme]->filename));
$theme = $themes[$theme]->description;
}
else {
// File is a template/theme
// Put the css with the same name in html_head, if it exists
if (file_exists($stylesheet = dirname($themes[$theme]->filename) .'/style.css')) {
drupal_set_html_head(theme('stylesheet_import', $stylesheet));
}
}
if (strpos($themes[$theme]->filename, '.theme')) {
// file is a theme; include it
include_once($themes[$theme]->filename);
}
elseif (strpos($themes[$theme]->description, '.engine')) {
// file is a template; include its engine
include_once($themes[$theme]->description);
$theme_engine = basename($themes[$theme]->description, '.engine');
if (function_exists($theme_engine .'_init')) {
call_user_func($theme_engine .'_init', $themes[$theme]);
}
}
return $theme;
}
@ -74,13 +110,42 @@ function list_themes($refresh = FALSE) {
return $list;
}
/**
* Provides a list of currently available theme engines
*
* @param $refresh
* Whether to reload the list of themes from the database.
* @return
* An array of the currently available theme engines.
*/
function list_theme_engines($refresh = FALSE) {
static $list;
if ($refresh) {
unset($list);
}
if (!$list) {
$list = array();
$result = db_query("SELECT * FROM {system} where type = 'theme_engine' AND status = '1' ORDER BY name");
while ($engine = db_fetch_object($result)) {
if (file_exists($engine->filename)) {
$list[$engine->name] = $engine;
}
}
}
return $list;
}
/**
* Generate the themed representation of a Drupal object.
*
* All requests for themed functions must go through this function. It examines
* the request and routes it to the appropriate theme function. If the current
* theme does not implement the requested function, then the base theme function
* is called.
* theme does not implement the requested function, then the current theme
* engine is checked. If neither the engine nor theme implement the requested
* function, then the base theme function is called.
*
* For example, to retrieve the HTML that is output by theme_page($output), a
* module should call theme('page', $output).
@ -94,14 +159,21 @@ function list_themes($refresh = FALSE) {
*/
function theme() {
global $theme;
global $theme_engine;
$args = func_get_args();
$function = array_shift($args);
if (($theme != '') && (function_exists($theme .'_'. $function))) {
if (($theme != '') && function_exists($theme .'_'. $function)) {
// call theme function
return call_user_func_array($theme .'_'. $function, $args);
}
elseif (($theme != '') && isset($theme_engine) && function_exists($theme_engine .'_'. $function)) {
// call engine function
return call_user_func_array($theme_engine .'_'. $function, $args);
}
elseif (function_exists('theme_'. $function)){
// call Drupal function
return call_user_func_array('theme_'. $function, $args);
}
}
@ -117,6 +189,113 @@ function path_to_theme() {
return dirname($themes[$theme]->filename);
}
/**
* Retrieve an associative array containing the settings for a theme.
*
* The final settings are arrived at by merging the default settings,
* the site-wide settings, and the settings defined for the specific theme.
* If no $key was specified, only the site-wide theme defaults are retrieved.
*
* The default values for each of settings are also defined in this function.
* To add new settings, add their default values here, and then add form elements
* to system_theme_settings() in system.module.
*
* @param $key
* The template/style value for a given theme.
*
* @return
* An associative array containing theme settings.
*/
function drupal_get_theme_settings($key = NULL) {
$defaults = array(
'primary_links' => '',
'secondary_links' => l('edit secondary links', 'admin/themes/settings'),
'mission' => '',
'default_logo' => 1,
'logo_path' => '',
'toggle_logo' => 1,
'toggle_name' => 1,
'toggle_search' => 1,
'toggle_slogan' => 0,
'toggle_mission' => 1,
'toggle_primary_links' => 1,
'toggle_secondary_links' => 1,
'toggle_node_user_picture' => 0,
'toggle_comment_user_picture' => 0,
);
foreach (node_list() as $type) {
$defaults['toggle_node_info_' . $type] = 1;
}
$settings = array_merge($defaults, variable_get('theme_settings', array()));
if ($key) {
$settings = array_merge($settings, variable_get(str_replace('/', '_', 'theme_'. $key .'_settings'), array()));
}
return $settings;
}
/**
* Retrieve a setting for the current theme.
* This function is designed for use from within themes & engines
* to determine theme settings made in the admin interface.
*
* Caches values for speed (use $refresh = TRUE to refresh cache)
*
* @param $setting_name
* The name of the setting to be retrieved.
*
* @param $refresh
* Whether to reload the cache of settings.
*
* @return
* The value of the requested setting, NULL if the setting does not exist.
*/
function drupal_get_theme_setting($setting_name, $refresh = FALSE) {
global $theme_key;
static $settings;
if (empty($settings) || $refresh) {
$settings = drupal_get_theme_settings($theme_key);
$themes = list_themes();
$theme_object = $themes[$theme_key];
if ($settings['mission'] == '') {
$settings['mission'] = variable_get('site_mission', '');
}
if (!$settings['toggle_mission']) {
$settings['mission'] = '';
}
if ($settings['toggle_logo']) {
if ($settings['default_logo']) {
$settings['logo'] = dirname($theme_object->filename) .'/logo.png';
}
elseif ($settings['logo_path']) {
$settings['logo'] = $settings['logo_path'];
}
}
if ($settings['toggle_primary_links']) {
if (!$settings['primary_links']) {
$settings['primary_links'] = theme('links', link_page());
}
}
else {
$settings['primary_links'] = '';
}
if (!$settings['toggle_secondary_links']) {
$settings['secondary_links'] = '';
}
}
return isset($settings[$setting_name]) ? $settings[$setting_name] : NULL;
}
/**
* @defgroup themeable Themeable functions
* @{
@ -476,6 +655,22 @@ function theme_mark() {
return '<span class="marker">*</span>';
}
/**
* Import a stylesheet using @import.
*
* @param $stylesheet
* The filename to point the link at.
*
* @param $media
* The media type to specify for the stylesheet
*
* @return
* A string containing the HTML for the stylesheet import.
*/
function theme_stylesheet_import($stylesheet, $media = 'all') {
return '<style type="text/css" media="'. $media .'">@import "'. $stylesheet .'";</style>';
}
/**
* Return a themed list of items.
*

View File

@ -379,6 +379,11 @@ tr.light .form-item, tr.dark .form-item {
.node-form .poll-form fieldset {
display: block;
}
img.screenshot {
border: 1px solid #808080;
display: block;
margin: 2px;
}
#tracker td.replies {
text-align: center;
}

View File

@ -11,7 +11,12 @@ function system_help($section) {
case 'admin/settings':
return t('General configuration options for your site. Set up the name of the site, e-mail address used in mail-outs, clean URL options, caching, etc.');
case 'admin/themes':
return t('Select which themes are available to your users and specify the default theme.');
return t('Select which themes are available to your users and specify the default theme. To configure site-wide display settings, click the "configure" task above. Alternately, to override these settings in a specific theme, click the "configure" link for the corresponding theme.');
case 'admin/themes/settings':
return t('These options control the default display settings for your entire site, across all themes. Unless they have been overridden by a specific theme, these settings will be used.');
case 'admin/themes/settings/'. arg(3):
$theme = array_pop(explode('.', arg(3), 2));
return t('These options control the display settings for the <code>%template</code> theme. When your site is displayed using this theme, these settings will be used. By clicking "Reset to defaults," you can choose to use the <a href="%global">global settings</a> for this theme.', array('%template' => $theme, '%global' => url('admin/themes/settings')));
case 'admin/modules':
return t("Modules are plugins for Drupal that extend its core functionality. Here you can select which modules are enabled. Click on the name of the module in the navigation menu for their individual configuration pages. Once a module is enabled, new <a href=\"%permissions\">permissions</a> might be made available. Modules can automatically be temporarily disabled to reduce server load when your site becomes extremely busy by checking throttle. The auto-throttle functionality must be enabled on the <a href=\"%throttle\">throttle configuration page</a> after having enabled the throttle module.", array('%permissions' => url('admin/user/configure/permission'), '%throttle' => url('admin/settings/throttle')));
case 'admin/help#system':
@ -57,28 +62,35 @@ function system_menu() {
'type' => MENU_CALLBACK);
$access = user_access('administer site configuration');
// Themes:
$items[] = array('path' => 'admin/themes', 'title' => t('themes'),
'callback' => 'system_themes', 'access' => $access);
$items[] = array('path' => 'admin/themes/select', 'title' => t('select'),
'callback' => 'system_themes', 'access' => $access,
'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -1);
$items[] = array('path' => 'admin/themes/settings', 'title' => t('configure'),
'callback' => 'system_theme_settings', 'access' => $access,
'type' => MENU_LOCAL_TASK);
// Theme configuration subtabs
$items[] = array('path' => 'admin/themes/settings/global', 'title' => t('global settings'),
'callback' => 'system_theme_settings', 'access' => $access,
'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -1);
foreach (list_themes() as $theme) {
// TODO: reenable 'forced refresh' once we move the menu_build() later
// in the request. It added overhead with no benefit.
// NOTE: refresh the list because some themes might have been enabled/disabled.
include_once $theme->filename;
$function = $theme->name .'_settings';
if (function_exists($function)) {
$items[] = array('path' => 'admin/themes/'. $theme->name, 'title' => $theme->name,
'callback' => 'system_configure_theme', 'access' => $access);
}
$path = str_replace('/', '.', $theme->name);
$items[] = array('path' => 'admin/themes/settings/'. $path, 'title' => basename($theme->name),
'callback' => 'system_theme_settings', 'access' => $access,
'type' => MENU_LOCAL_TASK);
}
// Modules:
$items[] = array('path' => 'admin/settings', 'title' => t('settings'),
'callback' => 'system_site_settings', 'access' => $access);
foreach (module_list() as $name) {
// TODO: reenable 'forced refresh' once we move the menu_build() later
// in the request. It added overhead with no benefit.
// NOTE: refresh the list because some modules might have been enabled/disabled.
if (module_hook($name, 'settings')) {
$items[] = array('path' => 'admin/settings/'. $name, 'title' => t($name));
}
@ -96,12 +108,34 @@ function system_menu() {
*/
function system_user($type, $edit, &$user, $category = NULL) {
if ($type == 'form' && $category == 'account') {
$options = '<option value="">'. t('Default theme') ."</option>\n";
if (count($themes = list_themes()) > 1) {
$rows = array();
foreach ($themes as $key => $value) {
$options .= "<option value=\"$key\"". (($edit['theme'] == $key) ? ' selected="selected"' : '') .">$key - $value->description</option>\n";
$row = array();
// Screenshot column.
$screenshot = dirname($value->filename) .'/screenshot.png';
$row[] = file_exists($screenshot) ? theme('image', $screenshot, t('Screenshot for %theme theme', array('%theme' => $value->name)), '', 'class="screenshot"') : t('no screenshot');
// Information field.
$field = '<strong>'. basename($value->name) .'</strong>';
$row[] = $field;
// Reset to follow site default theme if user selects the site default
if ($key == variable_get('theme_default', 'bluemarine')) {
$key = '';
if ($edit['theme'] == variable_get('theme_default', 'bluemarine')) {
$edit['theme'] = '';
}
}
// Selected column.
$row[] = array('data' => form_radio('', 'theme', $key, ($edit['theme'] == $key) ? 1 : 0), 'align' => 'center');
$rows[] = $row;
}
$data[] = array('title' => t('Theme settings'), 'data' => form_item(t('Theme'), "<select name=\"edit[theme]\">$options</select>", t('Selecting a different theme will change the look and feel of the site.')), 'weight' => 2);
$header = array(t('Screenshot'), t('Name'), t('Selected'));
$data[] = array('title' => t('Theme settings'), 'data' => form_item('', theme('table', $header, $rows), t('Selecting a different theme will change the look and feel of the site.')), 'weight' => 2);
}
if (variable_get('configurable_timezones', 1)) {
@ -199,25 +233,48 @@ function system_view_general() {
return $output;
}
function system_listing($type) {
// Pick appropriate directory and filetype
switch ($type) {
case 'modules':
$directory = 'modules';
$type = 'module';
break;
case 'themes':
default:
$directory = 'themes';
$type = 'theme';
break;
/**
* Inventory theme engines and insert entries for them into the system table
*/
function system_theme_engine_inventory($directory) {
$engines = array();
// Remove all theme engines from the system table
db_query('DELETE FROM {system} WHERE type = \'%s\'', 'theme_engine');
// Find theme engines in the directory and insert into database
$files = file_scan_directory($directory. '/engines', '\.engine$');
foreach ($files as $filename => $file) {
module_set_filename($file->name, $filename);
module_load($file->name);
$info->name = $file->name;
$info->filename = $file->filename;
$engines[$info->name] = $info;
db_query('INSERT INTO {system} (name, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, 'theme_engine', $filename, 1, 0, 0);
}
return $engines;
}
/**
* Retrieves an array of a particular type of files (specified by $type) in a particular $directory
* and their current status in the system table.
*/
function system_get_files($search, $type, $directory) {
// Find files in the directory.
$files = file_scan_directory($directory, "\.$type$");
$files = file_scan_directory($directory, $search);
return $files;
}
/**
* Retrieves the current status of an array of files in the system table.
*/
function system_get_files_database(&$files, $type) {
// Extract current files from database.
$result = db_query("SELECT filename, type, status, throttle FROM {system} WHERE type = '%s'", $type);
$result = db_query('SELECT filename, type, status, throttle FROM {system} WHERE type = \'%s\'', $type);
while ($file = db_fetch_object($result)) {
if (is_object($files[$file->filename])) {
foreach ($file as $key => $value) {
@ -225,64 +282,186 @@ function system_listing($type) {
}
}
}
}
/**
* Obtains information about each theme in the $files array
* Also updates the system table
*/
function system_obtain_theme_info($files, $directory) {
foreach ($files as $filename => $file) {
if ($file->theme) {
// file is a style
$info->description = $file->theme;
$info->style = TRUE;
}
if (strpos($filename, '.theme')) {
// file is a theme
module_set_filename($file->name, $filename);
module_load($file->name);
$info->description = '';
$info->prefix = basename($filename, '.theme');
}
elseif ($info->style && !$file->engine) {
$info->prefix = $info->description;
}
else {
// file is a template
$info->description = $info->style ? $info->description : $file->engine;
$info->template = TRUE;
$info->prefix = basename($file->engine, '.engine');
}
$info->filename = $filename;
$info->path = pathinfo($info->filename);
$info->name = str_replace(array($directory .'/'), '', $info->path['dirname']);
$info->shortname = basename($info->name);
$info->screenshot = dirname($info->filename) .'/screenshot.png';
$info->status = $file->status;
$themes[$info->name] = $info;
// Update the contents of the system table:
db_query('DELETE FROM {system} WHERE filename = \'%s\' AND type = \'%s\'', $info->filename, 'theme');
db_query('INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, $info->description, 'theme', $info->filename, $info->status, 0, 0);
}
return $themes;
}
/**
* Collect data about all currently available themes
*/
function system_theme_data($directory) {
// Find theme engines
$engines = system_theme_engine_inventory($directory);
// Get current list of themes and their present status in the system table.
$files = system_get_files('\.theme$', 'theme', $directory);
// Add templates to the site listing
foreach ($engines as $engine) {
foreach (call_user_func($engine->name .'_templates', $directory) as $template) {
$template_files[$template->filename] = $template;
$template_files[$template->filename]->engine = $engine->filename;
foreach ($files as $file) {
// do not double-insert templates with theme files in their directory
if (dirname($template->filename) == dirname($file->filename)) {
unset($template_files[$template->filename]);
}
}
}
}
$files = array_merge($files, $template_files);
// Find styles in each theme's directory.
foreach ($files as $file) {
foreach (system_get_files("style.css$", 'theme', dirname($file->filename)) as $style) {
// do not double-insert themes with css files in their directory
if (dirname($style->filename) != dirname($file->filename)) {
$style_files[$style->filename] = $style;
$path = pathinfo($file->filename);
$style_files[$style->filename]->theme = str_replace(array($directory .'/'), '', $path['dirname']);
if ($file->engine) {
$style_files[$style->filename]->engine = $file->engine;
}
}
}
}
$files = array_merge($files, $style_files);
// Extract current files from database.
system_get_files_database($files, 'theme');
// Build an array of information about each theme for use in displaying the selection table.
return system_obtain_theme_info($files, $directory);
}
/**
* Generate a list of all the available theme/style combinations.
*/
function system_theme_listing() {
$directory = 'themes';
$themes = system_theme_data($directory);
ksort($themes);
foreach ($themes as $key => $info) {
$row = array();
// Screenshot column.
$row[] = file_exists($info->screenshot) ? theme('image', $info->screenshot, t('Screenshot for %theme theme', array('%theme' => $info->shortname)), '', 'class="screenshot"') : t('no screenshot');
// Information field.
$field = '<strong>'. $info->shortname .'</strong>';
$field .= '<br /><em>themes/'. $key .'</em>';
$row[] = $field;
// enabled, default, and operations columns
$row[] = array('data' => form_checkbox('', 'status]['. $info->filename, 1, $info->status), 'align' => 'center');
$row[] = array('data' => form_radio('', 'theme_default', $info->filename, (variable_get('theme_default', 'bluemarine') == $key) ? 1 : 0), 'align' => 'center');
if (function_exists($info->prefix .'_settings') || function_exists($info->prefix .'_features')) {
$row[] = array('data' => l(t('configure'), 'admin/themes/settings/'. str_replace('/', '.', $key)), 'align' => 'center');
}
else {
$row[] = '';
}
$rows[] = $row;
}
$header = array(t('Screenshot'), t('Name'), t('Enabled'), t('Default'), t('Operations'));
$output = form_hidden('type', 'theme');
$output .= theme('table', $header, $rows);
return $output;
}
/**
* Generate a list of all the available modules, as well as update the system list.
*/
function system_module_listing() {
$directory = 'modules';
// Get current list of modules
$files = system_get_files('\.module$', 'module', $directory);
// Extract current files from database.
system_get_files_database($files, 'module');
ksort($files);
if ($type == 'module') {
$required = array('modules/admin.module', 'modules/block.module', 'modules/filter.module', 'modules/system.module', 'modules/user.module', 'modules/watchdog.module');
// the throttle mechanism requires additional modules always be enabled
$throttle_required = array_merge($required, array('modules/statistics.module', 'modules/throttle.module'));
$required = array('modules/admin.module', 'modules/block.module', 'modules/filter.module', 'modules/system.module', 'modules/user.module', 'modules/watchdog.module');
// the throttle mechanism requires additional modules always be enabled
$throttle_required = array_merge($required, array('modules/statistics.module', 'modules/throttle.module'));
$header = array(t('Name'), t('Description'), t('Status'), t('Throttle'));
}
else {
$required = array();
$header = array(t('Name'), t('Description'), t('Enable'), t('Default'));
}
$header = array(t('Name'), t('Description'), t('Status'), t('Throttle'));
foreach ($files as $filename => $file) {
module_set_filename($file->name, $filename);
module_load($file->name);
if ($type == 'module') {
$info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : $file->name;
$info->description = module_invoke($file->name, 'help', 'admin/modules#description');
// log the critical hooks implemented by this module
$bootstrap = 0;
foreach (bootstrap_hooks() as $hook) {
if (module_hook($file->name, $hook)) {
$bootstrap = 1;
break;
}
}
}
elseif ($type == 'theme') {
$info->name = $file->name;
$info->description = module_invoke($file->name, 'help', 'admin/themes#description');
$themes[] = $info->name;
// Enable the default theme:
if ($info->name == variable_get('theme_default', 0)) {
$file->status = 1;
$info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : $file->name;
$info->description = module_invoke($file->name, 'help', 'admin/modules#description');
// log the critical hooks implemented by this module
$bootstrap = 0;
foreach (bootstrap_hooks() as $hook) {
if (module_hook($file->name, $hook)) {
$bootstrap = 1;
break;
}
}
// Update the contents of the system table:
db_query("DELETE FROM {system} WHERE filename = '%s' AND type = '%s'", $filename, $type);
db_query("INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', %d, %d, %d)", $info->name, $info->description, $type, $filename, $file->status, $file->throttle, $bootstrap);
db_query('DELETE FROM {system} WHERE filename = \'%s\' AND type = \'%s\'', $filename, 'module');
db_query('INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, $info->description, 'module', $filename, $file->status, $file->throttle, $bootstrap);
$row = array($info->name, $info->description, array('data' => (in_array($filename, $required) ? form_hidden("status][$filename", 1) . t('required') : form_checkbox('', "status][$filename", 1, $file->status)), 'align' => 'center'));
if ($type == 'module') {
$row[] = array('data' => (in_array($filename, $throttle_required) ? form_hidden("throttle][$filename", 0) . t('required') : form_checkbox(NULL, "throttle][$filename", 1, $file->throttle, NULL, module_exist('throttle') ? NULL : array('disabled' => 'disabled'))), 'align' => 'center');
}
else if ($type == 'theme') {
$row[] = array('data' => form_radio('', 'theme_default', $info->name, (variable_get('theme_default', 0) == $info->name) ? 1 : 0), 'align' => 'center');
}
$row = array($info->name, $info->description, array('data' => (in_array($filename, $required) ? form_hidden('status]['. $filename, 1) . t('required') : form_checkbox('', 'status]['. $filename, 1, $file->status)), 'align' => 'center'));
$row[] = array('data' => (in_array($filename, $throttle_required) ? form_hidden('throttle]['. $filename, 0) . t('required') : form_checkbox(NULL, 'throttle]['. $filename, 1, $file->throttle, NULL, module_exist('throttle') ? NULL : array('disabled' => 'disabled'))), 'align' => 'center');
$rows[] = $row;
}
$output = theme('table', $header, $rows);
$output .= form_hidden('type', $type);
$output .= form_hidden('type', 'module');
return $output;
}
@ -294,10 +473,17 @@ function system_listing_save($edit = array()) {
if ($op == t('Save configuration')) {
db_query("UPDATE {system} SET status = 0 WHERE type = '%s'", $edit['type']);
foreach ($edit['status'] as $filename => $status) {
// Make certain that the default theme is enabled to avoid user error
if (($edit['type'] == 'theme') && ($edit['theme_default'] == $filename)) {
$status = 1;
}
db_query("UPDATE {system} SET status = %d, throttle = %d WHERE filename = '%s'", $status, $edit['throttle'][$filename], $filename);
}
if ($edit['type'] == 'theme') {
variable_set('theme_default', $edit['theme_default']);
$path = pathinfo($edit['theme_default']);
$name = str_replace(array('themes/'), '', $path['dirname']);
variable_set('theme_default', $name);
}
cache_clear_all();
@ -343,7 +529,7 @@ function system_settings_save() {
*/
function system_themes() {
system_listing_save();
$form = system_listing('themes');
$form = system_theme_listing();
$form .= form_submit(t('Save configuration'));
print theme('page', form($form));
}
@ -353,33 +539,11 @@ function system_themes() {
*/
function system_modules() {
system_listing_save();
$form = system_listing('modules');
$form = system_module_listing();
$form .= form_submit(t('Save configuration'));
print theme('page', form($form));
}
/**
* Menu callback; displays a theme's settings page.
*/
function system_configure_theme() {
system_settings_save();
$name = arg(2);
$themes = list_themes();
$theme = $themes[$name];
if ($theme) {
include_once "$theme->filename";
$function = $theme->name .'_settings';
if (function_exists($function)) {
$form .= $function();
}
}
print theme('page', system_settings_form($form));
}
/**
* Menu callback; displays a module's settings page.
*/
@ -396,4 +560,84 @@ function system_site_settings($module = NULL) {
print theme('page', system_settings_form($form));
}
/**
* Menu callback; display theme configuration for entire site and individual themes.
*/
function system_theme_settings() {
system_settings_save();
// Default settings are defined in _theme_settings() in includes/theme.inc
$key = str_replace('.', '/', arg(3));
if ($key) {
$settings = drupal_get_theme_settings($key);
$var = str_replace('/', '_', 'theme_'. $key .'_settings');
$themes = system_theme_data('themes');
$features = function_exists($themes[$key]->prefix .'_features') ? call_user_func($themes[$key]->prefix .'_features') : array();
}
else {
$settings = drupal_get_theme_settings('');
$var = 'theme_settings';
}
$form = '';
// Logo settings
if ((!$key) || in_array('logo', $features)) {
$group = form_checkbox(t('Use the default logo'), "$var][default_logo", 1, $settings['default_logo'], t('Check here if you want the theme to use the logo supplied with it.'));
$group .= form_textfield(t('Path to custom logo'), "$var][logo_path", $settings['logo_path'], 50, 60, t('The path to the file you would like to use as your logo file instead of the default logo.'));
$form = form_group(t('Logo image settings'), $group);
}
// System wide only settings.
if (!$key) {
// Menu settings
$group = form_textarea(t('Primary links'), "$var][primary_links", $settings['primary_links'], 70, 8, t('The HTML code for the primary links. If this field is empty, Drupal will automatically generate a set of links based on which modules are enabled.'));
$group .= form_textarea(t('Secondary links'), "$var][secondary_links", $settings['secondary_links'], 70, 8, t('The HTML code for the secondary links.'));
$form .= form_group(t('Menu Settings'), $group, t('Customize the menus that are displayed at the top and/or bottom of the page. This configuration screen is only available in the site wide display configuration.'));
// Toggle node display.
$group = '';
foreach (node_list() as $type) {
$group .= form_checkbox($type, "$var][toggle_node_info_$type", 1, $settings["toggle_node_info_$type"]);
}
$form .= form_group(t('Display post information on'), $group, t('Enable or disable the "submitted by Username on date" text when displaying posts of the above type'));
}
$group = '';
// Toggle settings
$toggles = array('toggle_name' => t('Site name'),
'toggle_search' => t('Search box'),
'toggle_slogan' => t('Site slogan'),
'toggle_mission' => t('Mission statement'),
'toggle_primary_links' => t('Primary links'),
'toggle_secondary_links' => t('Secondary links'),
'toggle_node_user_picture' => t('User pictures in posts'),
'toggle_comment_user_picture' => t('User pictures in comments'));
foreach ($toggles as $name => $title) {
if ((!$key) || in_array($name, $features)) {
$group .= form_checkbox($title, "$var][$name", 1, $settings[$name]);
}
}
if ($group) {
$form .= form_group(t('Toggle display'), $group, t('Enable or disable the display of certain page elements.'));
}
if ($key) {
// Template-specific settings
$function = function_exists($themes[$key]->prefix .'_settings');
if (function_exists($function)) {
$group = $function();
if (strpos($themes[$key]->description, '.theme')) {
$form .= form_group(t('Theme-specific settings'), $group, t('These settings only exist for the %theme theme and all the styles based on it.', array('%theme' => $themes[$key]->prefix)));
}
else {
$form .= form_group(t('Engine-specific settings'), $group, t('These settings only exist for all the templates and styles based on the %engine theme engine.', array('%engine' => $themes[$key]->prefix)));
}
}
}
print theme('page', system_settings_form($form));
}
?>

View File

@ -11,7 +11,12 @@ function system_help($section) {
case 'admin/settings':
return t('General configuration options for your site. Set up the name of the site, e-mail address used in mail-outs, clean URL options, caching, etc.');
case 'admin/themes':
return t('Select which themes are available to your users and specify the default theme.');
return t('Select which themes are available to your users and specify the default theme. To configure site-wide display settings, click the "configure" task above. Alternately, to override these settings in a specific theme, click the "configure" link for the corresponding theme.');
case 'admin/themes/settings':
return t('These options control the default display settings for your entire site, across all themes. Unless they have been overridden by a specific theme, these settings will be used.');
case 'admin/themes/settings/'. arg(3):
$theme = array_pop(explode('.', arg(3), 2));
return t('These options control the display settings for the <code>%template</code> theme. When your site is displayed using this theme, these settings will be used. By clicking "Reset to defaults," you can choose to use the <a href="%global">global settings</a> for this theme.', array('%template' => $theme, '%global' => url('admin/themes/settings')));
case 'admin/modules':
return t("Modules are plugins for Drupal that extend its core functionality. Here you can select which modules are enabled. Click on the name of the module in the navigation menu for their individual configuration pages. Once a module is enabled, new <a href=\"%permissions\">permissions</a> might be made available. Modules can automatically be temporarily disabled to reduce server load when your site becomes extremely busy by checking throttle. The auto-throttle functionality must be enabled on the <a href=\"%throttle\">throttle configuration page</a> after having enabled the throttle module.", array('%permissions' => url('admin/user/configure/permission'), '%throttle' => url('admin/settings/throttle')));
case 'admin/help#system':
@ -57,28 +62,35 @@ function system_menu() {
'type' => MENU_CALLBACK);
$access = user_access('administer site configuration');
// Themes:
$items[] = array('path' => 'admin/themes', 'title' => t('themes'),
'callback' => 'system_themes', 'access' => $access);
$items[] = array('path' => 'admin/themes/select', 'title' => t('select'),
'callback' => 'system_themes', 'access' => $access,
'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -1);
$items[] = array('path' => 'admin/themes/settings', 'title' => t('configure'),
'callback' => 'system_theme_settings', 'access' => $access,
'type' => MENU_LOCAL_TASK);
// Theme configuration subtabs
$items[] = array('path' => 'admin/themes/settings/global', 'title' => t('global settings'),
'callback' => 'system_theme_settings', 'access' => $access,
'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -1);
foreach (list_themes() as $theme) {
// TODO: reenable 'forced refresh' once we move the menu_build() later
// in the request. It added overhead with no benefit.
// NOTE: refresh the list because some themes might have been enabled/disabled.
include_once $theme->filename;
$function = $theme->name .'_settings';
if (function_exists($function)) {
$items[] = array('path' => 'admin/themes/'. $theme->name, 'title' => $theme->name,
'callback' => 'system_configure_theme', 'access' => $access);
}
$path = str_replace('/', '.', $theme->name);
$items[] = array('path' => 'admin/themes/settings/'. $path, 'title' => basename($theme->name),
'callback' => 'system_theme_settings', 'access' => $access,
'type' => MENU_LOCAL_TASK);
}
// Modules:
$items[] = array('path' => 'admin/settings', 'title' => t('settings'),
'callback' => 'system_site_settings', 'access' => $access);
foreach (module_list() as $name) {
// TODO: reenable 'forced refresh' once we move the menu_build() later
// in the request. It added overhead with no benefit.
// NOTE: refresh the list because some modules might have been enabled/disabled.
if (module_hook($name, 'settings')) {
$items[] = array('path' => 'admin/settings/'. $name, 'title' => t($name));
}
@ -96,12 +108,34 @@ function system_menu() {
*/
function system_user($type, $edit, &$user, $category = NULL) {
if ($type == 'form' && $category == 'account') {
$options = '<option value="">'. t('Default theme') ."</option>\n";
if (count($themes = list_themes()) > 1) {
$rows = array();
foreach ($themes as $key => $value) {
$options .= "<option value=\"$key\"". (($edit['theme'] == $key) ? ' selected="selected"' : '') .">$key - $value->description</option>\n";
$row = array();
// Screenshot column.
$screenshot = dirname($value->filename) .'/screenshot.png';
$row[] = file_exists($screenshot) ? theme('image', $screenshot, t('Screenshot for %theme theme', array('%theme' => $value->name)), '', 'class="screenshot"') : t('no screenshot');
// Information field.
$field = '<strong>'. basename($value->name) .'</strong>';
$row[] = $field;
// Reset to follow site default theme if user selects the site default
if ($key == variable_get('theme_default', 'bluemarine')) {
$key = '';
if ($edit['theme'] == variable_get('theme_default', 'bluemarine')) {
$edit['theme'] = '';
}
}
// Selected column.
$row[] = array('data' => form_radio('', 'theme', $key, ($edit['theme'] == $key) ? 1 : 0), 'align' => 'center');
$rows[] = $row;
}
$data[] = array('title' => t('Theme settings'), 'data' => form_item(t('Theme'), "<select name=\"edit[theme]\">$options</select>", t('Selecting a different theme will change the look and feel of the site.')), 'weight' => 2);
$header = array(t('Screenshot'), t('Name'), t('Selected'));
$data[] = array('title' => t('Theme settings'), 'data' => form_item('', theme('table', $header, $rows), t('Selecting a different theme will change the look and feel of the site.')), 'weight' => 2);
}
if (variable_get('configurable_timezones', 1)) {
@ -199,25 +233,48 @@ function system_view_general() {
return $output;
}
function system_listing($type) {
// Pick appropriate directory and filetype
switch ($type) {
case 'modules':
$directory = 'modules';
$type = 'module';
break;
case 'themes':
default:
$directory = 'themes';
$type = 'theme';
break;
/**
* Inventory theme engines and insert entries for them into the system table
*/
function system_theme_engine_inventory($directory) {
$engines = array();
// Remove all theme engines from the system table
db_query('DELETE FROM {system} WHERE type = \'%s\'', 'theme_engine');
// Find theme engines in the directory and insert into database
$files = file_scan_directory($directory. '/engines', '\.engine$');
foreach ($files as $filename => $file) {
module_set_filename($file->name, $filename);
module_load($file->name);
$info->name = $file->name;
$info->filename = $file->filename;
$engines[$info->name] = $info;
db_query('INSERT INTO {system} (name, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, 'theme_engine', $filename, 1, 0, 0);
}
return $engines;
}
/**
* Retrieves an array of a particular type of files (specified by $type) in a particular $directory
* and their current status in the system table.
*/
function system_get_files($search, $type, $directory) {
// Find files in the directory.
$files = file_scan_directory($directory, "\.$type$");
$files = file_scan_directory($directory, $search);
return $files;
}
/**
* Retrieves the current status of an array of files in the system table.
*/
function system_get_files_database(&$files, $type) {
// Extract current files from database.
$result = db_query("SELECT filename, type, status, throttle FROM {system} WHERE type = '%s'", $type);
$result = db_query('SELECT filename, type, status, throttle FROM {system} WHERE type = \'%s\'', $type);
while ($file = db_fetch_object($result)) {
if (is_object($files[$file->filename])) {
foreach ($file as $key => $value) {
@ -225,64 +282,186 @@ function system_listing($type) {
}
}
}
}
/**
* Obtains information about each theme in the $files array
* Also updates the system table
*/
function system_obtain_theme_info($files, $directory) {
foreach ($files as $filename => $file) {
if ($file->theme) {
// file is a style
$info->description = $file->theme;
$info->style = TRUE;
}
if (strpos($filename, '.theme')) {
// file is a theme
module_set_filename($file->name, $filename);
module_load($file->name);
$info->description = '';
$info->prefix = basename($filename, '.theme');
}
elseif ($info->style && !$file->engine) {
$info->prefix = $info->description;
}
else {
// file is a template
$info->description = $info->style ? $info->description : $file->engine;
$info->template = TRUE;
$info->prefix = basename($file->engine, '.engine');
}
$info->filename = $filename;
$info->path = pathinfo($info->filename);
$info->name = str_replace(array($directory .'/'), '', $info->path['dirname']);
$info->shortname = basename($info->name);
$info->screenshot = dirname($info->filename) .'/screenshot.png';
$info->status = $file->status;
$themes[$info->name] = $info;
// Update the contents of the system table:
db_query('DELETE FROM {system} WHERE filename = \'%s\' AND type = \'%s\'', $info->filename, 'theme');
db_query('INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, $info->description, 'theme', $info->filename, $info->status, 0, 0);
}
return $themes;
}
/**
* Collect data about all currently available themes
*/
function system_theme_data($directory) {
// Find theme engines
$engines = system_theme_engine_inventory($directory);
// Get current list of themes and their present status in the system table.
$files = system_get_files('\.theme$', 'theme', $directory);
// Add templates to the site listing
foreach ($engines as $engine) {
foreach (call_user_func($engine->name .'_templates', $directory) as $template) {
$template_files[$template->filename] = $template;
$template_files[$template->filename]->engine = $engine->filename;
foreach ($files as $file) {
// do not double-insert templates with theme files in their directory
if (dirname($template->filename) == dirname($file->filename)) {
unset($template_files[$template->filename]);
}
}
}
}
$files = array_merge($files, $template_files);
// Find styles in each theme's directory.
foreach ($files as $file) {
foreach (system_get_files("style.css$", 'theme', dirname($file->filename)) as $style) {
// do not double-insert themes with css files in their directory
if (dirname($style->filename) != dirname($file->filename)) {
$style_files[$style->filename] = $style;
$path = pathinfo($file->filename);
$style_files[$style->filename]->theme = str_replace(array($directory .'/'), '', $path['dirname']);
if ($file->engine) {
$style_files[$style->filename]->engine = $file->engine;
}
}
}
}
$files = array_merge($files, $style_files);
// Extract current files from database.
system_get_files_database($files, 'theme');
// Build an array of information about each theme for use in displaying the selection table.
return system_obtain_theme_info($files, $directory);
}
/**
* Generate a list of all the available theme/style combinations.
*/
function system_theme_listing() {
$directory = 'themes';
$themes = system_theme_data($directory);
ksort($themes);
foreach ($themes as $key => $info) {
$row = array();
// Screenshot column.
$row[] = file_exists($info->screenshot) ? theme('image', $info->screenshot, t('Screenshot for %theme theme', array('%theme' => $info->shortname)), '', 'class="screenshot"') : t('no screenshot');
// Information field.
$field = '<strong>'. $info->shortname .'</strong>';
$field .= '<br /><em>themes/'. $key .'</em>';
$row[] = $field;
// enabled, default, and operations columns
$row[] = array('data' => form_checkbox('', 'status]['. $info->filename, 1, $info->status), 'align' => 'center');
$row[] = array('data' => form_radio('', 'theme_default', $info->filename, (variable_get('theme_default', 'bluemarine') == $key) ? 1 : 0), 'align' => 'center');
if (function_exists($info->prefix .'_settings') || function_exists($info->prefix .'_features')) {
$row[] = array('data' => l(t('configure'), 'admin/themes/settings/'. str_replace('/', '.', $key)), 'align' => 'center');
}
else {
$row[] = '';
}
$rows[] = $row;
}
$header = array(t('Screenshot'), t('Name'), t('Enabled'), t('Default'), t('Operations'));
$output = form_hidden('type', 'theme');
$output .= theme('table', $header, $rows);
return $output;
}
/**
* Generate a list of all the available modules, as well as update the system list.
*/
function system_module_listing() {
$directory = 'modules';
// Get current list of modules
$files = system_get_files('\.module$', 'module', $directory);
// Extract current files from database.
system_get_files_database($files, 'module');
ksort($files);
if ($type == 'module') {
$required = array('modules/admin.module', 'modules/block.module', 'modules/filter.module', 'modules/system.module', 'modules/user.module', 'modules/watchdog.module');
// the throttle mechanism requires additional modules always be enabled
$throttle_required = array_merge($required, array('modules/statistics.module', 'modules/throttle.module'));
$required = array('modules/admin.module', 'modules/block.module', 'modules/filter.module', 'modules/system.module', 'modules/user.module', 'modules/watchdog.module');
// the throttle mechanism requires additional modules always be enabled
$throttle_required = array_merge($required, array('modules/statistics.module', 'modules/throttle.module'));
$header = array(t('Name'), t('Description'), t('Status'), t('Throttle'));
}
else {
$required = array();
$header = array(t('Name'), t('Description'), t('Enable'), t('Default'));
}
$header = array(t('Name'), t('Description'), t('Status'), t('Throttle'));
foreach ($files as $filename => $file) {
module_set_filename($file->name, $filename);
module_load($file->name);
if ($type == 'module') {
$info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : $file->name;
$info->description = module_invoke($file->name, 'help', 'admin/modules#description');
// log the critical hooks implemented by this module
$bootstrap = 0;
foreach (bootstrap_hooks() as $hook) {
if (module_hook($file->name, $hook)) {
$bootstrap = 1;
break;
}
}
}
elseif ($type == 'theme') {
$info->name = $file->name;
$info->description = module_invoke($file->name, 'help', 'admin/themes#description');
$themes[] = $info->name;
// Enable the default theme:
if ($info->name == variable_get('theme_default', 0)) {
$file->status = 1;
$info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : $file->name;
$info->description = module_invoke($file->name, 'help', 'admin/modules#description');
// log the critical hooks implemented by this module
$bootstrap = 0;
foreach (bootstrap_hooks() as $hook) {
if (module_hook($file->name, $hook)) {
$bootstrap = 1;
break;
}
}
// Update the contents of the system table:
db_query("DELETE FROM {system} WHERE filename = '%s' AND type = '%s'", $filename, $type);
db_query("INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', %d, %d, %d)", $info->name, $info->description, $type, $filename, $file->status, $file->throttle, $bootstrap);
db_query('DELETE FROM {system} WHERE filename = \'%s\' AND type = \'%s\'', $filename, 'module');
db_query('INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, $info->description, 'module', $filename, $file->status, $file->throttle, $bootstrap);
$row = array($info->name, $info->description, array('data' => (in_array($filename, $required) ? form_hidden("status][$filename", 1) . t('required') : form_checkbox('', "status][$filename", 1, $file->status)), 'align' => 'center'));
if ($type == 'module') {
$row[] = array('data' => (in_array($filename, $throttle_required) ? form_hidden("throttle][$filename", 0) . t('required') : form_checkbox(NULL, "throttle][$filename", 1, $file->throttle, NULL, module_exist('throttle') ? NULL : array('disabled' => 'disabled'))), 'align' => 'center');
}
else if ($type == 'theme') {
$row[] = array('data' => form_radio('', 'theme_default', $info->name, (variable_get('theme_default', 0) == $info->name) ? 1 : 0), 'align' => 'center');
}
$row = array($info->name, $info->description, array('data' => (in_array($filename, $required) ? form_hidden('status]['. $filename, 1) . t('required') : form_checkbox('', 'status]['. $filename, 1, $file->status)), 'align' => 'center'));
$row[] = array('data' => (in_array($filename, $throttle_required) ? form_hidden('throttle]['. $filename, 0) . t('required') : form_checkbox(NULL, 'throttle]['. $filename, 1, $file->throttle, NULL, module_exist('throttle') ? NULL : array('disabled' => 'disabled'))), 'align' => 'center');
$rows[] = $row;
}
$output = theme('table', $header, $rows);
$output .= form_hidden('type', $type);
$output .= form_hidden('type', 'module');
return $output;
}
@ -294,10 +473,17 @@ function system_listing_save($edit = array()) {
if ($op == t('Save configuration')) {
db_query("UPDATE {system} SET status = 0 WHERE type = '%s'", $edit['type']);
foreach ($edit['status'] as $filename => $status) {
// Make certain that the default theme is enabled to avoid user error
if (($edit['type'] == 'theme') && ($edit['theme_default'] == $filename)) {
$status = 1;
}
db_query("UPDATE {system} SET status = %d, throttle = %d WHERE filename = '%s'", $status, $edit['throttle'][$filename], $filename);
}
if ($edit['type'] == 'theme') {
variable_set('theme_default', $edit['theme_default']);
$path = pathinfo($edit['theme_default']);
$name = str_replace(array('themes/'), '', $path['dirname']);
variable_set('theme_default', $name);
}
cache_clear_all();
@ -343,7 +529,7 @@ function system_settings_save() {
*/
function system_themes() {
system_listing_save();
$form = system_listing('themes');
$form = system_theme_listing();
$form .= form_submit(t('Save configuration'));
print theme('page', form($form));
}
@ -353,33 +539,11 @@ function system_themes() {
*/
function system_modules() {
system_listing_save();
$form = system_listing('modules');
$form = system_module_listing();
$form .= form_submit(t('Save configuration'));
print theme('page', form($form));
}
/**
* Menu callback; displays a theme's settings page.
*/
function system_configure_theme() {
system_settings_save();
$name = arg(2);
$themes = list_themes();
$theme = $themes[$name];
if ($theme) {
include_once "$theme->filename";
$function = $theme->name .'_settings';
if (function_exists($function)) {
$form .= $function();
}
}
print theme('page', system_settings_form($form));
}
/**
* Menu callback; displays a module's settings page.
*/
@ -396,4 +560,84 @@ function system_site_settings($module = NULL) {
print theme('page', system_settings_form($form));
}
/**
* Menu callback; display theme configuration for entire site and individual themes.
*/
function system_theme_settings() {
system_settings_save();
// Default settings are defined in _theme_settings() in includes/theme.inc
$key = str_replace('.', '/', arg(3));
if ($key) {
$settings = drupal_get_theme_settings($key);
$var = str_replace('/', '_', 'theme_'. $key .'_settings');
$themes = system_theme_data('themes');
$features = function_exists($themes[$key]->prefix .'_features') ? call_user_func($themes[$key]->prefix .'_features') : array();
}
else {
$settings = drupal_get_theme_settings('');
$var = 'theme_settings';
}
$form = '';
// Logo settings
if ((!$key) || in_array('logo', $features)) {
$group = form_checkbox(t('Use the default logo'), "$var][default_logo", 1, $settings['default_logo'], t('Check here if you want the theme to use the logo supplied with it.'));
$group .= form_textfield(t('Path to custom logo'), "$var][logo_path", $settings['logo_path'], 50, 60, t('The path to the file you would like to use as your logo file instead of the default logo.'));
$form = form_group(t('Logo image settings'), $group);
}
// System wide only settings.
if (!$key) {
// Menu settings
$group = form_textarea(t('Primary links'), "$var][primary_links", $settings['primary_links'], 70, 8, t('The HTML code for the primary links. If this field is empty, Drupal will automatically generate a set of links based on which modules are enabled.'));
$group .= form_textarea(t('Secondary links'), "$var][secondary_links", $settings['secondary_links'], 70, 8, t('The HTML code for the secondary links.'));
$form .= form_group(t('Menu Settings'), $group, t('Customize the menus that are displayed at the top and/or bottom of the page. This configuration screen is only available in the site wide display configuration.'));
// Toggle node display.
$group = '';
foreach (node_list() as $type) {
$group .= form_checkbox($type, "$var][toggle_node_info_$type", 1, $settings["toggle_node_info_$type"]);
}
$form .= form_group(t('Display post information on'), $group, t('Enable or disable the "submitted by Username on date" text when displaying posts of the above type'));
}
$group = '';
// Toggle settings
$toggles = array('toggle_name' => t('Site name'),
'toggle_search' => t('Search box'),
'toggle_slogan' => t('Site slogan'),
'toggle_mission' => t('Mission statement'),
'toggle_primary_links' => t('Primary links'),
'toggle_secondary_links' => t('Secondary links'),
'toggle_node_user_picture' => t('User pictures in posts'),
'toggle_comment_user_picture' => t('User pictures in comments'));
foreach ($toggles as $name => $title) {
if ((!$key) || in_array($name, $features)) {
$group .= form_checkbox($title, "$var][$name", 1, $settings[$name]);
}
}
if ($group) {
$form .= form_group(t('Toggle display'), $group, t('Enable or disable the display of certain page elements.'));
}
if ($key) {
// Template-specific settings
$function = function_exists($themes[$key]->prefix .'_settings');
if (function_exists($function)) {
$group = $function();
if (strpos($themes[$key]->description, '.theme')) {
$form .= form_group(t('Theme-specific settings'), $group, t('These settings only exist for the %theme theme and all the styles based on it.', array('%theme' => $themes[$key]->prefix)));
}
else {
$form .= form_group(t('Engine-specific settings'), $group, t('These settings only exist for all the templates and styles based on the %engine theme engine.', array('%engine' => $themes[$key]->prefix)));
}
}
}
print theme('page', system_settings_form($form));
}
?>

BIN
themes/bluemarine/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -1,336 +1,354 @@
/* $Id$ */
/*
** HTML elements
*/
body {
margin: 0;
padding: 0;
color: #000;
background-color: #fff;
font: 76% Verdana, Arial, Helvetica, sans-serif;
}
tr.dark td, tr.light td {
padding: 0.3em;
}
h1, h2, h3, h4, h5, h6 {
margin: 0.5;
}
h1 {
font-size: 1.3em;
}
h2 {
font-size: 1.2em;
}
h3, h4, h5, h6 {
font-size: 1.1em;
}
a {
text-decoration: none;
font-weight: bold;
}
a:link {
color: #39c;
}
a:visited {
color: #369;
}
a:hover {
color: #39c;
text-decoration: underline;
}
fieldset {
border: 1px solid #ccc;
}
pre {
background-color: #eee;
padding: 0.75em 1.5em;
font-size: 12px;
border: 1px solid #ddd;
}
table {
/* make <td> sizes relative to body size! */
font-size: 1em;
}
.form-item label {
font-size: 1em;
color: #222;
}
.item-list .title {
font-size: 1em;
color: #222;
}
.links {
margin-bottom: 0em;
}
.comment .links {
margin-bottom: 0em;
}
/*
** Page layout blocks / IDs
*/
#header, #content {
width: 100%;
}
#header {
background-color: #69c;
}
#logo {
vertical-align: bottom;
border: 0;
font-weight: bold;
font-size: 1.9em;
color: #fff;
}
#logo img {
display: block;
}
#menu {
padding: 0.5em 0.5em 0 0.5em;
text-align: right;
vertical-align: middle;
}
#primary {
font-size: 1.0em;
padding: 0em 0.8em 0.5em 0;
color: #9cf;
}
#primary a {
font-weight: bold;
color: #fff;
}
#secondary {
padding: 0 1em 0.5em 0;
font-size: 0.8em;
color: #9cf;
}
#secondary a {
font-weight: bold;
color: #9cf;
}
#search .form-text, #search .form-submit {
border: 1px solid #369;
font-size: 1.1em;
}
#search .form-text {
width: 8em;
height: 1.4em;
padding: 0 0.5em 0 0.5em;
margin: 0 0 0.5em 0;
}
#search .form-submit {
height: 1.5em;
}
#mission {
background-color: #369;
padding: 1.5em 2em;
color: #fff;
}
#mission a, #mission a:visited {
color: #9cf;
font-weight: bold;
}
#main {
/* padding in px not ex because IE messes up 100% width tables otherwise */
padding: 10px;
}
#mission, .node .content, .comment .content {
line-height: 1.4;
}
#help {
font-size: 0.9em;
margin-bottom: 1em;
}
.breadcrumb {
margin-bottom: .5em;
}
.messages {
background-color: #eee;
border: 1px solid #ccc;
padding: 0.3em;
margin-bottom: 1em;
}
.error {
border-color: red;
}
#sidebar-left, #sidebar-right {
background-color: #ddd;
width: 16em;
/* padding in px not ex because IE messes up 100% width tables otherwise */
padding: 10px;
vertical-align: top;
}
#footer {
background-color: #eee;
padding: 1em;
font-size: 0.8em;
}
/*
** Common declarations for child classes of node, comment, block, box, etc.
** If you want any of them styled differently for a specific parent, add
** additional rules /with only the differing properties!/ to .parent .class.
** See .comment .title for an example.
*/
.title, .title a {
font-weight: bold;
font-size: 1.3em;
color: #777;
margin: 0 auto 0 auto; /* decrease default margins for h<x>.title */
}
.submitted {
color: #999;
font-size: 0.8em;
}
.links {
color: #999;
}
.links a {
font-weight: bold;
}
.block, .box {
padding: 0 0 1.5em 0;
}
.block {
border-bottom: 1px solid #bbb;
padding-bottom: 0.75em;
margin-bottom: 1.5em;
}
.block .title {
margin-bottom: .25em;
}
.box .title {
font-size: 1.1em;
}
.node {
margin: .5em 0 2em 0;
}
.sticky {
padding: .5em;
background-color: #eee;
border: solid 1px #ddd;
}
.node .content, .comment .content {
margin: .5em 0 .5em 0;
}
.node .taxonomy {
color: #999;
font-size: 0.8em;
padding: 1.5em;
}
.node .picture {
border: 1px solid #ddd;
float: right;
margin: 0.5em;
}
.comment {
border: 1px solid #abc;
padding: .5em;
margin-bottom: 1em;
}
.comment .title a {
font-size: 1.1em;
font-weight: normal;
}
.comment .new {
text-align: right;
font-weight: bold;
font-size: 0.8em;
float: right;
color: red;
}
.comment .picture {
border: 1px solid #abc;
float: right;
margin: 0.5em;
}
/*
** Module specific styles
*/
#aggregator .feed {
background-color: #eee;
border: 1px solid #ccc;
padding: 1em;
margin: 1em 0 1em 0;
}
#aggregator .news-item .source, #aggregator .news-item .categories, #aggregator .source, #aggregator .age {
color: #999;
font-style: italic;
font-size: 0.9em;
}
#aggregator .title {
margin-bottom: 0.5em;
font-size: 1em;
}
#aggregator h3 {
margin-top: 1em;
}
#forum table {
width: 100%;
}
#forum td {
padding: 0.5em 0.5em 0.5em 0.5em;
}
#forum td.forum, #forum td.posts {
background-color: #eee;
}
#forum td.topics, #forum td.last-reply {
background-color: #ddd;
}
#forum td.container {
background-color: #ccc;
}
#forum td.container a {
color: #555;
}
#forum td.statistics, #forum td.settings, #forum td.pager {
height: 1.5em;
border: 1px solid #bbb;
}
#forum td .name {
color: #96c;
}
#forum td .links {
padding-top: 0.7em;
font-size: 0.9em;
}
#profile .profile {
clear: both;
border: 1px solid #abc;
padding: .5em;
margin: 1em 0em 1em 0em;
}
#profile .profile .name {
padding-bottom: 0.5em;
}
.block-forum h3 {
margin-bottom: .5em;
}
.calendar a {
text-decoration: none;
}
.calendar td, .calendar th {
padding: 0.4em 0;
border-color: #888;
}
.calendar .day-today {
background-color: #69c;
}
.calendar .day-today a {
color: #fff;
}
.calendar .day-selected {
background-color: #369;
color: #fff;
}
.calendar .header-week {
background-color: #ccc;
}
.calendar .day-blank {
background-color: #ccc;
}
.calendar .row-week td a:hover {
background-color: #fff; color: #000;
}
/* $Id$ */
/*
** HTML elements
*/
body {
margin: 0;
padding: 0;
color: #000;
background-color: #fff;
font: 76% Verdana, Arial, Helvetica, sans-serif;
}
tr.dark td, tr.light td {
padding: 0.3em;
}
h1, h2, h3, h4, h5, h6 {
margin: 0.5;
}
h1 {
font-size: 1.3em;
}
h2 {
font-size: 1.2em;
}
h3, h4, h5, h6 {
font-size: 1.1em;
}
a {
text-decoration: none;
font-weight: bold;
}
a:link {
color: #39c;
}
a:visited {
color: #369;
}
a:hover {
color: #39c;
text-decoration: underline;
}
fieldset {
border: 1px solid #ccc;
}
pre {
background-color: #eee;
padding: 0.75em 1.5em;
font-size: 12px;
border: 1px solid #ddd;
}
table {
/* make <td> sizes relative to body size! */
font-size: 1em;
}
.form-item label {
font-size: 1em;
color: #222;
}
.item-list .title {
font-size: 1em;
color: #222;
}
.links {
margin-bottom: 2em;
}
.comment .links {
margin-bottom: 0em;
}
/*
** Page layout blocks / IDs
*/
#header, #content {
width: 100%;
}
#header {
background-color: #69c;
}
#logo {
vertical-align: middle;
border: 0;
}
#logo img {
float: left;
padding: 0em 1.0em 0em 1em;
}
#menu {
padding: 0.5em 0.5em 0 0.5em;
text-align: right;
vertical-align: middle;
}
#primary {
font-size: 1.0em;
padding: 0em 0.8em 0.5em 0;
color: #9cf;
}
#primary a {
font-weight: bold;
color: #fff;
}
#secondary {
padding: 0 1em 0.5em 0;
font-size: 0.8em;
color: #9cf;
}
#secondary a {
font-weight: bold;
color: #9cf;
}
#search .form-text, #search .form-submit {
border: 1px solid #369;
font-size: 1.1em;
}
#search .form-text {
width: 8em;
height: 1.4em;
padding: 0 0.5em 0 0.5em;
margin: 0 0 0.5em 0;
}
#search .form-submit {
height: 1.5em;
}
#mission {
background-color: #369;
padding: 1.5em 2em;
color: #fff;
}
#mission a, #mission a:visited {
color: #9cf;
font-weight: bold;
}
.site-name {
margin: 0.6em 0em 0em 0em;
padding: 0em;
font-size: 2em;
}
.site-name a:link, .site-name a:visited {
color: #fff;
}
.site-name a:hover {
color: #369;
text-decoration: none;
}
.site-slogan {
font-size: 1em;
color: #eee;
display: block;
margin: 0em 0em 0em 0em;
font-style: italic;
font-weight: bold;
}
#main {
/* padding in px not ex because IE messes up 100% width tables otherwise */
padding: 10px;
}
#mission, .node .content, .comment .content {
line-height: 1.4;
}
#help {
font-size: 0.9em;
margin-bottom: 1em;
}
.breadcrumb {
margin-bottom: .5em;
}
.messages {
background-color: #eee;
border: 1px solid #ccc;
padding: 0.3em;
margin-bottom: 1em;
}
.error {
border-color: red;
}
#sidebar-left, #sidebar-right {
background-color: #ddd;
width: 16em;
/* padding in px not ex because IE messes up 100% width tables otherwise */
padding: 10px;
vertical-align: top;
}
#footer {
background-color: #eee;
padding: 1em;
font-size: 0.8em;
}
/*
** Common declarations for child classes of node, comment, block, box, etc.
** If you want any of them styled differently for a specific parent, add
** additional rules /with only the differing properties!/ to .parent .class.
** See .comment .title for an example.
*/
.title, .title a {
font-weight: bold;
font-size: 1.3em;
color: #777;
margin: 0 auto 0 auto; /* decrease default margins for h<x>.title */
}
.submitted {
color: #999;
font-size: 0.8em;
}
.links {
color: #999;
}
.links a {
font-weight: bold;
}
.block, .box {
padding: 0 0 1.5em 0;
}
.block {
border-bottom: 1px solid #bbb;
padding-bottom: 0.75em;
margin-bottom: 1.5em;
}
.block .title {
margin-bottom: .25em;
}
.box .title {
font-size: 1.1em;
}
.node {
margin: .5em 0 1em 0;
}
.sticky {
padding: .5em;
background-color: #eee;
border: solid 1px #ddd;
}
.node .content, .comment .content {
margin: .5em 0 .5em 0;
}
.node .taxonomy {
color: #999;
font-size: 0.8em;
padding: 1.5em;
}
.node .picture {
border: 1px solid #ddd;
float: right;
margin: 0.5em;
}
.comment {
border: 1px solid #abc;
padding: .5em;
margin-bottom: 1em;
}
.comment .title a {
font-size: 1.1em;
font-weight: normal;
}
.comment .new {
text-align: right;
font-weight: bold;
font-size: 0.8em;
float: right;
color: red;
}
.comment .picture {
border: 1px solid #abc;
float: right;
margin: 0.5em;
}
/*
** Module specific styles
*/
#aggregator .feed {
background-color: #eee;
border: 1px solid #ccc;
padding: 1em;
margin: 1em 0 1em 0;
}
#aggregator .news-item .source, #aggregator .news-item .categories, #aggregator .source, #aggregator .age {
color: #999;
font-style: italic;
font-size: 0.9em;
}
#aggregator .title {
margin-bottom: 0.5em;
font-size: 1em;
}
#aggregator h3 {
margin-top: 1em;
}
#forum table {
width: 100%;
}
#forum td {
padding: 0.5em 0.5em 0.5em 0.5em;
}
#forum td.forum, #forum td.posts {
background-color: #eee;
}
#forum td.topics, #forum td.last-reply {
background-color: #ddd;
}
#forum td.container {
background-color: #ccc;
}
#forum td.container a {
color: #555;
}
#forum td.statistics, #forum td.settings, #forum td.pager {
height: 1.5em;
border: 1px solid #bbb;
}
#forum td .name {
color: #96c;
}
#forum td .links {
padding-top: 0.7em;
font-size: 0.9em;
}
#profile .profile {
clear: both;
border: 1px solid #abc;
padding: .5em;
margin: 1em 0em 1em 0em;
}
#profile .profile .name {
padding-bottom: 0.5em;
}
.block-forum h3 {
margin-bottom: .5em;
}
.calendar a {
text-decoration: none;
}
.calendar td, .calendar th {
padding: 0.4em 0;
border-color: #888;
}
.calendar .day-today {
background-color: #69c;
}
.calendar .day-today a {
color: #fff;
}
.calendar .day-selected {
background-color: #369;
color: #fff;
}
.calendar .header-week {
background-color: #ccc;
}
.calendar .day-blank {
background-color: #ccc;
}
.calendar .row-week td a:hover {
background-color: #fff; color: #000;
}

View File

@ -1,125 +1,137 @@
<!-- BEGIN: header --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>{head_title}</title>
{head}
<link type="text/css" rel="stylesheet" href="{directory}/xtemplate.css" />
</head>
<body{onload_attributes}>
<table border="0" cellpadding="0" cellspacing="0" id="header">
<tr>
<td id="logo">
<a href="./">{logo}</a>
</td>
<td id="menu">
<div id="secondary">{secondary_links}</div>
<div id="primary">{primary_links}</div>
<!-- BEGIN: search_box -->
<form action="{search_url}" method="post">
<div id="search">
<input class="form-text" type="text" size="15" value="" name="keys" alt="{search_description}" />
<input class="form-submit" type="submit" value="{search_button_text}" />
</div>
</form>
<!-- END: search_box -->
</td>
</tr>
</table>
<table border="0" cellpadding="0" cellspacing="0" id="content">
<tr>
<!-- BEGIN: blocks -->
<td id="sidebar-left">
{blocks}
</td>
<!-- END: blocks -->
<td valign="top">
<!-- BEGIN: mission -->
<div id="mission">{mission}</div>
<!-- END: mission -->
<div id="main">
<!-- BEGIN: title -->
{breadcrumb}
<h1 class="title">{title}</h1>
<!-- BEGIN: tabs -->
<div class="tabs">{tabs}</div>
<!-- END: tabs -->
<!-- END: title -->
<!-- BEGIN: help -->
<div id="help">{help}</div>
<!-- END: help -->
<!-- BEGIN: message -->
{message}
<!-- END: message -->
<!-- END: header -->
<!-- BEGIN: node -->
<div class="node {sticky}">
<!-- BEGIN: picture -->
{picture}
<!-- END: picture -->
<!-- BEGIN: title -->
<h2 class="title"><a href="{link}">{title}</a></h2>
<!-- END: title -->
<span class="submitted">{submitted}</span>
<!-- BEGIN: taxonomy -->
<span class="taxonomy">{taxonomy}</span>
<!-- END: taxonomy -->
<div class="content">{content}</div>
<!-- BEGIN: links -->
<div class="links">&raquo; {links}</div>
<!-- END: links -->
</div>
<!-- END: node -->
<!-- BEGIN: comment -->
<div class="comment">
<!-- BEGIN: picture -->
{picture}
<!-- END: picture -->
<h3 class="title">{title}</h3><!-- BEGIN: new --><span class="new">{new}</span><!-- END: new -->
<div class="submitted">{submitted}</div>
<div class="content">{content}</div>
<!-- BEGIN: links -->
<div class="links">&raquo; {links}</div>
<!-- END: links -->
</div>
<!-- END: comment -->
<!-- BEGIN: box -->
<div class="box">
<h2 class="title">{title}</h2>
<div class="content">{content}</div>
</div>
<!-- END: box -->
<!-- BEGIN: block -->
<div class="block block-{module}" id="block-{module}-{delta}">
<h2 class="title">{title}</h2>
<div class="content">{content}</div>
</div>
<!-- END: block -->
<!-- BEGIN: footer -->
</div><!-- main -->
</td>
<!-- BEGIN: blocks -->
<td id="sidebar-right">
{blocks}
</td>
<!-- END: blocks -->
</tr>
</table>
<!-- BEGIN: message -->
<div id="footer">
{footer_message}
</div>
<!-- END: message -->
{footer}
</body>
</html>
<!-- END: footer -->
<!-- BEGIN: header --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>{head_title}</title>
{head}
</head>
<body{onload_attributes}>
<table border="0" cellpadding="0" cellspacing="0" id="header">
<tr>
<td id="logo">
<!-- BEGIN: logo -->
<a href="./" title="Home"><img src="{logo}" alt="Home" border="0" /></a>
<!-- END: logo -->
<!-- BEGIN: site_name -->
<h1 class='site-name'><a href="./" title="Home">{site_name}</a></h1>
<!-- END: site_name -->
<!-- BEGIN: site_slogan -->
<div class='site-slogan'>{site_slogan}</div>
<!-- END: site_slogan -->
</td>
<td id="menu">
<div id="secondary">{secondary_links}</div>
<div id="primary">{primary_links}</div>
<!-- BEGIN: search_box -->
<form action="{search_url}" method="post">
<div id="search">
<input class="form-text" type="text" size="15" value="" name="keys" alt="{search_description}" />
<input class="form-submit" type="submit" value="{search_button_text}" />
</div>
</form>
<!-- END: search_box -->
</td>
</tr>
</table>
<table border="0" cellpadding="0" cellspacing="0" id="content">
<tr>
<!-- BEGIN: blocks -->
<td id="sidebar-left">
{blocks}
</td>
<!-- END: blocks -->
<td valign="top">
<!-- BEGIN: mission -->
<div id="mission">{mission}</div>
<!-- END: mission -->
<div id="main">
<!-- BEGIN: title -->
{breadcrumb}
<h1 class="title">{title}</h1>
<!-- BEGIN: tabs -->
<div class="tabs">{tabs}</div>
<!-- END: tabs -->
<!-- END: title -->
<!-- BEGIN: help -->
<div id="help">{help}</div>
<!-- END: help -->
<!-- BEGIN: message -->
{message}
<!-- END: message -->
<!-- END: header -->
<!-- BEGIN: node -->
<div class="node {sticky}">
<!-- BEGIN: picture -->
{picture}
<!-- END: picture -->
<!-- BEGIN: title -->
<h2 class="title"><a href="{link}">{title}</a></h2>
<!-- END: title -->
<span class="submitted">{submitted}</span>
<!-- BEGIN: taxonomy -->
<span class="taxonomy">{taxonomy}</span>
<!-- END: taxonomy -->
<div class="content">{content}</div>
<!-- BEGIN: links -->
<div class="links">&raquo; {links}</div>
<!-- END: links -->
</div>
<!-- END: node -->
<!-- BEGIN: comment -->
<div class="comment">
<!-- BEGIN: picture -->
{picture}
<!-- END: picture -->
<h3 class="title">{title}</h3><!-- BEGIN: new --><span class="new">{new}</span><!-- END: new -->
<div class="submitted">{submitted}</div>
<div class="content">{content}</div>
<!-- BEGIN: links -->
<div class="links">&raquo; {links}</div>
<!-- END: links -->
</div>
<!-- END: comment -->
<!-- BEGIN: box -->
<div class="box">
<h2 class="title">{title}</h2>
<div class="content">{content}</div>
</div>
<!-- END: box -->
<!-- BEGIN: block -->
<div class="block block-{module}" id="block-{module}-{delta}">
<h2 class="title">{title}</h2>
<div class="content">{content}</div>
</div>
<!-- END: block -->
<!-- BEGIN: footer -->
</div><!-- main -->
</td>
<!-- BEGIN: blocks -->
<td id="sidebar-right">
{blocks}
</td>
<!-- END: blocks -->
</tr>
</table>
<!-- BEGIN: message -->
<div id="footer">
{footer_message}
</div>
<!-- END: message -->
{footer}
</body>
</html>
<!-- END: footer -->

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

View File

@ -1,153 +1,153 @@
<?php
// $Id$
function chameleon_help($section) {
$output = '';
switch ($section) {
case 'admin/themes#description':
$output = t('A fast PHP theme with different stylesheets.');
break;
}
return $output;
}
function chameleon_settings() {
/*
** Compile a list of the available style sheets:
*/
$fd = opendir('themes/chameleon');
while ($file = readdir($fd)) {
if (is_dir("themes/chameleon/$file") && !in_array($file, array('.', '..', 'CVS'))) {
$files["themes/chameleon/$file/chameleon.css"] = "themes/chameleon/$file/chameleon.css";
}
}
closedir($fd);
$output = form_select(t('CSS stylesheet'), 'chameleon_stylesheet', variable_get('chameleon_stylesheet', 'themes/chameleon/pure/chameleon.css'), $files, t('Selecting a different stylesheet will change the look and feel of your site.'));
return $output;
}
function chameleon_page($content, $title = NULL, $breadcrumb = NULL) {
if (isset($title)) {
drupal_set_title($title);
}
if (isset($breadcrumb)) {
drupal_set_breadcrumb($breadcrumb);
}
$output = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
$output .= "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\">\n";
$output .= "<head>\n";
$output .= " <title>". ($title ? $title ." | ". variable_get("site_name", "drupal") : variable_get("site_name", "drupal") ." | ". variable_get("site_slogan", "")) ."</title>\n";
$output .= drupal_get_html_head();
$output .= " <link rel=\"stylesheet\" type=\"text/css\" href=\"themes/chameleon/common.css\" />\n";
$output .= " <link rel=\"stylesheet\" type=\"text/css\" href=\"". variable_get("chameleon_stylesheet", "themes/chameleon/pure/chameleon.css") ."\" />\n";
$output .= "</head>";
$output .= "<body". theme_onload_attribute() .">\n";
$output .= " <div id=\"header\">";
$output .= " <h1 class=\"title\">". l(variable_get("site_name", "drupal"), ""). "</h1>";
$output .= " </div>\n";
$output .= " <table>\n";
$output .= " <tr>\n";
if ($blocks = theme_blocks("left")) {
$output .= " <td id=\"sidebar-left\">$blocks</td>\n";
}
$output .= " <td id=\"main\">\n";
if ($title = drupal_get_title()) {
$output .= theme("breadcrumb", drupal_get_breadcrumb());
$output .= "<h2>$title</h2>";
}
if ($tabs = theme('menu_local_tasks')) {
$output .= $tabs;
}
if ($help = menu_get_active_help()) {
$output .= "<div id=\"help\">$help</div><hr />";
}
$output .= theme_status_messages();
$output .= "\n<!-- begin content -->\n";
$output .= $content;
$output .= "\n<!-- end content -->\n";
if ($footer = variable_get('site_footer', '')) {
$output .= " <div id=\"footer\">$footer</div>\n";
}
$output .= " </td>\n";
if ($blocks = theme_blocks("right")) {
$output .= " <td id=\"sidebar-right\">$blocks</td>\n";
}
$output .= " </tr>\n";
$output .= " </table>\n";
$output .= theme_closure();
$output .= " </body>\n";
$output .= "</html>\n";
return $output;
}
function chameleon_node($node, $main = 0, $page = 0) {
$output = "<div class=\"node\">\n";
if (!$page) {
$output .= " <h2 class=\"title\">". ($main ? l($node->title, "node/$node->nid") : $node->title) ."</h2>\n";
}
$output .= " <div class=\"content\">\n";
if ($main && $node->teaser) {
$output .= $node->teaser;
}
else {
$output .= $node->body;
}
$output .= " </div>\n";
$submitted = array(t("By %author at %date", array('%author' => format_name($node), '%date' => format_date($node->created, 'small'))));
if (module_exist('taxonomy')) {
$terms = taxonomy_link("taxonomy terms", $node);
}
if ($links = link_node($node, $main)) {
$output .= " <div class=\"links\">". theme('links', array_merge($submitted, $terms, $links)) ."</div>\n";
}
$output .= "</div>\n";
return $output;
}
function chameleon_comment($comment, $link = "") {
$submitted = array(t('By %author at %date', array('%author' => format_name($comment), '%date' => format_date($comment->timestamp. 'small'))));
$links = array($link);
$output = "<div class=\"comment\">\n";
$output .= " <h3 class=\"title\">". l($comment->subject, $_GET['q'], NULL, NULL, "comment-$comment->cid") ."</h3>\n";
$output .= " <div class=\"content\">". $comment->comment ."</div>\n";
$output .= " <div class=\"links\">". theme('links', array_merge($submitted, $links)) ."</div>\n";
$output .= "</div>\n";
return $output;
}
?>
<?php
// $Id$
function chameleon_features() {
return array(
'logo',
'toggle_name',
'toggle_search',
'toggle_slogan',
'toggle_primary_links',
'toggle_secondary_links');
}
function chameleon_page($content, $title = NULL, $breadcrumb = NULL) {
if (isset($title)) {
drupal_set_title($title);
}
if (isset($breadcrumb)) {
drupal_set_breadcrumb($breadcrumb);
}
$output = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
$output .= "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\">\n";
$output .= "<head>\n";
$output .= " <title>". ($title ? $title ." | ". variable_get("site_name", "drupal") : variable_get("site_name", "drupal") ." | ". variable_get("site_slogan", "")) ."</title>\n";
$output .= drupal_get_html_head();
$output .= " <link rel=\"stylesheet\" type=\"text/css\" href=\"themes/chameleon/common.css\" />\n";
$output .= "</head>";
$output .= "<body". theme_onload_attribute() .">\n";
$output .= " <div id=\"header\">";
if ($logo = drupal_get_theme_setting('logo')) {
$output .= " <a href=\"./\" title=\"Home\"><img src=\"$logo\" alt=\"Home\" /></a>";
}
if (drupal_get_theme_setting('toggle_name')) {
$output .= " <h1 class=\"site-name title\">". l(variable_get('site_name', 'drupal'), ""). "</h1>";
}
if (drupal_get_theme_setting('toggle_slogan')) {
$output .= " <div class=\"site-slogan\">". variable_get('site_slogan', '') ."</div>";
}
$output .= "</div>\n";
$primary_links = drupal_get_theme_setting('primary_links');
$secondary_links = drupal_get_theme_setting('secondary_links');
if ($primary_links || $secondary_links) {
$output .= ' <div class="navlinks">';
if ($primary_links) {
$output .= '<div class="primary">'. $primary_links .'</div>';
}
if ($secondary_links) {
$output .= '<div class="secondary">'. $secondary_links .'</div>';
}
$output .= " </div>\n";
}
$output .= " <table>\n";
$output .= " <tr>\n";
if ($blocks = theme_blocks("left")) {
$output .= " <td id=\"sidebar-left\">$blocks</td>\n";
}
$output .= " <td id=\"main\">\n";
if ($title = drupal_get_title()) {
$output .= theme("breadcrumb", drupal_get_breadcrumb());
$output .= "<h2>$title</h2>";
}
if ($tabs = theme('menu_local_tasks')) {
$output .= $tabs;
}
if ($help = menu_get_active_help()) {
$output .= "<div id=\"help\">$help</div><hr />";
}
$output .= theme_status_messages();
$output .= "\n<!-- begin content -->\n";
$output .= $content;
$output .= "\n<!-- end content -->\n";
if ($footer = variable_get('site_footer', '')) {
$output .= " <div id=\"footer\">$footer</div>\n";
}
$output .= " </td>\n";
if ($blocks = theme_blocks("right")) {
$output .= " <td id=\"sidebar-right\">$blocks</td>\n";
}
$output .= " </tr>\n";
$output .= " </table>\n";
$output .= theme_closure();
$output .= " </body>\n";
$output .= "</html>\n";
return $output;
}
function chameleon_node($node, $main = 0, $page = 0) {
$output = "<div class=\"node\">\n";
if (!$page) {
$output .= " <h2 class=\"title\">". ($main ? l($node->title, "node/$node->nid") : $node->title) ."</h2>\n";
}
$output .= " <div class=\"content\">\n";
if ($main && $node->teaser) {
$output .= $node->teaser;
}
else {
$output .= $node->body;
}
$output .= " </div>\n";
$submitted = drupal_get_theme_setting("toggle_node_info_$node->type") ? array(t("By %author at %date", array('%author' => format_name($node), '%date' => format_date($node->created, 'small')))) : array();
if (module_exist('taxonomy')) {
$terms = taxonomy_link("taxonomy terms", $node);
}
if ($links = link_node($node, $main)) {
$output .= " <div class=\"links\">". theme('links', array_merge($submitted, $terms, $links)) ."</div>\n";
}
$output .= "</div>\n";
return $output;
}
function chameleon_comment($comment, $link = "") {
$submitted = array(t('By %author at %date', array('%author' => format_name($comment), '%date' => format_date($comment->timestamp. 'small'))));
$links = array($link);
$output = "<div class=\"comment\">\n";
$output .= " <h3 class=\"title\">". l($comment->subject, $_GET['q'], NULL, NULL, "comment-$comment->cid") ."</h3>\n";
$output .= " <div class=\"content\">". $comment->comment ."</div>\n";
$output .= " <div class=\"links\">". theme('links', array_merge($submitted, $links)) ."</div>\n";
$output .= "</div>\n";
return $output;
}
?>

View File

@ -1,124 +1,147 @@
/* $Id$ */
/*
** HTML elements
*/
a, a:link, a:active {
font-weight: bold;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
body {
margin: 0;
padding: 3em;
font-family: arial, helvetica, sans-serif;
font-size: .9em;
line-height: 1.3em;
}
blockquote {
font-style: italic;
}
table {
margin: 0;
padding: .5em;
border-collapse: collapse;
}
code, pre {
font-size: 1em;
}
pre {
font-size: 0.8em;
padding: 1em;
background: #eee;
}
li {
padding-bottom: .3em;
}
h1, h2, h3, h4, h5, h6 {
margin-bottom: .25em;
}
h1 {
font-size: 1.3em;
}
h2 {
font-size: 1.2em;
}
h3 {
font-size: 1.1em;
}
h4, h5, h6 {
font-size: 1em;
}
p {
margin: 0 0 .5em 0;
}
br {
line-height: 0.6em;
}
/*
** Page layout blocks / IDs
*/
#header {
margin-bottom: 2em;
}
#help {
font-size: 0.8em;
}
#sidebar-left, #sidebar-right {
vertical-align: top;
padding: 10px;
}
#main {
padding-left: 1em;
padding-right: 1em;
vertical-align: top;
width: 60%;
}
#footer {
font-size: 0.8em;
padding-top: 2em;
text-align: center;
}
/*
** Common declarations for child classes of node, comment, block, box etc
*/
.title {
margin: 0 0 .25em 0;
}
.content {
margin: 0 0 .5em 0;
}
.links {
font-size: 0.8em;
line-height: 1.25em;
}
.block {
width: 180px;
}
.messages {
padding: 0.3em;
margin: 0.5em 0em 0.5em 0em;
}
.status {
border: 1px solid #3a3;
color: #3a3;
}
.error, form-item input.error {
border: 1px solid red;
color: red;
}
/*
** Module specific styles
*/
.form-item textarea {
font-size: 1em;
}
#aggregator .feed {
border: 1px solid gray;
padding: 1em;
}
/* $Id$ */
/*
** HTML elements
*/
a, a:link, a:active {
font-weight: bold;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
body {
margin: 0;
padding: 3em;
font-size: .9em;
line-height: 1.3em;
}
blockquote {
font-style: italic;
}
table {
margin: 0;
padding: .5em;
border-collapse: collapse;
}
code, pre {
font-size: 1em;
}
pre {
font-size: 0.8em;
padding: 1em;
background: #eee;
}
li {
padding-bottom: .3em;
}
h1, h2, h3, h4, h5, h6 {
margin-bottom: .25em;
}
h1 {
font-size: 1.3em;
}
h2 {
font-size: 1.2em;
}
h3 {
font-size: 1.1em;
}
h4, h5, h6 {
font-size: 1em;
}
p {
margin: 0 0 .5em 0;
}
br {
line-height: 0.6em;
}
/*
** Page layout blocks / IDs
*/
#header {
margin-bottom: 2em;
}
#help {
font-size: 0.8em;
}
#sidebar-left, #sidebar-right {
vertical-align: top;
padding: 10px;
}
#main {
padding-left: 1em;
padding-right: 1em;
vertical-align: top;
}
#footer {
font-size: 0.8em;
padding-top: 2em;
text-align: center;
}
/*
** Common declarations for child classes of node, comment, block, box etc
*/
.title {
margin: 0 0 .25em 0;
}
.content {
margin: 0 0 .5em 0;
}
.links {
font-size: 0.8em;
line-height: 1.25em;
}
.block {
width: 180px;
}
.messages {
padding: 0.3em;
margin: 0.5em 0em 0.5em 0em;
}
.status {
border: 1px solid #3a3;
color: #3a3;
}
.error, form-item input.error {
border: 1px solid red;
color: red;
}
/*
** Common navigation links added on the admin/themes/settings page
*/
.navlinks {
padding: 0em 0.5em 1.5em 0em;
}
.primary a {
font-size: 1.0em;
padding: 0em 0.5em 0em 0em;
}
.secondary a {
font-size: 0.9em;
padding: 0em 0.5em 0em 0em;
}
/*
** Logo Image Positioning
*/
#header img {
float: left;
padding: 0em 2em 0em 0em;
}
#header {
clear: both;
}
/*
** Module specific styles
*/
.form-item textarea {
font-size: 1em;
}
#aggregator .feed {
border: 1px solid gray;
padding: 1em;
}

BIN
themes/chameleon/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -1,114 +1,118 @@
/* $Id$ */
/*
** HTML elements
*/
body {
background: #fff url(druplicon-watermark.png) no-repeat top right;
}
a:link {
color: #656
}
a:visited {
color: #656
}
a:active {
color: #ccc
}
h2 {
background-color: #eaeaea;
border: solid 1px #777;
font-size: 1.1em;
margin: 0.5em 0em 0.5em 0em;
padding: 0.5em;
}
h2.title {
background-color: #fff;
border: solid 1px #888;
margin-top: 1em;
}
p {
margin: 0 1em 1em 0;
padding: 0;
}
table {
font-size: 1em;
}
/*
** Page layout blocks / IDs
*/
#main {
width: 80%;
}
/*
** Common declarations for child classes of node, comment, block, box etc
*/
.node .submitted {
color: #7c7c7c;
font-size: 0.9em;
float: left;
padding: 0.5em 0em 0.5em 1em;
}
.node .taxonomy {
color: #7c7c7c;
font-size: 0.9em;
float: right;
}
.node .content {
clear: both;
padding-left: 1em;
}
.node .links {
padding: 1em;
}
.comment {
border: solid 1px #777;
margin: 0.5em 0 0.5em 0;
padding: 0.5em;
}
.block {
margin-bottom: 10px;
font-size: 0.9em;
}
.block .content {
border: solid 1px #888;
border-top: none;
margin: 0;
padding: 5px;
}
.block h2.title {
margin: 0;
}
/*
** Module specific styles
*/
.item-list ul li {
list-style-image: url(bullet.png);
}
.calendar .day-today {
background-color: #ccc;
}
.calendar .day-selected {
background-color: #bbb;
}
.calendar .header-month {
background-color: #ddd;
}
.calendar .header-week {
background-color: #ccc;
}
.calendar .day-blank {
background-color: #ddd;
}
.calendar .day-link a {
color: #000;
}
.calendar .row-week {
color: #aaa;
}
.path, .path a, .path a:visited {
color: #888;
/* $Id$ */
/*
** HTML elements
*/
body {
background: #fff url(druplicon-watermark.png) no-repeat top right;
font-family: arial, helvetica, sans-serif;
}
a:link {
color: #656
}
a:visited {
color: #656
}
a:active {
color: #ccc
}
h2 {
background-color: #eaeaea;
border: solid 1px #777;
font-size: 1.1em;
margin: 0.5em 0em 0.5em 0em;
padding: 0.5em;
}
h2.title {
background-color: #fff;
border: solid 1px #888;
margin-top: 1em;
}
p {
margin: 0 1em 1em 0;
padding: 0;
}
table {
font-size: 1em;
}
/*
** Page layout blocks / IDs
*/
#main {
width: 80%;
}
#header .title {
padding-top: .75em;
}
/*
** Common declarations for child classes of node, comment, block, box etc
*/
.node .submitted {
color: #7c7c7c;
font-size: 0.9em;
float: left;
padding: 0.5em 0em 0.5em 1em;
}
.node .taxonomy {
color: #7c7c7c;
font-size: 0.9em;
float: right;
}
.node .content {
clear: both;
padding-left: 1em;
}
.node .links {
padding: 1em;
}
.comment {
border: solid 1px #777;
margin: 0.5em 0 0.5em 0;
padding: 0.5em;
}
.block {
margin-bottom: 10px;
font-size: 0.9em;
}
.block .content {
border: solid 1px #888;
border-top: none;
margin: 0;
padding: 5px;
}
.block h2.title {
margin: 0;
}
/*
** Module specific styles
*/
.item-list ul li {
list-style-image: url(bullet.png);
}
.calendar .day-today {
background-color: #ccc;
}
.calendar .day-selected {
background-color: #bbb;
}
.calendar .header-month {
background-color: #ddd;
}
.calendar .header-week {
background-color: #ccc;
}
.calendar .day-blank {
background-color: #ddd;
}
.calendar .day-link a {
color: #000;
}
.calendar .row-week {
color: #aaa;
}
.path, .path a, .path a:visited {
color: #888;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1,90 +1,95 @@
/* $Id$ */
/*
** HTML elements
*/
a, a:link, a:active {
color: #930;
}
a:visited {
color: #630;
}
body {
padding: 5em 0 0 3em;
background-image: url(background.png);
background-repeat: repeat-x;
font-family: trebuchet ms, tahoma, verdana, arial, helvetica;
border-top: 10px solid gray;
}
ul {
list-style-type: disc;
}
/*
** Page layout blocks / IDs
*/
#main {
width: 500px;
}
#sidebar-left {
border-right: 1px solid gray;
}
#sidebar-right {
border-left: 1px solid gray;
}
/*
** Common declarations for child classes of node, comment, block, box etc
*/
#header .title {
font-size: 2em;
font-weight: bold;
}
#header .title a,
#header .title a:link,
#header .title a:visited,
#header .title a:active {
text-decoration: none;
color: #aaa;
}
#header .title a:hover {
color: #930;
}
.node .title {
font-size: 1.2em;
}
.node .title a,
.node .title a:link,
.node .title a:active,
.node .title a:visited {
text-decoration: none;
font-weight: normal;
}
.node .title a:hover {
text-decoration: underline;
}
.links {
margin: 1em 0 3em 0;
text-align: right;
}
.comment .content, .block .content, .menu {
font-size: 0.9em;
}
.block {
padding-bottom: 1em;
}
.block .title {
font-size: 1em;
}
/*
** Module specific styles
*/
.item-list ul li {
list-style: square;
}
#aggregator .source {
color: gray;
font-style: italic;
font-size: 0.9em;
}
/* $Id$ */
/*
** HTML elements
*/
a, a:link, a:active {
color: #930;
}
a:visited {
color: #630;
}
body {
padding: 5em 0 0 3em;
background-image: url(background.png);
background-repeat: repeat-x;
font-family: trebuchet ms, tahoma, verdana, arial, helvetica;
border-top: 10px solid gray;
}
ul {
list-style-type: disc;
}
/*
** Page layout blocks / IDs
*/
#main {
width: 500px;
}
#sidebar-left {
border-right: 1px solid gray;
}
#sidebar-right {
border-left: 1px solid gray;
}
/*
** Common declarations for child classes of node, comment, block, box etc
*/
#header .title {
font-size: 2em;
font-weight: bold;
padding-top: .75em;
}
#header .title a,
#header .title a:link,
#header .title a:visited,
#header .title a:active {
text-decoration: none;
color: #aaa;
}
#header .title a:hover {
color: #930;
}
#header .site-slogan {
margin-top: -0.1em;
font-size: 0.8em;
}
.node .title {
font-size: 1.2em;
}
.node .title a,
.node .title a:link,
.node .title a:active,
.node .title a:visited {
text-decoration: none;
font-weight: normal;
}
.node .title a:hover {
text-decoration: underline;
}
.links {
margin: 1em 0 3em 0;
text-align: right;
}
.comment .content, .block .content, .menu {
font-size: 0.9em;
}
.block {
padding-bottom: 1em;
}
.block .title {
font-size: 1em;
}
/*
** Module specific styles
*/
.item-list ul li {
list-style: square;
}
#aggregator .source {
color: gray;
font-style: italic;
font-size: 0.9em;
}

View File

@ -1,245 +1,233 @@
<?php
// $Id$
if (!class_exists("XTemplate")) {
include_once("themes/xtemplate/xtemplate.inc");
}
$template_directory = variable_get('xtemplate_template', 'default');
$GLOBALS["xtemplate"]->template = new XTemplate('xtemplate.xtmpl', 'themes/xtemplate/' . $template_directory);
$GLOBALS["xtemplate"]->template->SetNullBlock(" "); // "" doesnt work!
function xtemplate_settings() {
/*
** Compile a list of the available style sheets:
*/
$fd = opendir('themes/xtemplate');
while ($file = readdir($fd)) {
if (is_dir("themes/xtemplate/$file") && !in_array($file, array('.', '..', 'CVS'))) {
$files[$file] = $file;
}
}
closedir($fd);
$template_directory = variable_get('xtemplate_template', 'default');
$group = form_select(t('Template'), 'xtemplate_template', variable_get('xtemplate_template', 'default'), $files, t('Selecting a different template will change the look and feel of your site. To create a new template, create a new directory under <code>themes/xtemplate</code> and copy the contents of an existing template (e.g. <code>themes/xtemplate/default</code>) into it. The new template will automatically become available in the selection menu and will be identified by its directory name.'));
$output = form_group(t('Template selection'), $group);
$group = form_textarea(t('Logo'), 'xtemplate_logo', variable_get('xtemplate_logo', "<img src=\"themes/xtemplate/$template_directory/logo.png\" alt=\"Logo\" />"), 70, 4, t('The HTML code for displaying the logo.'));
$group .= form_textarea(t('Primary links'), 'xtemplate_primary_links', variable_get('xtemplate_primary_links', l('edit primary links', 'admin/themes/xtemplate')), 70, 8, t('The HTML code for the primary links.'));
$group .= form_textarea(t('Secondary links'), 'xtemplate_secondary_links', variable_get('xtemplate_secondary_links', l('edit secondary links', 'admin/themes/xtemplate')), 70, 8, t('The HTML code for the secondary links.'));
$group .= form_textarea(t('Message on front page'), 'xtemplate_mission', variable_get('xtemplate_mission', 'edit mission'), 70, 6, t('This text will be displayed on the front page. It can be used to display a mission statement, announcement or site description.'));
$group .= form_radios(t('Search box'), 'xtemplate_search_box', variable_get('xtemplate_search_box', 0), array(t('Disabled'), t('Enabled')), t('Show a search box in the upper right corner.'));
$output .= form_group(t('Header settings'), $group);
$group = form_checkbox(t('Display pictures with posts'), 'xtemplate_picture_node', 1, variable_get('xtemplate_picture_node', 0), t('Display individualized pictures identifying users with posts they start.'));
$group .= form_checkbox(t('Display pictures with comments'), 'xtemplate_picture_comment', 1, variable_get('xtemplate_picture_comment', 0), t('Display individualized pictures identifying users with their comments.'));
$output .= form_group(t('Avatar settings'), $group);
return $output;
}
function xtemplate_help($section) {
$output = '';
switch ($section) {
case 'admin/themes#description':
$output = t('A template driven theme');
break;
}
return $output;
}
function xtemplate_node($node, $main = 0, $page = 0) {
global $xtemplate;
$xtemplate->template->assign(array(
"submitted" => t("Submitted by %a on %b.",
array("%a" => format_name($node),
"%b" => format_date($node->created))),
"link" => url("node/$node->nid"),
"title" => $node->title,
"author" => format_name($node),
"date" => format_date($node->created),
"sticky" => ($main && $node->sticky) ? 'sticky' : '',
"content" => ($main && $node->teaser) ? $node->teaser : $node->body));
if ($page == 0) {
$xtemplate->template->parse("node.title");
}
if ($picture = theme('user_picture', $node)) {
$xtemplate->template->assign("picture", $picture);
$xtemplate->template->parse("node.picture");
}
if (module_exist("taxonomy") && ($taxonomy = taxonomy_link("taxonomy terms", $node))) {
$xtemplate->template->assign("taxonomy", theme_links($taxonomy));
$xtemplate->template->parse("node.taxonomy");
}
if ($links = link_node($node, $main)) {
$xtemplate->template->assign("links", theme_links($links));
$xtemplate->template->parse("node.links");
}
$xtemplate->template->parse("node");
$output = $xtemplate->template->text("node");
$xtemplate->template->reset("node");
return $output;
}
function xtemplate_comment($comment, $links = 0) {
global $xtemplate;
$xtemplate->template->assign(array (
"new" => t("new"),
"submitted" => t("Submitted by %a on %b.",
array("%a" => format_name($comment),
"%b" => format_date($comment->timestamp))),
"title" => l($comment->subject, $_GET['q'], NULL, NULL, "comment-$comment->cid"),
"author" => format_name($comment),
"date" => format_date($comment->timestamp),
"content" => $comment->comment
));
if ($comment->new) {
$xtemplate->template->parse("comment.new");
}
if ($picture = theme('user_picture', $comment)) {
$xtemplate->template->assign("picture", $picture);
$xtemplate->template->parse("comment.picture");
}
if ($links) {
$xtemplate->template->assign("links", $links);
$xtemplate->template->parse("comment.links");
}
$xtemplate->template->parse("comment");
$output = $xtemplate->template->text("comment");
$xtemplate->template->reset("comment");
return $output;
}
function xtemplate_page($content, $title = NULL, $breadcrumb = NULL) {
if (isset($title)) {
drupal_set_title($title);
}
if (isset($breadcrumb)) {
drupal_set_breadcrumb($breadcrumb);
}
global $xtemplate;
$template_directory = variable_get('xtemplate_template', 'default');
$xtemplate->template->assign(array(
"head_title" => (drupal_get_title() ? drupal_get_title() ." | ". variable_get("site_name", "drupal") : variable_get("site_name", "drupal") ." | ". variable_get("site_slogan", "")),
"site" => variable_get("site_name", "drupal"),
"head" => drupal_get_html_head(),
"directory" => "themes/xtemplate/$template_directory",
"onload_attributes" => theme_onload_attribute(),
"logo" => variable_get('xtemplate_logo', "<img src=\"themes/xtemplate/$template_directory/logo.png\" alt=\"Logo\" />"),
"primary_links" => variable_get("xtemplate_primary_links", l("edit primary links", "admin/themes/xtemplate")),
"secondary_links" => variable_get("xtemplate_secondary_links", l("edit secondary links", "admin/themes/xtemplate"))
));
if ($tabs = theme('menu_local_tasks')) {
$xtemplate->template->assign("tabs", $tabs);
$xtemplate->template->parse("header.title.tabs");
}
if ($title = drupal_get_title()) {
$xtemplate->template->assign("title", $title);
$xtemplate->template->assign("breadcrumb", theme("breadcrumb", drupal_get_breadcrumb()));
$xtemplate->template->parse("header.title");
}
if ($help = menu_get_active_help()) {
$xtemplate->template->assign("help", $help);
$xtemplate->template->parse("header.help");
}
if ($message = theme_status_messages()) {
$xtemplate->template->assign("message", $message);
$xtemplate->template->parse("header.message");
}
if (variable_get("xtemplate_search_box", 1)) {
$xtemplate->template->assign(array(
//"search" => search_form(),
"search_url" => url("search"),
"search_button_text" => t("Search"),
"search_description" => t("Enter the terms you wish to search for.")
));
$xtemplate->template->parse("header.search_box");
}
// only parse the mission block if we are on the frontpage ...
if ($_GET["q"] == variable_get("site_frontpage", "node") && ($mission = variable_get("xtemplate_mission", "edit mission"))) {
$xtemplate->template->assign("mission", $mission);
$xtemplate->template->parse("header.mission");
}
if ($blocks = theme("blocks", "left")) {
$xtemplate->template->assign("blocks", $blocks);
$xtemplate->template->parse("header.blocks");
}
$xtemplate->template->parse("header");
$output = $xtemplate->template->text("header");
$output .= "\n<!-- begin content -->\n";
$output .= $content;
$output .= "\n<!-- end content -->\n";
if ($blocks = theme("blocks", "right")) {
$xtemplate->template->assign("blocks", $blocks);
$xtemplate->template->parse("footer.blocks");
}
// only parse the footer block if site_footer is set
if ($footer_message = variable_get("site_footer", FALSE)) {
$xtemplate->template->assign("footer_message", $footer_message);
$xtemplate->template->parse("footer.message");
}
$xtemplate->template->assign("footer", theme_closure());
$xtemplate->template->parse("footer");
$output .= $xtemplate->template->text("footer");
return $output;
}
function xtemplate_block(&$block) {
global $xtemplate;
// create template variables for all block variables (module, delta, region, subject, content, ...)
foreach ($block as $key => $value) {
$xtemplate->template->assign($key == "subject" ? "title" : $key, $value); // TODO: standardize on 'title' (ie. rename all $block["subject"] to "title")
}
$xtemplate->template->parse("block");
$output = $xtemplate->template->text("block");
$xtemplate->template->reset("block");
return $output;
}
function xtemplate_box($title, $content, $region = "main") {
global $xtemplate;
$xtemplate->template->assign(array(
"title" => $title,
"content" => $content));
$xtemplate->template->parse("box");
$output = $xtemplate->template->text("box");
$xtemplate->template->reset("box");
return $output;
}
?>
<?php
// $Id$
// Initialize the xtemplate engine.
function xtemplate_init($template) {
// We cannot use the theme() or path_to_theme() functions here
if (!class_exists('XTemplate')) {
include_once('themes/engines/xtemplate/xtemplate.inc');
}
$GLOBALS['xtemplate']->template = new XTemplate(basename($template->filename), dirname($template->filename));
$GLOBALS['xtemplate']->template->SetNullBlock(' '); // '' doesnt work!
}
function xtemplate_templates($directory) {
return file_scan_directory($directory, 'xtemplate.xtmpl$');
}
function xtemplate_features() {
return array(
'logo',
'toggle_name',
'toggle_search',
'toggle_slogan',
'toggle_mission',
'toggle_primary_links',
'toggle_secondary_links',
'toggle_node_user_picture',
'toggle_comment_user_picture');
}
function xtemplate_node($node, $main = 0, $page = 0) {
global $xtemplate;
$xtemplate->template->assign(array(
"submitted" => drupal_get_theme_setting("toggle_node_info_$node->type") ?
t("Submitted by %a on %b.",
array("%a" => format_name($node),
"%b" => format_date($node->created))) : '',
"link" => url("node/$node->nid"),
"title" => $node->title,
"author" => format_name($node),
"date" => format_date($node->created),
"sticky" => ($main && $node->sticky) ? 'sticky' : '',
"content" => ($main && $node->teaser) ? $node->teaser : $node->body));
if ($page == 0) {
$xtemplate->template->parse("node.title");
}
if (drupal_get_theme_setting('toggle_node_user_picture') && $picture = theme('user_picture', $node)) {
$xtemplate->template->assign("picture", $picture);
$xtemplate->template->parse("node.picture");
}
if (module_exist("taxonomy") && ($taxonomy = taxonomy_link("taxonomy terms", $node))) {
$xtemplate->template->assign("taxonomy", theme_links($taxonomy));
$xtemplate->template->parse("node.taxonomy");
}
if ($links = link_node($node, $main)) {
$xtemplate->template->assign("links", theme_links($links));
$xtemplate->template->parse("node.links");
}
$xtemplate->template->parse("node");
$output = $xtemplate->template->text("node");
$xtemplate->template->reset("node");
return $output;
}
function xtemplate_comment($comment, $links = 0) {
global $xtemplate;
$xtemplate->template->assign(array (
"new" => t("new"),
"submitted" => t("Submitted by %a on %b.",
array("%a" => format_name($comment),
"%b" => format_date($comment->timestamp))),
"title" => l($comment->subject, $_GET['q'], NULL, NULL, "comment-$comment->cid"),
"author" => format_name($comment),
"date" => format_date($comment->timestamp),
"content" => $comment->comment
));
if ($comment->new) {
$xtemplate->template->parse("comment.new");
}
if (drupal_get_theme_setting('toggle_comment_user_picture') && $picture = theme('user_picture', $comment)) {
$xtemplate->template->assign("picture", $picture);
$xtemplate->template->parse("comment.picture");
}
if ($links) {
$xtemplate->template->assign("links", $links);
$xtemplate->template->parse("comment.links");
}
$xtemplate->template->parse("comment");
$output = $xtemplate->template->text("comment");
$xtemplate->template->reset("comment");
return $output;
}
function xtemplate_page($content, $title = NULL, $breadcrumb = NULL) {
if (isset($title)) {
drupal_set_title($title);
}
if (isset($breadcrumb)) {
drupal_set_breadcrumb($breadcrumb);
}
global $xtemplate;
$xtemplate->template->assign(array(
"head_title" => (drupal_get_title() ? drupal_get_title() ." | ". variable_get("site_name", "drupal") : variable_get("site_name", "drupal") ." | ". variable_get("site_slogan", "")),
"head" => drupal_get_html_head(),
"onload_attributes" => theme_onload_attribute(),
"primary_links" => drupal_get_theme_setting('primary_links'),
"secondary_links" => drupal_get_theme_setting('secondary_links')
));
if ($logo = drupal_get_theme_setting('logo')) {
$xtemplate->template->assign('logo', $logo);
$xtemplate->template->parse('header.logo');
}
if (drupal_get_theme_setting('toggle_name')) {
$xtemplate->template->assign('site_name', variable_get('site_name', ''));
$xtemplate->template->parse('header.site_name');
}
if (drupal_get_theme_setting('toggle_slogan')) {
$xtemplate->template->assign('site_slogan', variable_get('site_slogan', ''));
$xtemplate->template->parse('header.site_slogan');
}
if ($tabs = theme('menu_local_tasks')) {
$xtemplate->template->assign("tabs", $tabs);
$xtemplate->template->parse("header.title.tabs");
}
if ($title = drupal_get_title()) {
$xtemplate->template->assign("title", $title);
$xtemplate->template->assign("breadcrumb", theme("breadcrumb", drupal_get_breadcrumb()));
$xtemplate->template->parse("header.title");
}
if ($help = menu_get_active_help()) {
$xtemplate->template->assign("help", $help);
$xtemplate->template->parse("header.help");
}
if ($message = theme_status_messages()) {
$xtemplate->template->assign("message", $message);
$xtemplate->template->parse("header.message");
}
if (drupal_get_theme_setting('toggle_search')) {
$xtemplate->template->assign(array(
//"search" => search_form(),
"search_url" => url("search"),
"search_button_text" => t("Search"),
"search_description" => t("Enter the terms you wish to search for.")
));
$xtemplate->template->parse("header.search_box");
}
// only parse the mission block if we are on the frontpage ...
if ($_GET["q"] == variable_get("site_frontpage", "node") && drupal_get_theme_setting('toggle_mission') && ($mission = drupal_get_theme_setting('mission'))) {
$xtemplate->template->assign("mission", $mission);
$xtemplate->template->parse("header.mission");
}
if ($blocks = theme("blocks", "left")) {
$xtemplate->template->assign("blocks", $blocks);
$xtemplate->template->parse("header.blocks");
}
$xtemplate->template->parse("header");
$output = $xtemplate->template->text("header");
$output .= "\n<!-- begin content -->\n";
$output .= $content;
$output .= "\n<!-- end content -->\n";
if ($blocks = theme("blocks", "right")) {
$xtemplate->template->assign("blocks", $blocks);
$xtemplate->template->parse("footer.blocks");
}
// only parse the footer block if site_footer is set
if ($footer_message = variable_get("site_footer", FALSE)) {
$xtemplate->template->assign("footer_message", $footer_message);
$xtemplate->template->parse("footer.message");
}
$xtemplate->template->assign("footer", theme_closure());
$xtemplate->template->parse("footer");
$output .= $xtemplate->template->text("footer");
return $output;
}
function xtemplate_block(&$block) {
global $xtemplate;
// create template variables for all block variables (module, delta, region, subject, content, ...)
foreach ($block as $key => $value) {
$xtemplate->template->assign($key == "subject" ? "title" : $key, $value); // TODO: standardize on 'title' (ie. rename all $block["subject"] to "title")
}
$xtemplate->template->parse("block");
$output = $xtemplate->template->text("block");
$xtemplate->template->reset("block");
return $output;
}
function xtemplate_box($title, $content, $region = "main") {
global $xtemplate;
$xtemplate->template->assign(array(
"title" => $title,
"content" => $content));
$xtemplate->template->parse("box");
$output = $xtemplate->template->text("box");
$xtemplate->template->reset("box");
return $output;
}
?>

View File

@ -1,480 +1,480 @@
<?php
class XTemplate {
/*
xtemplate class 0.3pre
html generation with templates - fast & easy
copyright (c) 2000-2001 Barnabas Debreceni [cranx@users.sourceforge.net]
contributors:
Ivar Smolin <okul@linux.ee> (14-march-2001)
- made some code optimizations
Bert Jandehoop <bert.jandehoop@users.info.wau.nl> (26-june-2001)
- new feature to substitute template files by other templates
- new method array_loop()
!!! {FILE {VAR}} file variable interpolation may still be buggy !!!
latest stable & CVS versions always available @
http://sourceforge.net/projects/xtpl/
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public License
version 2.1 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details at
http://www.gnu.org/copyleft/lgpl.html
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
$Id$
*/
/***[ variables ]***********************************************************/
var $filecontents=""; /* raw contents of template file */
var $blocks=array(); /* unparsed blocks */
var $parsed_blocks=array(); /* parsed blocks */
var $preparsed_blocks=array(); /* preparsed blocks, for file includes */
var $block_parse_order=array(); /* block parsing order for recursive parsing (sometimes reverse:) */
var $sub_blocks=array(); /* store sub-block names for fast resetting */
var $VARS=array(); /* variables array */
var $FILEVARS=array(); /* file variables array */
var $filevar_parent=array(); /* filevars' parent block */
var $filecache=array(); /* file caching */
var $tpldir=""; /* location of template files */
var $FILES=null; /* file names lookup table */
var $file_delim="/\{FILE\s*\"([^\"]+)\"\s*\}/m"; /* regexp for file includes */
var $filevar_delim="/\{FILE\s*\{([A-Za-z0-9\._]+?)\}\s*\}/m"; /* regexp for file includes */
var $filevar_delim_nl="/^\s*\{FILE\s*\{([A-Za-z0-9\._]+?)\}\s*\}\s*\n/m"; /* regexp for file includes w/ newlines */
var $block_start_delim="<!-- "; /* block start delimiter */
var $block_end_delim="-->"; /* block end delimiter */
var $block_start_word="BEGIN:"; /* block start word */
var $block_end_word="END:"; /* block end word */
/* this makes the delimiters look like: <!-- BEGIN: block_name --> if you use my syntax. */
var $NULL_STRING=array(""=>""); /* null string for unassigned vars */
var $NULL_BLOCK=array(""=>""); /* null string for unassigned blocks */
var $mainblock="main";
var $ERROR="";
var $AUTORESET=1; /* auto-reset sub blocks */
/***[ constructor ]*********************************************************/
function XTemplate ($file,$tpldir="",$files=null,$mainblock="main") {
$this->tpldir = $tpldir;
if (gettype($files)=="array")
$this->FILES = $files;
$this->mainblock=$mainblock;
$this->filecontents=$this->r_getfile($file); /* read in template file */
$this->blocks=$this->maketree($this->filecontents,""); /* preprocess some stuff */
$this->filevar_parent=$this->store_filevar_parents($this->blocks);
$this->scan_globals();
}
/***************************************************************************/
/***[ public stuff ]********************************************************/
/***************************************************************************/
/***[ assign ]**************************************************************/
/*
assign a variable
*/
function assign ($name,$val="") {
if (gettype($name)=="array")
foreach ($name as $k=>$v)
$this->VARS[$k]=$v;
else
$this->VARS[$name]=$val;
}
/***[ assign_file ]*********************************************************/
/*
assign a file variable
*/
function assign_file ($name,$val="") {
if (gettype($name)=="array")
foreach ($name as $k=>$v)
$this->assign_file_($k,$v);
else
$this->assign_file_($name,$val);
}
function assign_file_ ($name,$val) {
if (isset($this->filevar_parent[$name])) {
if ($val!="") {
$val=$this->r_getfile($val);
foreach($this->filevar_parent[$name] as $parent) {
if (isset($this->preparsed_blocks[$parent]) and !isset($this->FILEVARS[$name]))
$copy=$this->preparsed_blocks[$parent];
else if (isset($this->blocks[$parent]))
$copy=$this->blocks[$parent];
preg_match_all($this->filevar_delim,$copy,$res,PREG_SET_ORDER);
foreach ($res as $v) {
$copy=preg_replace("/".preg_quote($v[0])."/","$val",$copy);
$this->preparsed_blocks=array_merge($this->preparsed_blocks,$this->maketree($copy,$parent));
$this->filevar_parent=array_merge($this->filevar_parent,$this->store_filevar_parents($this->preparsed_blocks));
}
}
}
}
$this->FILEVARS[$name]=$val;
}
/***[ parse ]***************************************************************/
/*
parse a block
*/
function parse ($bname) {
if (isset($this->preparsed_blocks[$bname])) {
$copy=$this->preparsed_blocks[$bname];
}
else if (isset($this->blocks[$bname]))
$copy=$this->blocks[$bname];
else
$this->set_error ("parse: blockname [$bname] does not exist");
/* from there we should have no more {FILE } directives */
$copy=preg_replace($this->filevar_delim_nl,"",$copy);
/* find & replace variables+blocks */
preg_match_all("/\{([A-Za-z0-9\._]+?)}/",$copy,$var_array);
$var_array=$var_array[1];
foreach ($var_array as $k=>$v) {
$sub=explode(".",$v);
if ($sub[0]=="_BLOCK_") {
unset($sub[0]);
$bname2=implode(".",$sub);
$var=$this->parsed_blocks[$bname2];
$nul=(!isset($this->NULL_BLOCK[$bname2])) ? $this->NULL_BLOCK[""] : $this->NULL_BLOCK[$bname2];
if ($var=="") {
if ($nul=="") {
$copy=preg_replace("/^\s*\{".$v."\}\s*\n*/m","",$copy);
} else {
$copy=preg_replace("/\{".$v."\}/","$nul",$copy);
}
} else {
$var=trim($var);
$copy=str_replace("\{$v}","$var",$copy);
}
} else {
$var=$this->VARS;
foreach ($sub as $v1)
$var=$var[$v1];
$nul=(!isset($this->NULL_STRING[$v])) ? ($this->NULL_STRING[""]) : ($this->NULL_STRING[$v]);
$var=(!isset($var))?$nul:$var;
if ($var=="")
$copy=preg_replace("/^\s*\{".$v."\}\s*\n/m","",$copy);
$copy=str_replace("\{$v}","$var",$copy);
}
}
if (empty($this->parsed_blocks[$bname])) $this->parsed_blocks[$bname] = null; // eliminates incremental assign error, when using E_ALL error reporting
$this->parsed_blocks[$bname].=$copy;
/* reset sub-blocks */
if ($this->AUTORESET && (!empty($this->sub_blocks[$bname]))) {
reset($this->sub_blocks[$bname]);
foreach ($this->sub_blocks[$bname] as $k=>$v)
$this->reset($v);
}
}
/***[ rparse ]**************************************************************/
/*
returns the parsed text for a block, including all sub-blocks.
*/
function rparse($bname) {
if (!empty($this->sub_blocks[$bname])) {
reset($this->sub_blocks[$bname]);
foreach ($this->sub_blocks[$bname] as $k=>$v)
if (!empty($v))
$this->rparse($v);
}
$this->parse($bname);
}
/***[ insert_loop ]*********************************************************/
/*
inserts a loop ( call assign & parse )
*/
function insert_loop($bname,$var,$value="") {
$this->assign($var,$value);
$this->parse($bname);
}
/***[ array_loop ]*********************************************************/
/*
parses a block for every set of data in the values array
*/
function array_loop($bname, $var, &$values)
{
if (gettype($values)=="array")
{
foreach($values as $v)
{
$this->assign($var, $v);
$this->parse($bname);
}
}
}
/***[ text ]****************************************************************/
/*
returns the parsed text for a block
*/
function text($bname) {
return $this->parsed_blocks[isset($bname) ? $bname :$this->mainblock];
}
/***[ out ]*****************************************************************/
/*
prints the parsed text
*/
function out ($bname) {
$length=strlen($this->text($bname));
header("Content-Length: ".$length);
echo $this->text($bname);
}
/***[ reset ]***************************************************************/
/*
resets the parsed text
*/
function reset ($bname) {
$this->parsed_blocks[$bname]="";
}
/***[ parsed ]**************************************************************/
/*
returns true if block was parsed, false if not
*/
function parsed ($bname) {
return (!empty($this->parsed_blocks[$bname]));
}
/***[ SetNullString ]*******************************************************/
/*
sets the string to replace in case the var was not assigned
*/
function SetNullString($str,$varname="") {
$this->NULL_STRING[$varname]=$str;
}
/***[ SetNullBlock ]********************************************************/
/*
sets the string to replace in case the block was not parsed
*/
function SetNullBlock($str,$bname="") {
$this->NULL_BLOCK[$bname]=$str;
}
/***[ set_autoreset ]*******************************************************/
/*
sets AUTORESET to 1. (default is 1)
if set to 1, parse() automatically resets the parsed blocks' sub blocks
(for multiple level blocks)
*/
function set_autoreset() {
$this->AUTORESET=1;
}
/***[ clear_autoreset ]*****************************************************/
/*
sets AUTORESET to 0. (default is 1)
if set to 1, parse() automatically resets the parsed blocks' sub blocks
(for multiple level blocks)
*/
function clear_autoreset() {
$this->AUTORESET=0;
}
/***[ scan_globals ]********************************************************/
/*
scans global variables
*/
function scan_globals() {
reset($GLOBALS);
foreach ($GLOBALS as $k=>$v)
$GLOB[$k]=$v;
$this->assign("PHP",$GLOB); /* access global variables as {PHP.HTTP_HOST} in your template! */
}
/******
WARNING
PUBLIC FUNCTIONS BELOW THIS LINE DIDN'T GET TESTED
******/
/***************************************************************************/
/***[ private stuff ]*******************************************************/
/***************************************************************************/
/***[ maketree ]************************************************************/
/*
generates the array containing to-be-parsed stuff:
$blocks["main"],$blocks["main.table"],$blocks["main.table.row"], etc.
also builds the reverse parse order.
*/
function maketree($con,$parentblock="") {
$blocks=array();
$con2=explode($this->block_start_delim,$con);
if (!empty($parentblock)) {
$block_names=explode(".",$parentblock);
$level=sizeof($block_names);
} else {
$block_names=array();
$level=0;
}
foreach ($con2 as $k=>$v) {
$patt="($this->block_start_word|$this->block_end_word)\s*(\w+)\s*$this->block_end_delim(.*)";
if (preg_match_all("/$patt/ims",$v,$res,PREG_SET_ORDER)) {
// $res[0][1] = BEGIN or END
// $res[0][2] = block name
// $res[0][3] = kinda content
if ($res[0][1]==$this->block_start_word) {
$parent_name=implode(".",$block_names);
$block_names[++$level]=$res[0][2]; /* add one level - array("main","table","row")*/
$cur_block_name=implode(".",$block_names); /* make block name (main.table.row) */
$this->block_parse_order[]=$cur_block_name; /* build block parsing order (reverse) */
if (empty($blocks[$cur_block_name])) $blocks[$cur_block_name] = null; // eliminates incremental assign error, when using E_ALL error reporting
$blocks[$cur_block_name].=$res[0][3]; /* add contents */
$blocks[$parent_name].="{_BLOCK_.$cur_block_name}"; /* add {_BLOCK_.blockname} string to parent block */
$this->sub_blocks[$parent_name][]=$cur_block_name; /* store sub block names for autoresetting and recursive parsing */
$this->sub_blocks[$cur_block_name][]=""; /* store sub block names for autoresetting */
} else if ($res[0][1]==$this->block_end_word) {
unset($block_names[$level--]);
$parent_name=implode(".",$block_names);
$blocks[$parent_name].=$res[0][3]; /* add rest of block to parent block */
}
} else { /* no block delimiters found */
if ($k)
$blocks[implode(".",$block_names)].=$this->block_start_delim;
if (empty($blocks[implode(".",$block_names)])) $blocks[implode(".",$block_names)] = null; // eliminates incremental assign error, when using E_ALL error reporting
$blocks[implode(".",$block_names)].=$v;
}
}
return $blocks;
}
/***[ store_filevar_parents ]***********************************************/
/*
store container block's name for file variables
*/
function store_filevar_parents($blocks){
$parents=array();
foreach ($blocks as $bname=>$con) {
preg_match_all($this->filevar_delim,$con,$res);
foreach ($res[1] as $k=>$v)
$parents[$v][]=$bname;
}
return $parents;
}
/***[ error stuff ]*********************************************************/
/*
sets and gets error
*/
function get_error() {
return ($this->ERROR=="")?0:$this->ERROR;
}
function set_error($str) {
$this->ERROR="<strong>[XTemplate]</strong>&nbsp;<i>".$str."</i>";
trigger_error($this->get_error());
}
/***[ getfile ]*************************************************************/
/*
returns the contents of a file
*/
function getfile($file) {
if (!isset($file)) {
$this->set_error("!isset file name!");
return "";
}
// check if filename is mapped to other filename
if (isset($this->FILES))
{
if (isset($this->FILES[$file]))
$file = $this->FILES[$file];
}
// prepend template dir
if (!empty($this->tpldir))
$file = $this->tpldir."/".$file;
if (isset($this->filecache[$file]))
$file_text=$this->filecache[$file];
else {
if (is_file($file)) {
if (!($fh=fopen($file,"r"))) {
$this->set_error("Cannot open file: $file");
return "";
}
$file_text=fread($fh,filesize($file));
fclose($fh);
} else {
$this->set_error("[$file] does not exist");
$file_text="<strong>__XTemplate fatal error: file [$file] does not exist__</strong>";
}
$this->filecache[$file]=$file_text;
}
return $file_text;
}
/***[ r_getfile ]***********************************************************/
/*
recursively gets the content of a file with {FILE "filename.tpl"} directives
*/
function r_getfile($file) {
$text=$this->getfile($file);
while (preg_match($this->file_delim,$text,$res)) {
$text2=$this->getfile($res[1]);
$text=preg_replace("'".preg_quote($res[0])."'",$text2,$text);
}
return $text;
}
} /* end of XTemplate class. */
?>
<?php
class XTemplate {
/*
xtemplate class 0.3pre
html generation with templates - fast & easy
copyright (c) 2000-2001 Barnabas Debreceni [cranx@users.sourceforge.net]
contributors:
Ivar Smolin <okul@linux.ee> (14-march-2001)
- made some code optimizations
Bert Jandehoop <bert.jandehoop@users.info.wau.nl> (26-june-2001)
- new feature to substitute template files by other templates
- new method array_loop()
!!! {FILE {VAR}} file variable interpolation may still be buggy !!!
latest stable & CVS versions always available @
http://sourceforge.net/projects/xtpl/
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public License
version 2.1 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details at
http://www.gnu.org/copyleft/lgpl.html
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
$Id$
*/
/***[ variables ]***********************************************************/
var $filecontents=""; /* raw contents of template file */
var $blocks=array(); /* unparsed blocks */
var $parsed_blocks=array(); /* parsed blocks */
var $preparsed_blocks=array(); /* preparsed blocks, for file includes */
var $block_parse_order=array(); /* block parsing order for recursive parsing (sometimes reverse:) */
var $sub_blocks=array(); /* store sub-block names for fast resetting */
var $VARS=array(); /* variables array */
var $FILEVARS=array(); /* file variables array */
var $filevar_parent=array(); /* filevars' parent block */
var $filecache=array(); /* file caching */
var $tpldir=""; /* location of template files */
var $FILES=null; /* file names lookup table */
var $file_delim="/\{FILE\s*\"([^\"]+)\"\s*\}/m"; /* regexp for file includes */
var $filevar_delim="/\{FILE\s*\{([A-Za-z0-9\._]+?)\}\s*\}/m"; /* regexp for file includes */
var $filevar_delim_nl="/^\s*\{FILE\s*\{([A-Za-z0-9\._]+?)\}\s*\}\s*\n/m"; /* regexp for file includes w/ newlines */
var $block_start_delim="<!-- "; /* block start delimiter */
var $block_end_delim="-->"; /* block end delimiter */
var $block_start_word="BEGIN:"; /* block start word */
var $block_end_word="END:"; /* block end word */
/* this makes the delimiters look like: <!-- BEGIN: block_name --> if you use my syntax. */
var $NULL_STRING=array(""=>""); /* null string for unassigned vars */
var $NULL_BLOCK=array(""=>""); /* null string for unassigned blocks */
var $mainblock="main";
var $ERROR="";
var $AUTORESET=1; /* auto-reset sub blocks */
/***[ constructor ]*********************************************************/
function XTemplate ($file,$tpldir="",$files=null,$mainblock="main") {
$this->tpldir = $tpldir;
if (gettype($files)=="array")
$this->FILES = $files;
$this->mainblock=$mainblock;
$this->filecontents=$this->r_getfile($file); /* read in template file */
$this->blocks=$this->maketree($this->filecontents,""); /* preprocess some stuff */
$this->filevar_parent=$this->store_filevar_parents($this->blocks);
$this->scan_globals();
}
/***************************************************************************/
/***[ public stuff ]********************************************************/
/***************************************************************************/
/***[ assign ]**************************************************************/
/*
assign a variable
*/
function assign ($name,$val="") {
if (gettype($name)=="array")
foreach ($name as $k=>$v)
$this->VARS[$k]=$v;
else
$this->VARS[$name]=$val;
}
/***[ assign_file ]*********************************************************/
/*
assign a file variable
*/
function assign_file ($name,$val="") {
if (gettype($name)=="array")
foreach ($name as $k=>$v)
$this->assign_file_($k,$v);
else
$this->assign_file_($name,$val);
}
function assign_file_ ($name,$val) {
if (isset($this->filevar_parent[$name])) {
if ($val!="") {
$val=$this->r_getfile($val);
foreach($this->filevar_parent[$name] as $parent) {
if (isset($this->preparsed_blocks[$parent]) and !isset($this->FILEVARS[$name]))
$copy=$this->preparsed_blocks[$parent];
else if (isset($this->blocks[$parent]))
$copy=$this->blocks[$parent];
preg_match_all($this->filevar_delim,$copy,$res,PREG_SET_ORDER);
foreach ($res as $v) {
$copy=preg_replace("/".preg_quote($v[0])."/","$val",$copy);
$this->preparsed_blocks=array_merge($this->preparsed_blocks,$this->maketree($copy,$parent));
$this->filevar_parent=array_merge($this->filevar_parent,$this->store_filevar_parents($this->preparsed_blocks));
}
}
}
}
$this->FILEVARS[$name]=$val;
}
/***[ parse ]***************************************************************/
/*
parse a block
*/
function parse ($bname) {
if (isset($this->preparsed_blocks[$bname])) {
$copy=$this->preparsed_blocks[$bname];
}
else if (isset($this->blocks[$bname]))
$copy=$this->blocks[$bname];
else
$this->set_error ("parse: blockname [$bname] does not exist");
/* from there we should have no more {FILE } directives */
$copy=preg_replace($this->filevar_delim_nl,"",$copy);
/* find & replace variables+blocks */
preg_match_all("/\{([A-Za-z0-9\._]+?)}/",$copy,$var_array);
$var_array=$var_array[1];
foreach ($var_array as $k=>$v) {
$sub=explode(".",$v);
if ($sub[0]=="_BLOCK_") {
unset($sub[0]);
$bname2=implode(".",$sub);
$var=$this->parsed_blocks[$bname2];
$nul=(!isset($this->NULL_BLOCK[$bname2])) ? $this->NULL_BLOCK[""] : $this->NULL_BLOCK[$bname2];
if ($var=="") {
if ($nul=="") {
$copy=preg_replace("/^\s*\{".$v."\}\s*\n*/m","",$copy);
} else {
$copy=preg_replace("/\{".$v."\}/","$nul",$copy);
}
} else {
$var=trim($var);
$copy=str_replace("\{$v}","$var",$copy);
}
} else {
$var=$this->VARS;
foreach ($sub as $v1)
$var=$var[$v1];
$nul=(!isset($this->NULL_STRING[$v])) ? ($this->NULL_STRING[""]) : ($this->NULL_STRING[$v]);
$var=(!isset($var))?$nul:$var;
if ($var=="")
$copy=preg_replace("/^\s*\{".$v."\}\s*\n/m","",$copy);
$copy=str_replace("\{$v}","$var",$copy);
}
}
if (empty($this->parsed_blocks[$bname])) $this->parsed_blocks[$bname] = null; // eliminates incremental assign error, when using E_ALL error reporting
$this->parsed_blocks[$bname].=$copy;
/* reset sub-blocks */
if ($this->AUTORESET && (!empty($this->sub_blocks[$bname]))) {
reset($this->sub_blocks[$bname]);
foreach ($this->sub_blocks[$bname] as $k=>$v)
$this->reset($v);
}
}
/***[ rparse ]**************************************************************/
/*
returns the parsed text for a block, including all sub-blocks.
*/
function rparse($bname) {
if (!empty($this->sub_blocks[$bname])) {
reset($this->sub_blocks[$bname]);
foreach ($this->sub_blocks[$bname] as $k=>$v)
if (!empty($v))
$this->rparse($v);
}
$this->parse($bname);
}
/***[ insert_loop ]*********************************************************/
/*
inserts a loop ( call assign & parse )
*/
function insert_loop($bname,$var,$value="") {
$this->assign($var,$value);
$this->parse($bname);
}
/***[ array_loop ]*********************************************************/
/*
parses a block for every set of data in the values array
*/
function array_loop($bname, $var, &$values)
{
if (gettype($values)=="array")
{
foreach($values as $v)
{
$this->assign($var, $v);
$this->parse($bname);
}
}
}
/***[ text ]****************************************************************/
/*
returns the parsed text for a block
*/
function text($bname) {
return $this->parsed_blocks[isset($bname) ? $bname :$this->mainblock];
}
/***[ out ]*****************************************************************/
/*
prints the parsed text
*/
function out ($bname) {
$length=strlen($this->text($bname));
header("Content-Length: ".$length);
echo $this->text($bname);
}
/***[ reset ]***************************************************************/
/*
resets the parsed text
*/
function reset ($bname) {
$this->parsed_blocks[$bname]="";
}
/***[ parsed ]**************************************************************/
/*
returns true if block was parsed, false if not
*/
function parsed ($bname) {
return (!empty($this->parsed_blocks[$bname]));
}
/***[ SetNullString ]*******************************************************/
/*
sets the string to replace in case the var was not assigned
*/
function SetNullString($str,$varname="") {
$this->NULL_STRING[$varname]=$str;
}
/***[ SetNullBlock ]********************************************************/
/*
sets the string to replace in case the block was not parsed
*/
function SetNullBlock($str,$bname="") {
$this->NULL_BLOCK[$bname]=$str;
}
/***[ set_autoreset ]*******************************************************/
/*
sets AUTORESET to 1. (default is 1)
if set to 1, parse() automatically resets the parsed blocks' sub blocks
(for multiple level blocks)
*/
function set_autoreset() {
$this->AUTORESET=1;
}
/***[ clear_autoreset ]*****************************************************/
/*
sets AUTORESET to 0. (default is 1)
if set to 1, parse() automatically resets the parsed blocks' sub blocks
(for multiple level blocks)
*/
function clear_autoreset() {
$this->AUTORESET=0;
}
/***[ scan_globals ]********************************************************/
/*
scans global variables
*/
function scan_globals() {
reset($GLOBALS);
foreach ($GLOBALS as $k=>$v)
$GLOB[$k]=$v;
$this->assign("PHP",$GLOB); /* access global variables as {PHP.HTTP_HOST} in your template! */
}
/******
WARNING
PUBLIC FUNCTIONS BELOW THIS LINE DIDN'T GET TESTED
******/
/***************************************************************************/
/***[ private stuff ]*******************************************************/
/***************************************************************************/
/***[ maketree ]************************************************************/
/*
generates the array containing to-be-parsed stuff:
$blocks["main"],$blocks["main.table"],$blocks["main.table.row"], etc.
also builds the reverse parse order.
*/
function maketree($con,$parentblock="") {
$blocks=array();
$con2=explode($this->block_start_delim,$con);
if (!empty($parentblock)) {
$block_names=explode(".",$parentblock);
$level=sizeof($block_names);
} else {
$block_names=array();
$level=0;
}
foreach ($con2 as $k=>$v) {
$patt="($this->block_start_word|$this->block_end_word)\s*(\w+)\s*$this->block_end_delim(.*)";
if (preg_match_all("/$patt/ims",$v,$res,PREG_SET_ORDER)) {
// $res[0][1] = BEGIN or END
// $res[0][2] = block name
// $res[0][3] = kinda content
if ($res[0][1]==$this->block_start_word) {
$parent_name=implode(".",$block_names);
$block_names[++$level]=$res[0][2]; /* add one level - array("main","table","row")*/
$cur_block_name=implode(".",$block_names); /* make block name (main.table.row) */
$this->block_parse_order[]=$cur_block_name; /* build block parsing order (reverse) */
if (empty($blocks[$cur_block_name])) $blocks[$cur_block_name] = null; // eliminates incremental assign error, when using E_ALL error reporting
$blocks[$cur_block_name].=$res[0][3]; /* add contents */
$blocks[$parent_name].="{_BLOCK_.$cur_block_name}"; /* add {_BLOCK_.blockname} string to parent block */
$this->sub_blocks[$parent_name][]=$cur_block_name; /* store sub block names for autoresetting and recursive parsing */
$this->sub_blocks[$cur_block_name][]=""; /* store sub block names for autoresetting */
} else if ($res[0][1]==$this->block_end_word) {
unset($block_names[$level--]);
$parent_name=implode(".",$block_names);
$blocks[$parent_name].=$res[0][3]; /* add rest of block to parent block */
}
} else { /* no block delimiters found */
if ($k)
$blocks[implode(".",$block_names)].=$this->block_start_delim;
if (empty($blocks[implode(".",$block_names)])) $blocks[implode(".",$block_names)] = null; // eliminates incremental assign error, when using E_ALL error reporting
$blocks[implode(".",$block_names)].=$v;
}
}
return $blocks;
}
/***[ store_filevar_parents ]***********************************************/
/*
store container block's name for file variables
*/
function store_filevar_parents($blocks){
$parents=array();
foreach ($blocks as $bname=>$con) {
preg_match_all($this->filevar_delim,$con,$res);
foreach ($res[1] as $k=>$v)
$parents[$v][]=$bname;
}
return $parents;
}
/***[ error stuff ]*********************************************************/
/*
sets and gets error
*/
function get_error() {
return ($this->ERROR=="")?0:$this->ERROR;
}
function set_error($str) {
$this->ERROR="<strong>[XTemplate]</strong>&nbsp;<i>".$str."</i>";
trigger_error($this->get_error());
}
/***[ getfile ]*************************************************************/
/*
returns the contents of a file
*/
function getfile($file) {
if (!isset($file)) {
$this->set_error("!isset file name!");
return "";
}
// check if filename is mapped to other filename
if (isset($this->FILES))
{
if (isset($this->FILES[$file]))
$file = $this->FILES[$file];
}
// prepend template dir
if (!empty($this->tpldir))
$file = $this->tpldir."/".$file;
if (isset($this->filecache[$file]))
$file_text=$this->filecache[$file];
else {
if (is_file($file)) {
if (!($fh=fopen($file,"r"))) {
$this->set_error("Cannot open file: $file");
return "";
}
$file_text=fread($fh,filesize($file));
fclose($fh);
} else {
$this->set_error("[$file] does not exist");
$file_text="<strong>__XTemplate fatal error: file [$file] does not exist__</strong>";
}
$this->filecache[$file]=$file_text;
}
return $file_text;
}
/***[ r_getfile ]***********************************************************/
/*
recursively gets the content of a file with {FILE "filename.tpl"} directives
*/
function r_getfile($file) {
$text=$this->getfile($file);
while (preg_match($this->file_delim,$text,$res)) {
$text2=$this->getfile($res[1]);
$text=preg_replace("'".preg_quote($res[0])."'",$text2,$text);
}
return $text;
}
} /* end of XTemplate class. */
?>

View File

@ -1,18 +0,0 @@
<?php
// $Id$
function example_help($section) {
$output = "";
switch ($section) {
case 'admin/themes#description':
$output = t("Internet explorer, Netscape, Opera, Lynx");
break;
}
return $output;
}
?>

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 711 B

After

Width:  |  Height:  |  Size: 711 B

View File

Before

Width:  |  Height:  |  Size: 440 B

After

Width:  |  Height:  |  Size: 440 B

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Before

Width:  |  Height:  |  Size: 310 B

After

Width:  |  Height:  |  Size: 310 B

View File

Before

Width:  |  Height:  |  Size: 317 B

After

Width:  |  Height:  |  Size: 317 B

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 950 B

After

Width:  |  Height:  |  Size: 950 B

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 103 B

After

Width:  |  Height:  |  Size: 103 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -1,141 +1,163 @@
<!-- BEGIN: header --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>{head_title}</title>
{head}
<style type="text/css" media="all">@import "{directory}/xtemplate.css";</style>
</head>
<body bgcolor="#ffffff" {onload_attributes}>
<div class="hide"><a href="#content" title="Skip navigation." accesskey="2">Skip navigation</a>.</div>
<table id="primary-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td id="home" width="10%"><a href="./" title="Home"><img src="{directory}/logo.png" alt="Home" width="144" height="63" border="0" /></a></td>
<td class="primary-links" width="90%" align="center" valign="middle">{primary_links}</td>
</tr>
</table>
<table id="secondary-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="secondary-links" width="75%" align="center" valign="middle">
{secondary_links}
</td>
<td width="25%" align="center" valign="middle">
<!-- BEGIN: search_box -->
<form action="{search_url}" method="post">
<div id="search">
<input class="form-text" type="text" size="15" value="" name="keys" alt="{search_description}" />
<input class="form-submit" type="submit" value="{search_button_text}" alt="submit" />
</div>
</form>
<!-- END: search_box -->
</td>
</tr>
</table>
<table id="content" border="0" cellpadding="15" cellspacing="0" width="100%">
<tr>
<!-- BEGIN: blocks -->
<td id="sidebar-left">
{blocks}
</td>
<!-- END: blocks -->
<td valign="top">
<!-- BEGIN: mission -->
<div id="mission">{mission}</div>
<!-- END: mission -->
<div id="main">
<!-- BEGIN: title -->
{breadcrumb}
<h1 class="title">{title}</h1>
<!-- BEGIN: tabs -->
<div class="tabs">{tabs}</div>
<!-- END: tabs -->
<!-- END: title -->
<!-- BEGIN: help -->
<div id="help">{help}</div>
<!-- END: help -->
<!-- BEGIN: message -->
{message}
<!-- END: message -->
<!-- END: header -->
<!-- BEGIN: node -->
<div class="node {sticky}">
<!-- BEGIN: picture -->
{picture}
<!-- END: picture -->
<!-- BEGIN: title -->
<h1 class="title"><a href="{link}">{title}</a></h1>
<!-- END: title -->
<span class="submitted">{submitted}</span>
<!-- BEGIN: taxonomy -->
<span class="taxonomy">{taxonomy}</span>
<!-- END: taxonomy -->
<div class="content">{content}</div>
<!-- BEGIN: links -->
<div class="links">&raquo; {links}</div>
<!-- END: links -->
</div>
<!-- END: node -->
<!-- BEGIN: comment -->
<div class="comment">
<!-- BEGIN: picture -->
{picture}
<!-- END: picture -->
<h3 class="title">{title}</h3>
<div class="submitted">{submitted}<!-- BEGIN: new --><span class="new"> *{new}</span><!-- END: new --></div>
<div class="content">{content}</div>
<!-- BEGIN: links -->
<div class="links">&raquo; {links}</div>
<!-- END: links -->
</div>
<!-- END: comment -->
<!-- BEGIN: box -->
<div class="box">
<h2 class="title">{title}</h2>
<div class="content">{content}</div>
</div>
<!-- END: box -->
<!-- BEGIN: block -->
<div class="block block-{module}" id="block-{module}-{delta}">
<div class="title"><h3>{title}</h3></div>
<div class="content">{content}</div>
</div>
<!-- END: block -->
<!-- BEGIN: footer -->
</div><!-- main -->
</td>
<!-- BEGIN: blocks -->
<td id="sidebar-right">
{blocks}
</td>
<!-- END: blocks -->
</tr>
</table>
<table id="footer-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td align="center" valign="middle">
<div class="primary-links">{primary_links}</div>
<div class="secondary-links">{secondary_links}</div>
</td>
</tr>
</table>
<!-- BEGIN: message -->
<div id="footer-message">
{footer_message}
</div>
<!-- END: message -->
{footer}
</body>
</html>
<!-- END: footer -->
<!-- BEGIN: header --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>{head_title}</title>
{head}
</head>
<body bgcolor="#ffffff" {onload_attributes}>
<div class="hide"><a href="#content" title="Skip navigation." accesskey="2">Skip navigation</a>.</div>
<table id="primary-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td id="home" width="10%">
<!-- BEGIN: logo -->
<a href="./" title="Home"><img src="{logo}" alt="Home" width="144" height="63" border="0" /></a>
<!-- END: logo -->
</td>
<td id="site-info" width="20%">
<!-- BEGIN: site_name -->
<div class='site-name'><a href="./" title="Home">{site_name}</a></div>
<!-- END: site_name -->
<!-- BEGIN: site_slogan -->
<div class='site-slogan'>{site_slogan}</div>
<!-- END: site_slogan -->
</td>
<td class="primary-links" width="70%" align="center" valign="middle">
{primary_links}
</td>
</tr>
</table>
<table id="secondary-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="secondary-links" width="75%" align="center" valign="middle">
{secondary_links}
</td>
<td width="25%" align="center" valign="middle">
<!-- BEGIN: search_box -->
<form action="{search_url}" method="post">
<div id="search">
<input class="form-text" type="text" size="15" value="" name="keys" alt="{search_description}" />
<input class="form-submit" type="submit" value="{search_button_text}" alt="submit" />
</div>
</form>
<!-- END: search_box -->
</td>
</tr>
</table>
<table id="content" border="0" cellpadding="15" cellspacing="0" width="100%">
<tr>
<!-- BEGIN: blocks -->
<td id="sidebar-left">
{blocks}
</td>
<!-- END: blocks -->
<td valign="top">
<!-- BEGIN: mission -->
<div id="mission">{mission}</div>
<!-- END: mission -->
<div id="main">
<!-- BEGIN: title -->
{breadcrumb}
<h1 class="title">{title}</h1>
<!-- BEGIN: tabs -->
<div class="tabs">{tabs}</div>
<!-- END: tabs -->
<!-- END: title -->
<!-- BEGIN: help -->
<div id="help">{help}</div>
<!-- END: help -->
<!-- BEGIN: message -->
{message}
<!-- END: message -->
<!-- END: header -->
<!-- BEGIN: node -->
<div class="node {sticky}">
<!-- BEGIN: picture -->
{picture}
<!-- END: picture -->
<!-- BEGIN: title -->
<h1 class="title"><a href="{link}">{title}</a></h1>
<!-- END: title -->
<span class="submitted">{submitted}</span>
<!-- BEGIN: taxonomy -->
<span class="taxonomy">{taxonomy}</span>
<!-- END: taxonomy -->
<div class="content">{content}</div>
<!-- BEGIN: links -->
<div class="links">&raquo; {links}</div>
<!-- END: links -->
</div>
<!-- END: node -->
<!-- BEGIN: comment -->
<div class="comment">
<!-- BEGIN: picture -->
{picture}
<!-- END: picture -->
<h3 class="title">{title}</h3>
<div class="submitted">{submitted}<!-- BEGIN: new --><span class="new"> *{new}</span><!-- END: new --></div>
<div class="content">{content}</div>
<!-- BEGIN: links -->
<div class="links">&raquo; {links}</div>
<!-- END: links -->
</div>
<!-- END: comment -->
<!-- BEGIN: box -->
<div class="box">
<h2 class="title">{title}</h2>
<div class="content">{content}</div>
</div>
<!-- END: box -->
<!-- BEGIN: block -->
<div class="block block-{module}" id="block-{module}-{delta}">
<div class="title"><h3>{title}</h3></div>
<div class="content">{content}</div>
</div>
<!-- END: block -->
<!-- BEGIN: footer -->
</div><!-- main -->
</td>
<!-- BEGIN: blocks -->
<td id="sidebar-right">
{blocks}
</td>
<!-- END: blocks -->
</tr>
</table>
<table id="footer-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td align="center" valign="middle">
<div class="primary-links">{primary_links}</div>
<div class="secondary-links">{secondary_links}</div>
</td>
</tr>
</table>
<!-- BEGIN: message -->
<div id="footer-message">
{footer_message}
</div>
<!-- END: message -->
{footer}
</body>
</html>
<!-- END: footer -->

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B