1 |
87dbc3bf
|
Benjamin Luce
|
<?php
|
2 |
|
|
/**
|
3 |
|
|
* @file
|
4 |
|
|
* Contains functions only needed for drush integration.
|
5 |
|
|
*/
|
6 |
|
|
|
7 |
|
|
/**
|
8 |
|
|
* Implementation of hook_drush_command().
|
9 |
|
|
*/
|
10 |
|
|
function zen_drush_command() {
|
11 |
|
|
$items = array();
|
12 |
|
|
|
13 |
|
|
$items['zen'] = array(
|
14 |
|
|
'description' => 'Create a theme using Zen.',
|
15 |
|
|
'arguments' => array(
|
16 |
|
|
'name' => 'A name for your theme.',
|
17 |
|
|
'machine_name' => '[optional] A machine-readable name for your theme.',
|
18 |
|
|
),
|
19 |
|
|
'options' => array(
|
20 |
|
|
'name' => 'A name for your theme.',
|
21 |
|
|
'machine-name' => '[a-z, 0-9] A machine-readable name for your theme.',
|
22 |
|
|
'path' => 'The path where your theme will be created. Defaults to: sites/all/themes',
|
23 |
|
|
'description' => 'A description of your theme.',
|
24 |
|
|
'without-rtl' => 'Remove all RTL stylesheets.',
|
25 |
|
|
),
|
26 |
|
|
'examples' => array(
|
27 |
|
|
'drush zen "My theme name"' => 'Create a sub-theme, using the default options.',
|
28 |
|
|
'drush zen "My theme name" my_theme' => 'Create a sub-theme with a specific machine name.',
|
29 |
|
|
'drush zen "My theme" --without-rtl --path=sites/default/themes' => 'Create a sub-theme in the specified directory without RTL stylesheets.',
|
30 |
|
|
),
|
31 |
|
|
);
|
32 |
|
|
|
33 |
|
|
return $items;
|
34 |
|
|
}
|
35 |
|
|
|
36 |
|
|
/**
|
37 |
|
|
* Create a Zen sub-theme using the starter kit.
|
38 |
|
|
*/
|
39 |
|
|
function drush_zen($name = NULL, $machine_name = NULL) {
|
40 |
|
|
// Determine the theme name.
|
41 |
|
|
if (!isset($name)) {
|
42 |
|
|
$name = drush_get_option('name');
|
43 |
|
|
}
|
44 |
|
|
|
45 |
|
|
// Determine the machine name.
|
46 |
|
|
if (!isset($machine_name)) {
|
47 |
|
|
$machine_name = drush_get_option('machine-name');
|
48 |
|
|
}
|
49 |
|
|
if (!$machine_name) {
|
50 |
|
|
$machine_name = $name;
|
51 |
|
|
}
|
52 |
|
|
$machine_name = str_replace(' ', '_', strtolower($machine_name));
|
53 |
|
|
$search = array(
|
54 |
|
|
'/[^a-z0-9_]/', // Remove characters not valid in function names.
|
55 |
|
|
'/^[^a-z]+/', // Functions must begin with an alpha character.
|
56 |
|
|
);
|
57 |
|
|
$machine_name = preg_replace($search, '', $machine_name);
|
58 |
|
|
|
59 |
|
|
// Determine the path to the new subtheme.
|
60 |
|
|
$subtheme_path = 'sites/all/themes';
|
61 |
|
|
if ($path = drush_get_option('path')) {
|
62 |
|
|
$subtheme_path = drush_trim_path($path);
|
63 |
|
|
}
|
64 |
|
|
$subtheme_path = drush_normalize_path(drush_get_context('DRUSH_DRUPAL_ROOT') . '/' . $subtheme_path . '/' . $machine_name);
|
65 |
|
|
|
66 |
|
|
// Make a fresh copy of the original starter kit.
|
67 |
|
|
$starter_path = drush_normalize_path(drush_get_context('DRUSH_DRUPAL_ROOT') . '/' . drupal_get_path('theme', 'zen') . '/STARTERKIT');
|
68 |
|
|
if (!is_dir(dirname($subtheme_path))) {
|
69 |
|
|
drush_die(dt('The directory "!directory" was not found.', array('!directory' => dirname($subtheme_path))));
|
70 |
|
|
}
|
71 |
|
|
drush_op('drush_copy_dir', $starter_path, $subtheme_path);
|
72 |
|
|
|
73 |
|
|
// Rename the .info file.
|
74 |
|
|
$subtheme_info_file = $subtheme_path . '/' . $machine_name . '.info';
|
75 |
|
|
drush_op('rename', drush_normalize_path($subtheme_path . '/STARTERKIT.info.txt'), drush_normalize_path($subtheme_info_file));
|
76 |
|
|
|
77 |
|
|
// Alter the contents of the .info file based on the command options.
|
78 |
|
|
$alterations = array(
|
79 |
|
|
'= Zen Sub-theme Starter Kit' => '= ' . $name,
|
80 |
|
|
);
|
81 |
|
|
if ($description = drush_get_option('description')) {
|
82 |
|
|
$alterations['Read the <a href="https://drupal.org/node/873778">online docs</a> or the included README.txt on how to create a theme with Zen.'] = $description;
|
83 |
|
|
}
|
84 |
|
|
drush_op('zen_file_str_replace', $subtheme_info_file, array_keys($alterations), $alterations);
|
85 |
|
|
|
86 |
|
|
// Replace all occurrences of 'STARTERKIT' with the machine name of our sub theme.
|
87 |
|
|
drush_op('zen_file_str_replace', $subtheme_path . '/theme-settings.php', 'STARTERKIT', $machine_name);
|
88 |
|
|
drush_op('zen_file_str_replace', $subtheme_path . '/template.php', 'STARTERKIT', $machine_name);
|
89 |
|
|
|
90 |
|
|
// Remove all RTL stylesheets.
|
91 |
|
|
if ($without_rtl = drush_get_option('without-rtl')) {
|
92 |
|
|
foreach (array('layouts/_fixed', 'layouts/_responsive', 'components/_misc', '_normalize', 'styles') as $file) {
|
93 |
|
|
// Move any sub-directory into a separate variable.
|
94 |
|
|
list($sub_dir, $css_file) = explode('/', $file . '/');
|
95 |
|
|
if (!$css_file) {
|
96 |
|
|
$css_file = $sub_dir;
|
97 |
|
|
$sub_dir = '';
|
98 |
|
|
}
|
99 |
|
|
else {
|
100 |
|
|
$sub_dir .= '/';
|
101 |
|
|
}
|
102 |
|
|
// Remove the RTL css file.
|
103 |
|
|
$css_file = $sub_dir . (($css_file[0] == '_') ? substr($css_file, 1) : $css_file);
|
104 |
|
|
drush_op('unlink', drush_normalize_path($subtheme_path . '/css/' . $css_file . '-rtl.css'));
|
105 |
|
|
drush_op('zen_file_str_replace', $subtheme_path . '/css/' . $css_file . '.css', ' /* LTR */', '');
|
106 |
|
|
// Remove the RTL sass file.
|
107 |
|
|
drush_op('unlink', drush_normalize_path($subtheme_path . '/sass/' . $file . '-rtl.scss'));
|
108 |
|
|
drush_op('zen_file_str_replace', $subtheme_path . '/sass/' . $file . '.scss', ' /* LTR */', '');
|
109 |
|
|
}
|
110 |
|
|
}
|
111 |
|
|
|
112 |
|
|
// Notify user of the newly created theme.
|
113 |
|
|
drush_print(dt('Starter kit for "!name" created in: !path', array(
|
114 |
|
|
'!name' => $name,
|
115 |
|
|
'!path' => $subtheme_path,
|
116 |
|
|
)));
|
117 |
|
|
}
|
118 |
|
|
|
119 |
|
|
/**
|
120 |
|
|
* Replace strings in a file.
|
121 |
|
|
*/
|
122 |
|
|
function zen_file_str_replace($file_path, $find, $replace) {
|
123 |
|
|
$file_path = drush_normalize_path($file_path);
|
124 |
|
|
$file_contents = file_get_contents($file_path);
|
125 |
|
|
$file_contents = str_replace($find, $replace, $file_contents);
|
126 |
|
|
file_put_contents($file_path, $file_contents);
|
127 |
|
|
} |