Child Theme Creator by Orbisius - Version 1.5.4

Version Description

  • Tested with WP 5.9
  • Fixed some https links
  • Fix: file get contents do not receive LOCK_EX flag
  • Fix: the .min files weren't loaded
Download this release

Release Info

Developer lordspace
Plugin Icon wp plugin Child Theme Creator by Orbisius
Version 1.5.4
Comparing to
See all releases

Code changes from version 1.5.2 to 1.5.4

addons/clipboard/share/clipboard-js/readme.md CHANGED
@@ -1,6 +1,6 @@
1
  # clipboard.js
2
 
3
- [![Build Status](http://img.shields.io/travis/zenorocha/clipboard.js/master.svg?style=flat)](https://travis-ci.org/zenorocha/clipboard.js)
4
  ![Killing Flash](https://img.shields.io/badge/killing-flash-brightgreen.svg?style=flat)
5
 
6
  > Modern copy to clipboard. No Flash. Just 3kb gzipped.
@@ -39,7 +39,7 @@ new Clipboard('.btn');
39
 
40
  Internally, we need to fetch all elements that matches with your selector and attach event listeners for each one. But guess what? If you have hundreds of matches, this operation can consume a lot of memory.
41
 
42
- For this reason we use [event delegation](http://stackoverflow.com/questions/1687296/what-is-dom-event-delegation) which replaces multiple event listeners with just a single listener. After all, [#perfmatters](https://twitter.com/hashtag/perfmatters).
43
 
44
  # Usage
45
 
@@ -125,7 +125,7 @@ For a live demonstration, go to this [site](https://clipboardjs.com/) and open y
125
 
126
  Each application has different design needs, that's why clipboard.js does not include any CSS or built-in tooltip solution.
127
 
128
- The tooltips you see on the [demo site](https://clipboardjs.com/) were built using [GitHub's Primer](http://primercss.io/tooltips/). You may want to check that out if you're looking for a similar look and feel.
129
 
130
  ## Advanced Options
131
 
@@ -168,7 +168,7 @@ clipboard.destroy();
168
 
169
  ## Browser Support
170
 
171
- This library relies on both [Selection](https://developer.mozilla.org/en-US/docs/Web/API/Selection) and [execCommand](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand) APIs. The first one is [supported by all browsers](http://caniuse.com/#search=selection) while the second one is supported in the following browsers.
172
 
173
  | <img src="https://clipboardjs.com/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="https://clipboardjs.com/assets/images/edge.png" width="48px" height="48px" alt="Edge logo"> | <img src="https://clipboardjs.com/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="https://clipboardjs.com/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="https://clipboardjs.com/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="https://clipboardjs.com/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> |
174
  |:---:|:---:|:---:|:---:|:---:|:---:|
@@ -186,4 +186,4 @@ Install for [Chrome](https://chrome.google.com/webstore/detail/codecopy/fkbfebkc
186
 
187
  ## License
188
 
189
- [MIT License](http://zenorocha.mit-license.org/) © Zeno Rocha
1
  # clipboard.js
2
 
3
+ [![Build Status](https://img.shields.io/travis/zenorocha/clipboard.js/master.svg?style=flat)](https://travis-ci.org/zenorocha/clipboard.js)
4
  ![Killing Flash](https://img.shields.io/badge/killing-flash-brightgreen.svg?style=flat)
5
 
6
  > Modern copy to clipboard. No Flash. Just 3kb gzipped.
39
 
40
  Internally, we need to fetch all elements that matches with your selector and attach event listeners for each one. But guess what? If you have hundreds of matches, this operation can consume a lot of memory.
41
 
42
+ For this reason we use [event delegation](https://stackoverflow.com/questions/1687296/what-is-dom-event-delegation) which replaces multiple event listeners with just a single listener. After all, [#perfmatters](https://twitter.com/hashtag/perfmatters).
43
 
44
  # Usage
45
 
125
 
126
  Each application has different design needs, that's why clipboard.js does not include any CSS or built-in tooltip solution.
127
 
128
+ The tooltips you see on the [demo site](https://clipboardjs.com/) were built using [GitHub's Primer](https://primercss.io/tooltips/). You may want to check that out if you're looking for a similar look and feel.
129
 
130
  ## Advanced Options
131
 
168
 
169
  ## Browser Support
170
 
171
+ This library relies on both [Selection](https://developer.mozilla.org/en-US/docs/Web/API/Selection) and [execCommand](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand) APIs. The first one is [supported by all browsers](https://caniuse.com/#search=selection) while the second one is supported in the following browsers.
172
 
173
  | <img src="https://clipboardjs.com/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="https://clipboardjs.com/assets/images/edge.png" width="48px" height="48px" alt="Edge logo"> | <img src="https://clipboardjs.com/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="https://clipboardjs.com/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="https://clipboardjs.com/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="https://clipboardjs.com/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> |
174
  |:---:|:---:|:---:|:---:|:---:|:---:|
186
 
187
  ## License
188
 
189
+ [MIT License](https://zenorocha.mit-license.org/) © Zeno Rocha
nbproject/private/config.properties DELETED
File without changes
nbproject/private/private.properties DELETED
@@ -1,6 +0,0 @@
1
- copy.src.files=false
2
- copy.src.on.open=false
3
- copy.src.target=
4
- index.file=orbisius-child-theme-creator.php
5
- run.as=LOCAL
6
- url=http://localhost/wordpress313/
 
 
 
 
 
 
nbproject/private/private.xml DELETED
@@ -1,148 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project-private xmlns="http://www.netbeans.org/ns/project-private/1">
3
- <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="36">
4
- <file>
5
- <url>assets/main.js</url>
6
- <bookmark id="19">
7
- <name/>
8
- <line>109</line>
9
- <key/>
10
- </bookmark>
11
- </file>
12
- <file>
13
- <url>orbisius-child-theme-creator.php</url>
14
- <bookmark id="20">
15
- <name/>
16
- <line>104</line>
17
- <key/>
18
- </bookmark>
19
- <bookmark id="34">
20
- <name/>
21
- <line>271</line>
22
- <key/>
23
- </bookmark>
24
- <bookmark id="21">
25
- <name/>
26
- <line>725</line>
27
- <key/>
28
- </bookmark>
29
- <bookmark id="15">
30
- <name/>
31
- <line>1503</line>
32
- <key/>
33
- </bookmark>
34
- <bookmark id="16">
35
- <name/>
36
- <line>1644</line>
37
- <key/>
38
- </bookmark>
39
- <bookmark id="6">
40
- <name/>
41
- <line>1718</line>
42
- <key/>
43
- </bookmark>
44
- <bookmark id="14">
45
- <name/>
46
- <line>1796</line>
47
- <key/>
48
- </bookmark>
49
- <bookmark id="12">
50
- <name/>
51
- <line>2253</line>
52
- <key/>
53
- </bookmark>
54
- <bookmark id="9">
55
- <name/>
56
- <line>2258</line>
57
- <key/>
58
- </bookmark>
59
- <bookmark id="5">
60
- <name/>
61
- <line>2300</line>
62
- <key/>
63
- </bookmark>
64
- <bookmark id="18">
65
- <name/>
66
- <line>2310</line>
67
- <key/>
68
- </bookmark>
69
- <bookmark id="4">
70
- <name/>
71
- <line>2415</line>
72
- <key/>
73
- </bookmark>
74
- <bookmark id="17">
75
- <name/>
76
- <line>2447</line>
77
- <key/>
78
- </bookmark>
79
- <bookmark id="13">
80
- <name/>
81
- <line>2628</line>
82
- <key/>
83
- </bookmark>
84
- <bookmark id="3">
85
- <name/>
86
- <line>2673</line>
87
- <key/>
88
- </bookmark>
89
- </file>
90
- <file>
91
- <url>addons/cloud_lib/assets/custom.js</url>
92
- <bookmark id="29">
93
- <name/>
94
- <line>287</line>
95
- <key/>
96
- </bookmark>
97
- <bookmark id="30">
98
- <name/>
99
- <line>379</line>
100
- <key/>
101
- </bookmark>
102
- <bookmark id="33">
103
- <name/>
104
- <line>419</line>
105
- <key/>
106
- </bookmark>
107
- </file>
108
- <file>
109
- <url>addons/cloud_lib/lib/snippet_lib.php</url>
110
- <bookmark id="28">
111
- <name/>
112
- <line>355</line>
113
- <key/>
114
- </bookmark>
115
- <bookmark id="27">
116
- <name/>
117
- <line>355</line>
118
- <key/>
119
- </bookmark>
120
- <bookmark id="26">
121
- <name/>
122
- <line>483</line>
123
- <key/>
124
- </bookmark>
125
- </file>
126
- <file>
127
- <url>orbisius-child_theme_creator.php</url>
128
- <bookmark id="2">
129
- <name/>
130
- <line>379</line>
131
- <key/>
132
- </bookmark>
133
- </file>
134
- </editor-bookmarks>
135
- <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
136
- <group name="qsandbox"/>
137
- <group name="Go359">
138
- <file>file:/C:/Copy/Dropbox/cloud/projects/default/htdocs/wordpress313/wp-content/plugins/orbisius-child-theme-creator/orbisius-child-theme-creator.php</file>
139
- <file>file:/C:/Copy/Dropbox/cloud/projects/default/htdocs/wordpress313/wp-content/plugins/orbisius-child-theme-creator/readme.txt</file>
140
- </group>
141
- <group name="qSandbox"/>
142
- <group>
143
- <file>file:/C:/Copy/Dropbox/cloud/projects/default/htdocs/wordpress313/wp-content/plugins/orbisius-child-theme-creator/assets/main.css</file>
144
- <file>file:/C:/Copy/Dropbox/cloud/projects/default/htdocs/wordpress313/wp-content/plugins/orbisius-child-theme-creator/assets/main.min.css</file>
145
- <file>file:/C:/Copy/Dropbox/cloud/projects/default/htdocs/wordpress313/wp-content/plugins/orbisius-child-theme-creator/orbisius-child-theme-creator.php</file>
146
- </group>
147
- </open-files>
148
- </project-private>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
nbproject/project.properties DELETED
@@ -1,7 +0,0 @@
1
- include.path=${php.global.include.path}
2
- php.version=PHP_54
3
- source.encoding=UTF-8
4
- src.dir=.
5
- tags.asp=false
6
- tags.short=true
7
- web.root=.
 
 
 
 
 
 
 
nbproject/project.xml DELETED
@@ -1,9 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project xmlns="http://www.netbeans.org/ns/project/1">
3
- <type>org.netbeans.modules.php.project</type>
4
- <configuration>
5
- <data xmlns="http://www.netbeans.org/ns/php-project/1">
6
- <name>orbisius-child_theme_creator</name>
7
- </data>
8
- </configuration>
9
- </project>
 
 
 
 
 
 
 
 
 
orbisius-child-theme-creator.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Orbisius Child Theme Creator
4
  Plugin URI: https://orbisius.com/products/wordpress-plugins/orbisius-child-theme-creator/
5
  Description: This plugin allows you to quickly create child themes from any theme that you have currently installed on your site/blog.
6
- Version: 1.5.2
7
  Author: Svetoslav Marinov (Slavi)
8
  Author URI: https://orbisius.com
9
  */
@@ -423,51 +423,12 @@ function orbisius_child_theme_creator_settings_page() {
423
  <li>Customize the child theme</li>
424
  </ul>
425
 
426
- <iframe width="560" height="315" src="https://youtube.com/embed/BZUVq6ZTv-o" frameborder="0" allowfullscreen></iframe>
427
 
428
  </div> <!-- .inside -->
429
 
430
  </div> <!-- .postbox -->
431
 
432
- <div class="postbox">
433
- <?php
434
- $plugin_data = orbisius_child_theme_creator_get_plugin_data();
435
-
436
- $app_link = urlencode($plugin_data['PluginURI']);
437
- $app_title = urlencode($plugin_data['Name']);
438
- $app_descr = urlencode($plugin_data['Description']);
439
- ?>
440
- <h3>Share</h3>
441
- <p>
442
- <!-- AddThis Button BEGIN -->
443
- <div class="addthis_toolbox addthis_default_style addthis_32x32_style">
444
- <a class="addthis_button_facebook" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
445
- <a class="addthis_button_twitter" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
446
- <a class="addthis_button_google_plusone" g:plusone:count="false" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
447
- <a class="addthis_button_linkedin" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
448
- <a class="addthis_button_email" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
449
- <a class="addthis_button_myspace" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
450
- <a class="addthis_button_google" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
451
- <a class="addthis_button_digg" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
452
- <a class="addthis_button_delicious" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
453
- <a class="addthis_button_stumbleupon" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
454
- <a class="addthis_button_tumblr" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
455
- <a class="addthis_button_favorites" addthis:url="<?php echo $app_link ?>" addthis:title="<?php echo $app_title ?>" addthis:description="<?php echo $app_descr ?>"></a>
456
- <a class="addthis_button_compact"></a>
457
- </div>
458
- <!-- The JS code is in the footer -->
459
-
460
- <script type="text/javascript">
461
- var addthis_config = {"data_track_clickback": true};
462
- var addthis_share = {
463
- templates: {twitter: 'Check out {{title}} #WordPress #plugin at {{lurl}}'}
464
- }
465
- </script>
466
- <!-- AddThis Button START part2 -->
467
- <script type="text/javascript" src="//s7.addthis.com/js/250/addthis_widget.js"></script>
468
- <!-- AddThis Button END part2 -->
469
- </div> <!-- .postbox -->
470
-
471
  </div> <!-- .meta-box-sortables .ui-sortable -->
472
 
473
  </div> <!-- post-body-content -->
@@ -832,14 +793,14 @@ function orbisius_child_theme_creator_tools_action() {
832
  $child_custom_info = empty($_REQUEST['child_custom_info']) ? array() : $_REQUEST['child_custom_info'];
833
 
834
  $parent_theme_base_dirname = trim($parent_theme_base_dirname);
835
- $parent_theme_base_dirname = preg_replace('#[^\w-]#si', '-', $parent_theme_base_dirname);
836
- $parent_theme_base_dirname = preg_replace('#[_-]+#si', '-', $parent_theme_base_dirname);
837
  $parent_theme_base_dirname = trim($parent_theme_base_dirname, '-');
838
 
839
  if (!empty($_POST) || !empty($parent_theme_base_dirname)) {
840
  if (!wp_verify_nonce($orbisius_child_theme_creator_nonce, basename(__FILE__) . '-action')) {
841
  $errors[] = "Invalid action";
842
- } elseif (empty($parent_theme_base_dirname) || !preg_match('#^[\w-]+$#si', $parent_theme_base_dirname)) {
843
  $errors[] = "Parent theme's directory is invalid. May contain only [a-z0-9-]";
844
  } elseif (strlen($parent_theme_base_dirname) > 70) {
845
  $errors[] = "Parent theme's directory should be fewer than 70 characters long.";
@@ -858,8 +819,13 @@ function orbisius_child_theme_creator_tools_action() {
858
  $installer->check_permissions();
859
  $installer->copy_main_files();
860
  $installer->generate_style();
861
- $installer->create_file( 'functions.php', $theme_setup_params );
862
- $installer->copy_parent_themes_options();
 
 
 
 
 
863
 
864
  // Does the user want to copy the functions.php?
865
  // This is dangerous and can crash the site.
@@ -1046,6 +1012,9 @@ function orbisius_child_theme_creator_tools_action() {
1046
  . "Switch theme to the new theme after it is created</label></li>\n";
1047
  }
1048
 
 
 
 
1049
  // This allows the users to specify title and description of the target child theme
1050
  $customize_info_container_id = 'orbisius_ctc_cust_info_' . md5($src);
1051
 
@@ -1089,7 +1058,7 @@ function orbisius_child_theme_creator_tools_action() {
1089
  <tr>
1090
  <td>Version</td>
1091
  <td><input type='text' id='cust_child_theme_ver_$customize_info_container_id' name='child_custom_info[ver]' value='' placeholder='$ver' /></td>
1092
- </tr>
1093
  </table>
1094
  </div> <!-- /$customize_info_container_id -->
1095
  ";
@@ -1835,59 +1804,135 @@ class orbisius_child_theme_creator {
1835
  /**
1836
  *
1837
  * @param str $file
 
1838
  */
1839
  public function create_file($file, $params = array() ) {
1840
- if ($file == 'functions.php') {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1841
  $parent_base_dir = $params['parent_theme_basedir'];
1842
  // this should be unique dir so use it for function
1843
  $func_prefix = strtolower( $this->target_base_dirname );
1844
  $func_prefix = 'orbisius_ct_' . preg_replace( '#[^\w]+#si', '_', $func_prefix );
1845
  $func_prefix = trim( $func_prefix, '_' );
1846
 
1847
- $file_tpl = <<<BUFF_EOF
1848
  <?php
1849
  /*
1850
- * Generated By Orbisius Child Theme Creator - your favorite plugin for Child Theme creation :)
1851
- * https://wordpress.org/plugins/orbisius-child-theme-creator/
1852
  *
1853
  * Unlike style.css, the functions.php of a child theme does not override its counterpart from the parent.
1854
  * Instead, it is loaded in addition to the parent’s functions.php. (Specifically, it is loaded right before the parent theme's functions.php).
1855
  * Source: https://codex.wordpress.org/Child_Themes#Using_functions.php
1856
  *
1857
- * Be sure not to define functions, that already exist in the parent theme!
1858
- * A common pattern is to prefix function names with the (child) theme name.
1859
- * Also if the parent theme supports pluggable functions you can use function_exists( 'put_the_function_name_here' ) checks.
1860
  */
1861
 
1862
  /**
1863
- * Loads parent and child themes' style.css
1864
  */
1865
  function {$func_prefix}_child_theme_enqueue_styles() {
1866
- \$parent_style = '{$func_prefix}_parent_style';
1867
- \$parent_base_dir = '$parent_base_dir';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1868
 
1869
- wp_enqueue_style( \$parent_style,
 
 
 
 
 
 
 
 
 
 
1870
  get_template_directory_uri() . '/style.css',
1871
  array(),
1872
- wp_get_theme( \$parent_base_dir ) ? wp_get_theme( \$parent_base_dir )->get('Version') : ''
1873
  );
1874
 
1875
- wp_enqueue_style( \$parent_style . '_child_style',
1876
  get_stylesheet_directory_uri() . '/style.css',
1877
- array( \$parent_style ),
1878
- wp_get_theme()->get('Version')
1879
  );
1880
  }
1881
 
1882
- add_action( 'wp_enqueue_scripts', '{$func_prefix}_child_theme_enqueue_styles' );
1883
 
 
 
 
1884
  BUFF_EOF;
1885
 
1886
- $file_tpl = ltrim( $file_tpl );
 
 
 
 
1887
 
1888
  $file = $this->target_dir_path . $file;
1889
- file_put_contents($file, $file_tpl, LOCK_EX);
 
1890
  }
 
 
1891
  }
1892
  }
1893
 
@@ -1948,6 +1993,13 @@ class orbisius_child_theme_creator_util {
1948
  $file_name = preg_replace('#(?:\/+|\\+)#si', '/', $file_name);
1949
  $file_name = ltrim($file_name, '/'); // rm leading /
1950
 
 
 
 
 
 
 
 
1951
  if (!empty($jail_root)) {
1952
  $file_name = $jail_root . $file_name;
1953
  }
@@ -1957,7 +2009,7 @@ class orbisius_child_theme_creator_util {
1957
 
1958
  /**
1959
  * Uses wp_kses to sanitize the data
1960
- * @param str/array $value
1961
  * @return mixed: str/array
1962
  * @throws Exception
1963
  */
@@ -2250,7 +2302,7 @@ class orbisius_child_theme_creator_html {
2250
  // This makes certain options to have certain CSS class
2251
  // which can be used to highlight the row
2252
  // the key must start with __sys_CLASS_NAME
2253
- if (preg_match('#__sys_([\w-]+)#si', $label, $matches)) {
2254
  $label = str_replace($matches[0], '', $label);
2255
  $selected .= " class='$matches[1]' ";
2256
  }
@@ -2265,7 +2317,6 @@ class orbisius_child_theme_creator_html {
2265
  }
2266
 
2267
  public static function html_files_tree( $class = '', $files = array() ) {
2268
-
2269
  $html = '<ul class="orbisius_folder_list">';
2270
 
2271
  foreach ( $files as $item => $value ) {
@@ -2276,14 +2327,13 @@ class orbisius_child_theme_creator_html {
2276
  $list_class = $is_folder ? 'orbisius_folder' : 'orbisius_file';
2277
  $html .= '<li class="'.$list_class.'">' .$folder_checkbox . ( $is_folder ? orbisius_child_theme_creator_html::html_files_tree($class, $value) : '<label class="orbisius_file_label"><input type="checkbox" class="orb_files" name="'.$class.'_files_checkbox[]" value="'.$value.'" ><span class="dashicons dashicons-text-page"></span>'.$item.'</label>' ) . '</li>';
2278
  }
 
2279
  $html .= '</ul>';
2280
 
2281
  return $html;
2282
-
2283
  }
2284
  }
2285
 
2286
-
2287
  /**
2288
  * This method creates 2 panes that the user is able to use to edit theme files.
2289
  * Everythin happens with AJAX
@@ -2605,7 +2655,6 @@ function orbisius_ctc_theme_editor_no_auth_ajax() {
2605
  function orbisius_ctc_theme_editor_ajax() {
2606
  check_ajax_referer( 'orbisius_ctc_nonce' );
2607
 
2608
-
2609
  $buff = 'INVALID AJAX SUB_CMD';
2610
 
2611
  $req = orbisius_child_theme_creator_get_request();
@@ -2825,17 +2874,13 @@ function orbisius_ctc_theme_editor_check_syntax($theme_file_contents) {
2825
  function orbisius_ctc_theme_editor_generate_dropdown() {
2826
  $req = orbisius_child_theme_creator_get_request();
2827
  $html_dropdown_theme_1_files = orbisius_ctc_generate_list_of_theme_files($req);
2828
- $buff = orbisius_child_theme_creator_html::html_select($select_name, $theme_1_file, $html_dropdown_theme_1_files);
2829
-
2830
  return $buff;
2831
  }
2832
 
2833
  function orbisius_ctc_theme_editor_generate_files_tree() {
2834
-
2835
  $req = orbisius_child_theme_creator_get_request();
2836
-
2837
  $paths = orbisius_ctc_generate_list_of_theme_files($req);
2838
-
2839
  $tree = orbisius_ctc_explode_tree( $paths, "/" );
2840
 
2841
  if (!empty($req['theme_1'])) {
@@ -2843,17 +2888,22 @@ function orbisius_ctc_theme_editor_generate_files_tree() {
2843
  } elseif (!empty($req['theme_2'])) {
2844
  $name = 'theme_2_files';
2845
  }
 
2846
  $buff = orbisius_child_theme_creator_html::html_files_tree($name, $tree);
2847
 
2848
  return $buff;
2849
  }
2850
 
 
2851
  // https://kvz.io/convert-anything-to-tree-structures-in-php.html
2852
  function orbisius_ctc_explode_tree($array, $delimiter = '_', $baseval = false) {
2853
- if ( !is_array($array) ) return false;
 
 
2854
 
2855
  $split = '/' . preg_quote($delimiter, '/') . '/';
2856
  $return_array = array();
 
2857
  foreach ($array as $key => $val) {
2858
  // Get parent parts and the current leaf
2859
  $parts = preg_split($split, $key, -1, PREG_SPLIT_NO_EMPTY);
@@ -2886,6 +2936,7 @@ function orbisius_ctc_explode_tree($array, $delimiter = '_', $baseval = false) {
2886
  return $return_array;
2887
  }
2888
 
 
2889
 
2890
  /**
2891
  * This returns array of theme files
@@ -2893,16 +2944,15 @@ function orbisius_ctc_explode_tree($array, $delimiter = '_', $baseval = false) {
2893
  * @return array
2894
  */
2895
  function orbisius_ctc_generate_list_of_theme_files($req) {
2896
-
2897
- $theme_base_dir = $theme_1_file = '';
2898
-
2899
- $select_name = 'theme_1_file';
2900
 
2901
  if (!empty($req['theme_1'])) {
2902
- $theme_base_dir = empty($req['theme_1']) ? '' : preg_replace('#[^\w-]#si', '', $req['theme_1']);
2903
  $theme_1_file = empty($req['theme_1_file']) ? 'style.css' : $req['theme_1_file'];
2904
  } elseif (!empty($req['theme_2'])) {
2905
- $theme_base_dir = empty($req['theme_2']) ? '' : preg_replace('#[^\w-]#si', '', $req['theme_2']);
2906
  $theme_1_file = empty($req['theme_2_file']) ? 'style.css' : $req['theme_2_file'];
2907
  $select_name = 'theme_2_file';
2908
  } else {
@@ -2939,10 +2989,12 @@ function orbisius_ctc_theme_editor_manage_file( $cmd_id = 1 ) {
2939
  return 'Missing data!';
2940
  }
2941
 
2942
- $buff = $theme_base_dir = $theme_dir = $theme_file = '';
 
 
 
2943
 
2944
  $req = orbisius_child_theme_creator_get_request();
2945
-
2946
  $theme_root = trailingslashit( get_theme_root() );
2947
 
2948
  $theme_dir_regex = '#[^\w\-]#si';
@@ -2975,7 +3027,7 @@ function orbisius_ctc_theme_editor_manage_file( $cmd_id = 1 ) {
2975
  }
2976
 
2977
  if ($cmd_id == 1) {
2978
- $buff = file_get_contents($theme_file, LOCK_SH);
2979
  } elseif ($cmd_id == 2) {
2980
  $suff = '';
2981
 
@@ -3017,7 +3069,7 @@ function orbisius_ctc_theme_editor_manage_file( $cmd_id = 1 ) {
3017
  }
3018
 
3019
  elseif ($cmd_id == 5) { // zip
3020
- $to = empty($req['email']) ? '' : preg_replace('#[^\w-\.@,\'"]#si', '', $req['email']);
3021
  $status_rec = orbisius_ctc_theme_editor_zip_theme($theme_base_dir, $to);
3022
 
3023
  if (function_exists('wp_send_json')) { // since WP 3.5
3
  Plugin Name: Orbisius Child Theme Creator
4
  Plugin URI: https://orbisius.com/products/wordpress-plugins/orbisius-child-theme-creator/
5
  Description: This plugin allows you to quickly create child themes from any theme that you have currently installed on your site/blog.
6
+ Version: 1.5.4
7
  Author: Svetoslav Marinov (Slavi)
8
  Author URI: https://orbisius.com
9
  */
423
  <li>Customize the child theme</li>
424
  </ul>
425
 
426
+ <iframe width="560" height="315" src="https://youtube-nocookie.com/embed/BZUVq6ZTv-o" frameborder="0" allowfullscreen></iframe>
427
 
428
  </div> <!-- .inside -->
429
 
430
  </div> <!-- .postbox -->
431
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
  </div> <!-- .meta-box-sortables .ui-sortable -->
433
 
434
  </div> <!-- post-body-content -->
793
  $child_custom_info = empty($_REQUEST['child_custom_info']) ? array() : $_REQUEST['child_custom_info'];
794
 
795
  $parent_theme_base_dirname = trim($parent_theme_base_dirname);
796
+ $parent_theme_base_dirname = preg_replace('#[^\w\-]#si', '-', $parent_theme_base_dirname);
797
+ $parent_theme_base_dirname = preg_replace('#[_\-]+#si', '-', $parent_theme_base_dirname);
798
  $parent_theme_base_dirname = trim($parent_theme_base_dirname, '-');
799
 
800
  if (!empty($_POST) || !empty($parent_theme_base_dirname)) {
801
  if (!wp_verify_nonce($orbisius_child_theme_creator_nonce, basename(__FILE__) . '-action')) {
802
  $errors[] = "Invalid action";
803
+ } elseif (empty($parent_theme_base_dirname) || !preg_match('#^[\w\-]+$#si', $parent_theme_base_dirname)) {
804
  $errors[] = "Parent theme's directory is invalid. May contain only [a-z0-9-]";
805
  } elseif (strlen($parent_theme_base_dirname) > 70) {
806
  $errors[] = "Parent theme's directory should be fewer than 70 characters long.";
819
  $installer->check_permissions();
820
  $installer->copy_main_files();
821
  $installer->generate_style();
822
+ $installer->create_file( 'functions.php', $theme_setup_params );
823
+
824
+ if (!empty($_REQUEST['create_index'])) {
825
+ $installer->create_file( 'index.html', $theme_setup_params );
826
+ }
827
+
828
+ $installer->copy_parent_themes_options();
829
 
830
  // Does the user want to copy the functions.php?
831
  // This is dangerous and can crash the site.
1012
  . "Switch theme to the new theme after it is created</label></li>\n";
1013
  }
1014
 
1015
+ $buff .= "<li><label><input type='checkbox' id='orbisius_child_theme_creator_create_index' name='create_index' value='1' checked='checked' /> "
1016
+ . "Create index.html placeholder to prevent file listing in child theme directory</label></li>\n";
1017
+
1018
  // This allows the users to specify title and description of the target child theme
1019
  $customize_info_container_id = 'orbisius_ctc_cust_info_' . md5($src);
1020
 
1058
  <tr>
1059
  <td>Version</td>
1060
  <td><input type='text' id='cust_child_theme_ver_$customize_info_container_id' name='child_custom_info[ver]' value='' placeholder='$ver' /></td>
1061
+ </tr>
1062
  </table>
1063
  </div> <!-- /$customize_info_container_id -->
1064
  ";
1804
  /**
1805
  *
1806
  * @param str $file
1807
+ * @return bool
1808
  */
1809
  public function create_file($file, $params = array() ) {
1810
+ if (strpos($file, '.html') !== false) {
1811
+ $default_buff = <<<'BUFF_EOF'
1812
+ <!DOCTYPE html>
1813
+ <html>
1814
+ <title>Hello</title>
1815
+ <body>
1816
+ <h3>Generated By Orbisius Child Theme Creator - your favorite plugin for WordPress Child Theme creation and editing :)</h3>
1817
+
1818
+ <br />
1819
+ Plugin URL: <a href="https://orbisius.com/products/wordpress-plugins/orbisius-child-theme-creator"
1820
+ title="WordPress Plugin for Child Theme creation"
1821
+ target="_blank">Orbisius Child Theme Creator</a>
1822
+ <br />
1823
+ </body>
1824
+ </html>
1825
+ BUFF_EOF;
1826
+
1827
+ $file_tpl = empty($params['buff']) ? $default_buff : $params['buff'];
1828
+ $full_file = $this->target_dir_path . ltrim($file, '/\\');
1829
+ $file_tpl = trim($file_tpl);
1830
+
1831
+ if (!file_exists($full_file) || !empty($params['override'])) {
1832
+ $res = file_put_contents($full_file, $file_tpl, LOCK_EX);
1833
+ return $res;
1834
+ }
1835
+
1836
+ return true;
1837
+ } elseif ($file == 'functions.php') {
1838
  $parent_base_dir = $params['parent_theme_basedir'];
1839
  // this should be unique dir so use it for function
1840
  $func_prefix = strtolower( $this->target_base_dirname );
1841
  $func_prefix = 'orbisius_ct_' . preg_replace( '#[^\w]+#si', '_', $func_prefix );
1842
  $func_prefix = trim( $func_prefix, '_' );
1843
 
1844
+ $file_tpl = <<<'BUFF_EOF'
1845
  <?php
1846
  /*
1847
+ * Generated By Orbisius Child Theme Creator - your favorite plugin for Child Theme creation and editing :)
1848
+ * https://orbisius.com/products/wordpress-plugins/orbisius-child-theme-creator
1849
  *
1850
  * Unlike style.css, the functions.php of a child theme does not override its counterpart from the parent.
1851
  * Instead, it is loaded in addition to the parent’s functions.php. (Specifically, it is loaded right before the parent theme's functions.php).
1852
  * Source: https://codex.wordpress.org/Child_Themes#Using_functions.php
1853
  *
1854
+ * When copying functions from the parent theme make sure you use function_exists( 'put_the_function_name_here' ) calls.
1855
+ * Otherwise having functions with the same name will crash the site.
1856
+ * Also when adding new functions do put prefix before the function names to ensure uniqueness.
1857
  */
1858
 
1859
  /**
1860
+ * Loads parent theme's style first and then child theme's style.css so you can override parent styles
1861
  */
1862
  function {$func_prefix}_child_theme_enqueue_styles() {
1863
+ global $wp_styles;
1864
+
1865
+ $parent_style = '{$func_prefix}_parent_style';
1866
+ $parent_base_dir = '{$parent_base_dir}';
1867
+ $child_dir_id = basename(get_stylesheet_directory());
1868
+
1869
+ // WP enqueues the child style automatically. We want to dequeue it so we can load parent first and child theme's css later
1870
+ // We'll also append the last modified times for versions and for better cache clean up.
1871
+ if ( ! empty( $wp_styles->queue ) ) {
1872
+ $srch_arr = [
1873
+ $parent_base_dir,
1874
+ $parent_base_dir . '-style',
1875
+ $parent_base_dir . '_style',
1876
+ $child_dir_id,
1877
+ $child_dir_id . '-style',
1878
+ $child_dir_id . '_style',
1879
+ ];
1880
+
1881
+ foreach ( $wp_styles->queue as $registered_style_id ) {
1882
+ if ( in_array( $registered_style_id, $srch_arr ) ) {
1883
+ wp_dequeue_style( $registered_style_id );
1884
+ wp_deregister_style( $registered_style_id );
1885
+ }
1886
+ }
1887
+ }
1888
+
1889
+ // We use last modified as version as it's a reliable way to tell when the file was modified so
1890
+ // the browser can load the new file if necessary and not use the cached version.
1891
+ $parent_ver = time();
1892
+ $parent_style_css_file = get_template_directory() . '/style.css';
1893
 
1894
+ if (file_exists($parent_style_css_file)) {
1895
+ $parent_ver = filemtime($parent_style_css_file);
1896
+ } else {
1897
+ $v = wp_get_theme( $parent_base_dir )->get('Version');
1898
+
1899
+ if (!empty($v)) {
1900
+ $parent_ver = $v;
1901
+ }
1902
+ }
1903
+
1904
+ wp_enqueue_style( $parent_style,
1905
  get_template_directory_uri() . '/style.css',
1906
  array(),
1907
+ $parent_ver
1908
  );
1909
 
1910
+ wp_enqueue_style( $parent_style . '_child_style',
1911
  get_stylesheet_directory_uri() . '/style.css',
1912
+ array( $parent_style ),
1913
+ filemtime(get_stylesheet_directory() . '/style.css')
1914
  );
1915
  }
1916
 
1917
+ add_action( 'wp_enqueue_scripts', '{$func_prefix}_child_theme_enqueue_styles', 25 );
1918
 
1919
+ function {$func_prefix}_example_function() {
1920
+ // put some code here
1921
+ }
1922
  BUFF_EOF;
1923
 
1924
+ $file_tpl = ltrim( $file_tpl ); // we want some trailing space
1925
+
1926
+ // It's Nowdoc so we have to replace php vars
1927
+ $file_tpl = str_replace('{$func_prefix}', $func_prefix, $file_tpl );
1928
+ $file_tpl = str_replace('{$parent_base_dir}', $parent_base_dir, $file_tpl );
1929
 
1930
  $file = $this->target_dir_path . $file;
1931
+ $res = file_put_contents($file, $file_tpl, LOCK_EX);
1932
+ return $res;
1933
  }
1934
+
1935
+ return false;
1936
  }
1937
  }
1938
 
1993
  $file_name = preg_replace('#(?:\/+|\\+)#si', '/', $file_name);
1994
  $file_name = ltrim($file_name, '/'); // rm leading /
1995
 
1996
+ // it seems sanitize_file_name confuses .min the WP sanitizer.
1997
+ // /assets/css/boxicons.min_.css
1998
+ if (stripos($file_name, '.min_.') !== false) {
1999
+ $file_name = str_replace('.min_.js', '.min.js', $file_name);
2000
+ $file_name = str_replace('.min_.css', '.min.css', $file_name);
2001
+ }
2002
+
2003
  if (!empty($jail_root)) {
2004
  $file_name = $jail_root . $file_name;
2005
  }
2009
 
2010
  /**
2011
  * Uses wp_kses to sanitize the data
2012
+ * @param string|array $value
2013
  * @return mixed: str/array
2014
  * @throws Exception
2015
  */
2302
  // This makes certain options to have certain CSS class
2303
  // which can be used to highlight the row
2304
  // the key must start with __sys_CLASS_NAME
2305
+ if (preg_match('#__sys_([\w\-]+)#si', $label, $matches)) {
2306
  $label = str_replace($matches[0], '', $label);
2307
  $selected .= " class='$matches[1]' ";
2308
  }
2317
  }
2318
 
2319
  public static function html_files_tree( $class = '', $files = array() ) {
 
2320
  $html = '<ul class="orbisius_folder_list">';
2321
 
2322
  foreach ( $files as $item => $value ) {
2327
  $list_class = $is_folder ? 'orbisius_folder' : 'orbisius_file';
2328
  $html .= '<li class="'.$list_class.'">' .$folder_checkbox . ( $is_folder ? orbisius_child_theme_creator_html::html_files_tree($class, $value) : '<label class="orbisius_file_label"><input type="checkbox" class="orb_files" name="'.$class.'_files_checkbox[]" value="'.$value.'" ><span class="dashicons dashicons-text-page"></span>'.$item.'</label>' ) . '</li>';
2329
  }
2330
+
2331
  $html .= '</ul>';
2332
 
2333
  return $html;
 
2334
  }
2335
  }
2336
 
 
2337
  /**
2338
  * This method creates 2 panes that the user is able to use to edit theme files.
2339
  * Everythin happens with AJAX
2655
  function orbisius_ctc_theme_editor_ajax() {
2656
  check_ajax_referer( 'orbisius_ctc_nonce' );
2657
 
 
2658
  $buff = 'INVALID AJAX SUB_CMD';
2659
 
2660
  $req = orbisius_child_theme_creator_get_request();
2874
  function orbisius_ctc_theme_editor_generate_dropdown() {
2875
  $req = orbisius_child_theme_creator_get_request();
2876
  $html_dropdown_theme_1_files = orbisius_ctc_generate_list_of_theme_files($req);
2877
+ $buff = orbisius_child_theme_creator_html::html_select('', null, $html_dropdown_theme_1_files);
 
2878
  return $buff;
2879
  }
2880
 
2881
  function orbisius_ctc_theme_editor_generate_files_tree() {
 
2882
  $req = orbisius_child_theme_creator_get_request();
 
2883
  $paths = orbisius_ctc_generate_list_of_theme_files($req);
 
2884
  $tree = orbisius_ctc_explode_tree( $paths, "/" );
2885
 
2886
  if (!empty($req['theme_1'])) {
2888
  } elseif (!empty($req['theme_2'])) {
2889
  $name = 'theme_2_files';
2890
  }
2891
+
2892
  $buff = orbisius_child_theme_creator_html::html_files_tree($name, $tree);
2893
 
2894
  return $buff;
2895
  }
2896
 
2897
+
2898
  // https://kvz.io/convert-anything-to-tree-structures-in-php.html
2899
  function orbisius_ctc_explode_tree($array, $delimiter = '_', $baseval = false) {
2900
+ if ( !is_array($array) ) {
2901
+ return false;
2902
+ }
2903
 
2904
  $split = '/' . preg_quote($delimiter, '/') . '/';
2905
  $return_array = array();
2906
+
2907
  foreach ($array as $key => $val) {
2908
  // Get parent parts and the current leaf
2909
  $parts = preg_split($split, $key, -1, PREG_SPLIT_NO_EMPTY);
2936
  return $return_array;
2937
  }
2938
 
2939
+ $test = &$return_array;
2940
 
2941
  /**
2942
  * This returns array of theme files
2944
  * @return array
2945
  */
2946
  function orbisius_ctc_generate_list_of_theme_files($req) {
2947
+ $theme_1_file = '';
2948
+ $theme_base_dir = '';
2949
+ $select_name = 'theme_1_file';
 
2950
 
2951
  if (!empty($req['theme_1'])) {
2952
+ $theme_base_dir = empty($req['theme_1']) ? '' : preg_replace('#[^\w\-]#si', '', $req['theme_1']);
2953
  $theme_1_file = empty($req['theme_1_file']) ? 'style.css' : $req['theme_1_file'];
2954
  } elseif (!empty($req['theme_2'])) {
2955
+ $theme_base_dir = empty($req['theme_2']) ? '' : preg_replace('#[^\w\-]#si', '', $req['theme_2']);
2956
  $theme_1_file = empty($req['theme_2_file']) ? 'style.css' : $req['theme_2_file'];
2957
  $select_name = 'theme_2_file';
2958
  } else {
2989
  return 'Missing data!';
2990
  }
2991
 
2992
+ $buff = '';
2993
+ $theme_dir = '';
2994
+ $theme_file = '';
2995
+ $theme_base_dir = '';
2996
 
2997
  $req = orbisius_child_theme_creator_get_request();
 
2998
  $theme_root = trailingslashit( get_theme_root() );
2999
 
3000
  $theme_dir_regex = '#[^\w\-]#si';
3027
  }
3028
 
3029
  if ($cmd_id == 1) {
3030
+ $buff = file_get_contents($theme_file);
3031
  } elseif ($cmd_id == 2) {
3032
  $suff = '';
3033
 
3069
  }
3070
 
3071
  elseif ($cmd_id == 5) { // zip
3072
+ $to = empty($req['email']) ? '' : preg_replace('#[^\w\-\.@,\'"]#si', '', $req['email']);
3073
  $status_rec = orbisius_ctc_theme_editor_zip_theme($theme_base_dir, $to);
3074
 
3075
  if (function_exists('wp_send_json')) { // since WP 3.5
readme.txt CHANGED
@@ -3,9 +3,9 @@ Contributors: lordspace,orbisius
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=7APYDVPBCSY9A
4
  Tags: theme,child theme,childtheme,childthemes,parent theme,child themes,CSS,styling,resposive design,design,custom themeing, shared hosting,theme editor theme,themes,wp,wordpress,orbisius,theme creator,custom theme,theme generator,css,css editor
5
  Requires at least: 3.4
6
- Tested up to: 5.5
7
  Requires PHP: 5.6
8
- Stable tag: 1.5.2
9
  License: GPLv2 or later
10
 
11
  Create Child Themes quickly and easily from any theme that you have currently installed on your site/blog.
@@ -80,7 +80,7 @@ Go to Admin > Appearance > Orbisius Child Theme Creator then click on the theme
80
  Go to Admin > Appearance > Orbisius Theme Editor then click on the theme you like and the child theme will be created for you.
81
 
82
  = Demo =
83
- http://www.youtube.com/watch?v=BZUVq6ZTv-o
84
 
85
  = Premium =
86
  Do you want to be able to preview themes from within the 2 editors?
@@ -163,13 +163,26 @@ Let's talk.
163
  title="If you want a custom web/mobile app/plugin developed contact us. This opens in a new window/tab"
164
  class="button-primary" target="_blank">Get a Free Quote</a>
165
 
166
- Todo
167
  - Add buttons in the WP's Theme listing page near Customize
168
  - Orbisius Create
169
  - Orbisius Edit
170
 
171
  == Changelog ==
172
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  = 1.5.2 =
174
  * Copy files from one theme to another
175
  * Simplified settings page
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=7APYDVPBCSY9A
4
  Tags: theme,child theme,childtheme,childthemes,parent theme,child themes,CSS,styling,resposive design,design,custom themeing, shared hosting,theme editor theme,themes,wp,wordpress,orbisius,theme creator,custom theme,theme generator,css,css editor
5
  Requires at least: 3.4
6
+ Tested up to: 5.9
7
  Requires PHP: 5.6
8
+ Stable tag: 1.5.4
9
  License: GPLv2 or later
10
 
11
  Create Child Themes quickly and easily from any theme that you have currently installed on your site/blog.
80
  Go to Admin > Appearance > Orbisius Theme Editor then click on the theme you like and the child theme will be created for you.
81
 
82
  = Demo =
83
+ https://www.youtube.com/watch?v=BZUVq6ZTv-o
84
 
85
  = Premium =
86
  Do you want to be able to preview themes from within the 2 editors?
163
  title="If you want a custom web/mobile app/plugin developed contact us. This opens in a new window/tab"
164
  class="button-primary" target="_blank">Get a Free Quote</a>
165
 
166
+ @Todo
167
  - Add buttons in the WP's Theme listing page near Customize
168
  - Orbisius Create
169
  - Orbisius Edit
170
 
171
  == Changelog ==
172
 
173
+ = 1.5.4 =
174
+ * Tested with WP 5.9
175
+ * Fixed some https links
176
+ * Fix: file get contents do not receive LOCK_EX flag
177
+ * Fix: the .min files weren't loaded
178
+
179
+ = 1.5.3 =
180
+ * Update code to ensure that parent theme css is loaded first and then child theme's css file next.
181
+ * Added priority to the enqueued style so the child theme can override the parent theme's css styles
182
+ * Using last modified time for the parent and child themes' css files so the browsers load the files as soon as they are updated
183
+ * Removed some social sharing widgets
184
+ * Added an option for index.html file to be generated to prevent file listing when child theme folder is directly accessed.
185
+
186
  = 1.5.2 =
187
  * Copy files from one theme to another
188
  * Simplified settings page