forked from roblib/vretheme
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vretheme.drush.inc
141 lines (125 loc) · 5.26 KB
/
vretheme.drush.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php
/**
* @file
* Contains functions only needed for drush integration.
*/
/**
* Implementation of hook_drush_command().
*/
function vretheme_drush_command() {
$items = array();
$items['vretheme'] = array(
'description' => 'Create a theme using vretheme.',
'arguments' => array(
'name' => 'A name for your theme.',
'machine_name' => '[optional] A machine-readable name for your theme.',
'description' => 'A description of 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.',
// @TODO: Add these options:
// 'layout' => '[fixed,fluid,960gs] Choose the page layout method.',
),
'examples' => array(
'drush vretheme "My theme name"' => 'Create a sub-theme, using the default options.',
'drush vretheme "My theme name" my_theme' => 'Create a sub-theme with a specific machine name.',
),
);
return $items;
}
/**
* Create a vretheme sub-theme using the starter kit.
*/
function drush_vretheme($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 vretheme.
$vretheme_path = drush_locate_root() . '/' . drupal_get_path('theme', 'vretheme');
$subtheme_path = explode('/', $vretheme_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('vretheme_copy', $vretheme_path . '/STARTERKIT', $subtheme_path);
// Rename the .css file.
$style_css_file = $subtheme_path . '/css/' . $machine_name . '.css';
drush_op('rename', $subtheme_path . '/css/STARTERKIT.css', $style_css_file);
// Replace all occurrences of 'STARTERKIT' with the machine name of our sub theme.
drush_op('vretheme_file_str_replace', $subtheme_path . '/STARTERKIT.info.txt', 'STARTERKIT', $machine_name);
// Rename the .info file.
$subtheme_info_file = $subtheme_path . '/' . $machine_name . '.info';
drush_op('rename', $subtheme_path . '/STARTERKIT.info.txt', $subtheme_info_file);
// Alter the contents of the .info file based on the command options.
$alterations = array(
'= VRE Sub-theme Starter Kit' => '= ' . $name,
);
if ($description = drush_get_option('description')) {
$alterations['Read the <a href="http://drupal.org/node/873778">online docs</a> or the included README.txt on how to create a theme with Zen.'] = $description;
}
drush_op('vretheme_file_str_replace', $subtheme_info_file, array_keys($alterations), $alterations);
// Replace all occurrences of 'STARTERKIT' with the machine name of our sub theme.
drush_op('vretheme_file_str_replace', $subtheme_path . '/theme-settings.php', 'STARTERKIT', $machine_name);
drush_op('vretheme_file_str_replace', $subtheme_path . '/template.php', 'STARTERKIT', $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('vretheme_file_str_replace', $subtheme_path . '/css/' . $file . '.css', ' /* LTR */', '');
// Remove the RTL sass file.
drush_op('unlink', $subtheme_path . '/sass/' . $file . '-rtl.scss');
drush_op('vretheme_file_str_replace', $subtheme_path . '/sass/' . $file . '.scss', ' // 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 vretheme_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)) {
vretheme_copy($source_dir . '/' . $file, $target_dir . '/' . $file, $ignore);
}
else {
copy($source_dir . '/' . $file, $target_dir . '/' . $file);
}
}
}
closedir($dir);
}
/**
* Replace strings in a file.
*/
function vretheme_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);
}