Posted by KrisBulman on August 1, 2011 at 5:15pm
7 followers
| Project: | AdaptiveTheme |
| Version: | 7.x-3.x-dev |
| Component: | CSS/HTML |
| Category: | task |
| Priority: | normal |
| Assigned: | Unassigned |
| Status: | active |
Issue Summary
This needs a little work, but currently it will create a new subtheme within the adaptivetheme directory (although it should be created outside of it, in the standard themes dir).
This file should be called adaptivetheme.drush.inc and be placed in your ~/.drush folder for drush 4.4, anything later than 4.4 (4.x dev), this file can remain inside the adaptivetheme directory and will be available to drush.
The command to invoke it is:
drush adaptivetheme "Your Theme Name" yourthemenameadaptivetheme.drush.inc
<?php
/**
* @file
* Contains functions only needed for drush integration.
*/
/**
* Implementation of hook_drush_command().
*/
function adaptivetheme_drush_command() {
$items = array();
$items['adaptivetheme'] = array(
'description' => 'Create a theme using adaptivetheme.',
'arguments' => array(
'name' => 'A name for your theme.',
'machine_name' => '[optional] A machine-readable name for your theme.',
),
'options' => array(
'name' => 'A name for your theme.',
'machine-name' => '[a-z, 0-9] A machine-readable name for your theme.',
'description' => 'A description of your theme.',
'without-rtl' => 'Remove all RTL stylesheets.',
),
'examples' => array(
'drush adaptivetheme "My theme name"' => 'Create a sub-theme, using the default options.',
'drush adaptivetheme "My theme name" my_theme' => 'Create a sub-theme with a specific machine name.',
),
);
return $items;
}
/**
* Create a adaptivetheme sub-theme using the existing sub theme.
*/
function drush_adaptivetheme($name = NULL, $machine_name = NULL) {
// Determine the theme name.
if (!isset($name)) {
$name = drush_get_option('name');
}
// Determine the machine name.
if (!isset($machine_name)) {
$machine_name = drush_get_option('machine-name');
}
if (!$machine_name) {
$machine_name = $name;
}
$machine_name = str_replace(' ', '_', strtolower($machine_name));
$search = array(
'/[^a-z0-9_]/', // Remove characters not valid in function names.
'/^[^a-z]+/', // Functions must begin with an alpha character.
);
$machine_name = preg_replace($search, '', $machine_name);
// Determine the path to the new subtheme by finding the path to adaptivetheme_subtheme.
$adaptivetheme_subtheme_path = drush_locate_root() . '/' . drupal_get_path('theme', 'adaptivetheme_subtheme');
$subtheme_path = explode('/', $adaptivetheme_subtheme_path);
array_pop($subtheme_path);
$subtheme_path = implode('/', $subtheme_path) . '/' . str_replace('_', '-', $machine_name);
// Make a fresh copy of the original starter kit.
drush_op('adaptivetheme_copy', $adaptivetheme_subtheme_path . '/', $subtheme_path);
// Rename the .info file.
$subtheme_info_file = $subtheme_path . '/' . $machine_name . '.info';
drush_op('rename', $subtheme_path . '/adaptivetheme_subtheme.info', $subtheme_info_file);
// Alter the contents of the .info file based on the command options.
$alterations = array(
'= AT Subtheme' => '= ' . $name,
);
if ($description = drush_get_option('description')) {
$alterations['Starter subtheme for Adaptivetheme. Copy this subtheme to get started building your own Drupal theme. For help see our <b><a href="http://adaptivethemes.com/documentation/base-theme">documentation</a></b> and <b><a href="http://vimeo.com/channels/61157">video tutorials</a></b>. If you have a problem and need additional help please use the <b><a href="http://drupal.org/project/issues/adaptivetheme">issue queue</a></b>.'] = $description;
}
drush_op('adaptivetheme_file_str_replace', $subtheme_info_file, array_keys($alterations), $alterations);
// Replace all occurrences of 'adaptivetheme_subtheme' with the machine name of our sub theme.
drush_op('adaptivetheme_file_str_replace', $subtheme_path . '/theme-settings.php', 'adaptivetheme_subtheme', $machine_name);
drush_op('adaptivetheme_file_str_replace', $subtheme_path . '/template.php', 'adaptivetheme_subtheme', $machine_name);
// Remove all RTL stylesheets.
if ($without_rtl = drush_get_option('without-rtl')) {
foreach (array('forms', 'html-reset', 'layout-fixed', 'layout-liquid', 'navigation', 'pages', 'tabs') as $file) {
// Remove the RTL stylesheet.
drush_op('unlink', $subtheme_path . '/css/' . $file . '-rtl.css');
drush_op('adaptivetheme_file_str_replace', $subtheme_path . '/css/' . $file . '.css', ' /* LTR */', '');
}
}
// Notify user of the newly created theme.
drush_print(dt('Starter kit for "!name" created in: !path', array(
'!name' => $name,
'!path' => $subtheme_path,
)));
}
/**
* Copy a directory recursively.
*/
function adaptivetheme_copy($source_dir, $target_dir, $ignore = '/^(\.(\.)?|CVS|\.svn|\.git|\.DS_Store)$/') {
if (!is_dir($source_dir)) {
drush_die(dt('The directory "!directory" was not found.', array('!directory' => $source_dir)));
}
$dir = opendir($source_dir);
@mkdir($target_dir);
while($file = readdir($dir)) {
if (!preg_match($ignore, $file)) {
if (is_dir($source_dir . '/' . $file)) {
adaptivetheme_copy($source_dir . '/' . $file, $target_dir . '/' . $file, $ignore);
}
else {
copy($source_dir . '/' . $file, $target_dir . '/' . $file);
}
}
}
closedir($dir);
}
/**
* Replace strings in a file.
*/
function adaptivetheme_file_str_replace($file_path, $find, $replace) {
$file_contents = file_get_contents($file_path);
$file_contents = str_replace($find, $replace, $file_contents);
file_put_contents($file_path, $file_contents);
}This is an adaptation of John Albin's zen.drush.inc in the 7.x-5.x release
Comments
#1
Subscribe, cool, I'll give this a go, be good if we can get it to generate the subtheme in the themes directory rather than inside the actual theme folder.
#2
The line that reads:
$subtheme_path = implode('/', $subtheme_path) . '/' . str_replace('_', '-', $machine_name);could actually be:
$subtheme_path = implode('/', $subtheme_path) . '/../' . str_replace('_', '-', $machine_name);and it will output the theme outside of the adaptive theme directory, BUT it also changes the successful print message to:
drupal-7.2/sites/all/themes/adaptivetheme/../themenamethere's likely a better solution.
#3
Found strange behaviour:
if I use
drush adaptivetheme "Test1" test1-test2it will create a directory named "test1test2" (without dash)
However if I use
drush adaptivetheme "Test2" test1_test2it will create a directory named "test1-test2" (now with dash, even though I used underscore)
#4
Thanks so much @KrisBulman!
Regarding the directory... why not just array_pop($subtheme_path) twice? (though there's probably a cleaner way to do this with some array_xyz function).
Also, you may want to make sure a "name" value is present. drush_get_option('name') wasn't returning anything on my system.
<?phpfunction drush_adaptivetheme($name = NULL, $machine_name = NULL) {
// Determine the theme name.
if (!isset($name)) {
if (!$name = drush_get_option('name')) {
drush_print(dt('Please specify a name!' . "\n" . 'e.g., drush adaptivetheme "Your Theme Name" yourthemename'));
return;
}
}
?>
Also, @Stan, you should use an _ instead of - in your machine name. In the file I've attached I updated the options description for this field.
I've attached the version I'm currently using.
Again,
Thanks -- this will save me lots of time!
#5
I would love if this was updated to work with the latest version, bumping for visibility and changing to task, I would really love this to be in the theme in 3.x