WP Editor - Version 1.2

Version Description

  • Added Save, Undo, Redo, Search, Find Next, Find Prev, Replace, Replace All and Fullscreen buttons to plugin/theme editors
  • Added ability to hide WP Editor menu icon from menu sidebar and move it to settings submenu
  • Added ability to check if file is writable and add error messages accordingly in plugin/theme editors
  • Added highlighting of shortcodes in Post editor
  • Updated is_writeable() to is_writable()
  • Fixed conflicts with TinyMCE Advanced and Ultimate TinyMCE plugins
  • Fixed conflict with WooThemes themes
Download this release

Release Info

Developer benjaminprojas
Plugin Icon 128x128 WP Editor
Version 1.2
Comparing to
See all releases

Code changes from version 1.1.0.3 to 1.2

classes/WPEditorAdmin.php CHANGED
@@ -2,11 +2,15 @@
2
  class WPEditorAdmin {
3
 
4
  public function buildAdminMenu() {
5
- $icon = WPEDITOR_URL . '/images/wpeditor_logo_16.png';
6
  $page_roles = WPEditorSetting::getValue('admin_page_roles');
7
  $page_roles = unserialize($page_roles);
8
-
9
- $settings = add_menu_page(__('WP Editor Settings', 'wpeditor'), __('WP Editor', 'wpeditor'), $page_roles['settings'], 'wpeditor_admin', array('WPEditorAdmin', 'addSettingsPage'), $icon);
 
 
 
 
 
10
  //add_submenu_page('wpeditor_admin', __('Sub Menu', 'wpeditor'), __('Orders', 'wpeditor'), $page_roles['orders'], 'wpeditor_admin', array('WPEditorAdmin', 'subMenuPage'));
11
  add_action('admin_print_styles-' . $settings, array('WPEditorAdmin', 'defaultStylesheetAndScript'));
12
  }
2
  class WPEditorAdmin {
3
 
4
  public function buildAdminMenu() {
 
5
  $page_roles = WPEditorSetting::getValue('admin_page_roles');
6
  $page_roles = unserialize($page_roles);
7
+ if(WPEditorSetting::getValue('hide_wpeditor_menu')) {
8
+ $settings = add_submenu_page('options-general.php', __('WP Editor Settings', 'wpeditor'), __('WP Editor', 'wpeditor'), $page_roles['settings'], 'wpeditor_admin', array('WPEditorAdmin', 'addSettingsPage'));
9
+ }
10
+ else {
11
+ $icon = WPEDITOR_URL . '/images/wpeditor_logo_16.png';
12
+ $settings = add_menu_page(__('WP Editor Settings', 'wpeditor'), __('WP Editor', 'wpeditor'), $page_roles['settings'], 'wpeditor_admin', array('WPEditorAdmin', 'addSettingsPage'), $icon);
13
+ }
14
  //add_submenu_page('wpeditor_admin', __('Sub Menu', 'wpeditor'), __('Orders', 'wpeditor'), $page_roles['orders'], 'wpeditor_admin', array('WPEditorAdmin', 'subMenuPage'));
15
  add_action('admin_print_styles-' . $settings, array('WPEditorAdmin', 'defaultStylesheetAndScript'));
16
  }
classes/WPEditorAjax.php CHANGED
@@ -57,21 +57,29 @@ class WPEditorAjax {
57
  try {
58
  if(isset($_POST['new_content']) && isset($_POST['real_file'])) {
59
  $real_file = $_POST['real_file'];
60
- if(file_exists($real_file) && is_writeable($real_file)) {
61
- $new_content = stripslashes($_POST['new_content']);
62
- if(file_get_contents($real_file) === $new_content) {
63
- WPEditorLog::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Contents are the same");
 
 
 
 
 
 
 
 
64
  }
65
  else {
66
- $f = fopen($real_file, 'w+');
67
- fwrite($f, $new_content);
68
- fclose($f);
69
- WPEditorLog::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] just wrote to $real_file");
70
  }
71
  }
 
 
 
72
  }
73
  else {
74
- $error = 'Invalid Content';
75
  }
76
  }
77
  catch(WPEditorException $e) {
57
  try {
58
  if(isset($_POST['new_content']) && isset($_POST['real_file'])) {
59
  $real_file = $_POST['real_file'];
60
+ if(file_exists($real_file)) {
61
+ if(is_writable($real_file)) {
62
+ $new_content = stripslashes($_POST['new_content']);
63
+ if(file_get_contents($real_file) === $new_content) {
64
+ WPEditorLog::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Contents are the same");
65
+ }
66
+ else {
67
+ $f = fopen($real_file, 'w+');
68
+ fwrite($f, $new_content);
69
+ fclose($f);
70
+ WPEditorLog::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] just wrote to $real_file");
71
+ }
72
  }
73
  else {
74
+ $error = __('This file is not writable', 'wpeditor');
 
 
 
75
  }
76
  }
77
+ else {
78
+ $error = __('This file does not exist', 'wpeditor');
79
+ }
80
  }
81
  else {
82
+ $error = __('Invalid Content', 'wpeditor');
83
  }
84
  }
85
  catch(WPEditorException $e) {
classes/WPEditorBrowser.php CHANGED
@@ -14,7 +14,7 @@ class WPEditorBrowser {
14
  $topdir = substr($dir, 0, $pos + 1);
15
  $i = 0;
16
  while(false !== ($file = readdir($handle))) {
17
- if($file != '.' && $file != '..' && substr($file, 0, 1) != '.' && WPEditorBrowser::allowedFiles($dir, $file)) {
18
  $rows[$i]['data'] = $file;
19
  $rows[$i]['dir'] = is_dir($dir . $slash . $file);
20
  $i++;
@@ -36,6 +36,10 @@ class WPEditorBrowser {
36
  $output[$i]['filesize'] = '';
37
  }
38
  else {
 
 
 
 
39
  $output[$i]['filetype'] = 'file';
40
  $path = pathinfo($output[$i]['name']);
41
  if(isset($path['extension'])) {
@@ -67,6 +71,10 @@ class WPEditorBrowser {
67
  $output['extension'] = $path['extension'];
68
  }
69
  $output['content'] = file_get_contents($dir);
 
 
 
 
70
  if($type == 'theme') {
71
  $output['file'] = str_replace(realpath(get_theme_root()) . $slash, '', $output['path']);
72
  $output['url'] = get_theme_root_uri() . $slash . $output['file'];
@@ -107,6 +115,10 @@ class WPEditorBrowser {
107
  $output[$i]['filesize'] = '';
108
  }
109
  else {
 
 
 
 
110
  $output[$i]['filetype'] = 'file';
111
  $path = pathinfo($rows[$i]['data']);
112
  if(isset($path['extension'])) {
@@ -117,6 +129,10 @@ class WPEditorBrowser {
117
  if($output[$i]['path'] == $dir) {
118
  $output[$i]['content'] = file_get_contents($dir);
119
  }
 
 
 
 
120
  if($type == 'theme') {
121
  $output[$i]['file'] = str_replace(realpath(get_theme_root()) . $slash, '', $output[$i]['path']);
122
  $output[$i]['url'] = get_theme_root_uri() . $slash . $output[$i]['file'];
14
  $topdir = substr($dir, 0, $pos + 1);
15
  $i = 0;
16
  while(false !== ($file = readdir($handle))) {
17
+ if($file != '.' && $file != '..' && substr($file, 0, 1) != '.' && self::allowedFiles($dir, $file)) {
18
  $rows[$i]['data'] = $file;
19
  $rows[$i]['dir'] = is_dir($dir . $slash . $file);
20
  $i++;
36
  $output[$i]['filesize'] = '';
37
  }
38
  else {
39
+ $output[$i]['writable'] = false;
40
+ if(is_writable($output[$i]['path'])) {
41
+ $output[$i]['writable'] = true;
42
+ }
43
  $output[$i]['filetype'] = 'file';
44
  $path = pathinfo($output[$i]['name']);
45
  if(isset($path['extension'])) {
71
  $output['extension'] = $path['extension'];
72
  }
73
  $output['content'] = file_get_contents($dir);
74
+ $output['writable'] = false;
75
+ if(is_writable($output['path'])) {
76
+ $output['writable'] = true;
77
+ }
78
  if($type == 'theme') {
79
  $output['file'] = str_replace(realpath(get_theme_root()) . $slash, '', $output['path']);
80
  $output['url'] = get_theme_root_uri() . $slash . $output['file'];
115
  $output[$i]['filesize'] = '';
116
  }
117
  else {
118
+ $output[$i]['writable'] = false;
119
+ if(is_writable($output[$i]['path'])) {
120
+ $output[$i]['writable'] = true;
121
+ }
122
  $output[$i]['filetype'] = 'file';
123
  $path = pathinfo($rows[$i]['data']);
124
  if(isset($path['extension'])) {
129
  if($output[$i]['path'] == $dir) {
130
  $output[$i]['content'] = file_get_contents($dir);
131
  }
132
+ $output[$i]['writable'] = false;
133
+ if(is_writable($output[$i]['path'])) {
134
+ $output[$i]['writable'] = true;
135
+ }
136
  if($type == 'theme') {
137
  $output[$i]['file'] = str_replace(realpath(get_theme_root()) . $slash, '', $output[$i]['path']);
138
  $output[$i]['url'] = get_theme_root_uri() . $slash . $output[$i]['file'];
classes/WPEditorPlugins.php CHANGED
@@ -45,7 +45,7 @@ class WPEditorPlugins {
45
  $current_plugin_root = WP_PLUGIN_DIR . '/' . dirname($file);
46
  $real_file = WP_PLUGIN_DIR . '/' . $plugin;
47
 
48
- if(isset($_POST['new-content']) && file_exists($real_file) && is_writeable($real_file)) {
49
  $new_content = stripslashes($_POST['new-content']);
50
  if(file_get_contents($real_file) === $new_content) {
51
  WPEditorLog::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Contents are the same");
45
  $current_plugin_root = WP_PLUGIN_DIR . '/' . dirname($file);
46
  $real_file = WP_PLUGIN_DIR . '/' . $plugin;
47
 
48
+ if(isset($_POST['new-content']) && file_exists($real_file) && is_writable($real_file)) {
49
  $new_content = stripslashes($_POST['new-content']);
50
  if(file_get_contents($real_file) === $new_content) {
51
  WPEditorLog::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Contents are the same");
classes/WPEditorThemes.php CHANGED
@@ -87,7 +87,7 @@ class WPEditorThemes {
87
  }
88
  $real_file = $current_theme_root . basename($file);
89
 
90
- if(isset($_POST['new-content']) && file_exists($real_file) && is_writeable($real_file)) {
91
  $new_content = stripslashes($_POST['new-content']);
92
  if(file_get_contents($real_file) === $new_content) {
93
  WPEditorLog::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Contents are the same");
87
  }
88
  $real_file = $current_theme_root . basename($file);
89
 
90
+ if(isset($_POST['new-content']) && file_exists($real_file) && is_writable($real_file)) {
91
  $new_content = stripslashes($_POST['new-content']);
92
  if(file_get_contents($real_file) === $new_content) {
93
  WPEditorLog::log('[' . basename(__FILE__) . ' - line ' . __LINE__ . "] Contents are the same");
extensions/codemirror/dialog.css CHANGED
@@ -1,23 +1,37 @@
1
  .CodeMirror-dialog {
2
- position: relative;
3
- }
4
-
5
- .CodeMirror-dialog > div {
6
- position: absolute;
7
- top: 0; left: 0; right: 0;
8
- background: white;
9
- border-bottom: 1px solid #eee;
10
  z-index: 15;
11
- padding: .1em .8em;
 
 
 
12
  overflow: hidden;
 
13
  color: #333;
14
  }
15
 
 
 
 
 
 
 
 
 
 
 
16
  .CodeMirror-dialog input {
17
- border: none;
18
- outline: none;
19
- background: transparent;
20
  width: 20em;
21
  color: inherit;
22
  font-family: monospace;
23
  }
 
 
 
 
1
  .CodeMirror-dialog {
2
+ position:absolute;
3
+ background: #EEE;
4
+ background-image: -webkit-gradient(linear,left bottom,left top,from(#E5E5E5),to(#F4F4F4));
5
+ background-image: -webkit-linear-gradient(bottom,#E5E5E5,#F4F4F4);
6
+ background-image: -moz-linear-gradient(bottom,#E5E5E5,#F4F4F4);
7
+ background-image: -o-linear-gradient(bottom,#E5E5E5,#F4F4F4);
8
+ background-image: linear-gradient(to top,#E5E5E5,#F4F4F4);
 
9
  z-index: 15;
10
+ padding: 5px 8px;
11
+ font-family:Arial, Helvetica, 'sans-serif normal';
12
+ right:16px;
13
+ top:36px;
14
  overflow: hidden;
15
+ border-right:none;
16
  color: #333;
17
  }
18
 
19
+ .CodeMirror-dialog-top {
20
+ border-bottom: 1px solid #eee;
21
+ top: 0;
22
+ }
23
+
24
+ .CodeMirror-dialog-bottom {
25
+ border-top: 1px solid #eee;
26
+ bottom: 0;
27
+ }
28
+
29
  .CodeMirror-dialog input {
 
 
 
30
  width: 20em;
31
  color: inherit;
32
  font-family: monospace;
33
  }
34
+
35
+ .CodeMirror-dialog button {
36
+ font-size: 70%;
37
+ }
extensions/codemirror/js/dialog.js CHANGED
@@ -3,12 +3,29 @@
3
  (function() {
4
  function dialogDiv(cm, template) {
5
  var wrap = cm.getWrapperElement();
6
- var dialog = wrap.insertBefore(document.createElement("div"), wrap.firstChild);
 
 
 
 
 
7
  dialog.className = "CodeMirror-dialog";
8
  dialog.innerHTML = '<div>' + template + '</div>';
9
  return dialog;
10
  }
11
-
 
 
 
 
 
 
 
 
 
 
 
 
12
  CodeMirror.defineExtension("openDialog", function(template, callback) {
13
  var dialog = dialogDiv(this, template);
14
  var closed = false, me = this;
3
  (function() {
4
  function dialogDiv(cm, template) {
5
  var wrap = cm.getWrapperElement();
6
+ if(hasClass(wrap.firstChild, 'quicktags-toolbar')) {
7
+ var dialog = insertAfter(document.createElement("div"), wrap.firstChild);
8
+ }
9
+ else {
10
+ var dialog = wrap.insertBefore(document.createElement("div"), wrap.firstChild);
11
+ }
12
  dialog.className = "CodeMirror-dialog";
13
  dialog.innerHTML = '<div>' + template + '</div>';
14
  return dialog;
15
  }
16
+ function hasClass(ele,cls) {
17
+ return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
18
+ }
19
+ function insertAfter(newElement,targetElement) {
20
+ var parent = targetElement.parentNode;
21
+ if(parent.lastchild == targetElement) {
22
+ return parent.appendChild(newElement);
23
+ }
24
+ else {
25
+ return parent.insertBefore(newElement, targetElement.nextSibling);
26
+ }
27
+ }
28
+
29
  CodeMirror.defineExtension("openDialog", function(template, callback) {
30
  var dialog = dialogDiv(this, template);
31
  var closed = false, me = this;
extensions/codemirror/themes/themes.css CHANGED
@@ -24,7 +24,7 @@
24
  .cm-s-default span.cm-quote {color: #090;}
25
  .cm-s-default span.cm-hr {color: #999;}
26
  .cm-s-default span.cm-link {color: #00c;}
27
- /*.cm-mustache {color: #611;font-weight:bold;}*/
28
 
29
  /************************************************************
30
  * Ambiance
@@ -64,6 +64,7 @@
64
  .cm-s-ambiance .CodeMirror-lines {}
65
  .cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor {border-left: 1px solid #7991E8;}
66
  .cm-s-ambiance .activeline {background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031);}
 
67
  .cm-s-ambiance, .cm-s-ambiance .CodeMirror-gutter {background-image: url("data:image/png;base64,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");
68
  }
69
 
@@ -92,7 +93,7 @@
92
  .cm-s-blackboard .cm-header { color: #FF6400; }
93
  .cm-s-blackboard .cm-hr { color: #AEAEAE; }
94
  .cm-s-blackboard .cm-link { color: #8DA6CE; }
95
-
96
  /************************************************************
97
  * Cobalt
98
  ************************************************************/
@@ -113,7 +114,7 @@
113
  .cm-s-cobalt span.cm-bracket { color: #d8d8d8; }
114
  .cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; }
115
  .cm-s-cobalt span.cm-link { color: #845dc4; }
116
-
117
  /************************************************************
118
  * Eclipse
119
  ************************************************************/
@@ -138,7 +139,7 @@
138
  .cm-s-eclipse span.cm-attribute {color: #00c;}
139
  .cm-s-eclipse span.cm-link {color: #219;}
140
  .cm-s-eclipse .CodeMirror-matchingbracket {border:1px solid grey; color:black !important;}
141
-
142
  /************************************************************
143
  * Elegant
144
  ************************************************************/
@@ -152,7 +153,7 @@
152
  .cm-s-elegant span.cm-builtin {color: #30a;}
153
  .cm-s-elegant span.cm-error {background-color: #fdd;}
154
  .cm-s-elegant span.cm-link {color: #762;}
155
-
156
  /************************************************************
157
  * Lesser Dark
158
  ************************************************************/
@@ -188,7 +189,7 @@ div.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/
188
  .cm-s-lesser-dark span.cm-quote {color: #090;}
189
  .cm-s-lesser-dark span.cm-hr {color: #999;}
190
  .cm-s-lesser-dark span.cm-link {color: #00c;}
191
-
192
  /************************************************************
193
  * Monokai
194
  ************************************************************/
@@ -211,7 +212,7 @@ div.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/
211
  .cm-s-monokai span.cm-tag {color: #f92672;}
212
  .cm-s-monokai span.cm-link {color: #ae81ff;}
213
  .cm-s-monokai .CodeMirror-matchingbracket {text-decoration: underline;color: white !important;}
214
-
215
  /************************************************************
216
  * Neat
217
  ************************************************************/
@@ -224,7 +225,7 @@ div.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/
224
  .cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; }
225
  .cm-s-neat span.cm-meta {color: #555;}
226
  .cm-s-neat span.cm-link { color: #3a3; }
227
-
228
  /************************************************************
229
  * Night
230
  ************************************************************/
@@ -246,7 +247,7 @@ div.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/
246
  .cm-s-night span.cm-comment { color: #6900a1; }
247
  .cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; }
248
  .cm-s-night span.cm-link { color: #845dc4; }
249
-
250
  /************************************************************
251
  * Ruby Blue
252
  ************************************************************/
@@ -269,7 +270,7 @@ div.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/
269
  .cm-s-rubyblue span.cm-link { color: #F4C20B; }
270
  .cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; }
271
  .cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; }
272
-
273
  /************************************************************
274
  * Vibrant Ink
275
  ************************************************************/
@@ -296,7 +297,7 @@ div.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/
296
  .cm-s-vibrant-ink .cm-header { color: #FF6400; }
297
  .cm-s-vibrant-ink .cm-hr { color: #AEAEAE; }
298
  .cm-s-vibrant-ink .cm-link { color: blue; }
299
-
300
  /************************************************************
301
  * XQ-Dark
302
  ************************************************************/
@@ -345,4 +346,5 @@ THE SOFTWARE.
345
  .cm-s-xq-dark span.cm-builtin {color: #30a;}
346
  .cm-s-xq-dark span.cm-bracket {color: #cc7;}
347
  .cm-s-xq-dark span.cm-tag {color: #FFBD40;}
348
- .cm-s-xq-dark span.cm-attribute {color: #FFF700;}
 
24
  .cm-s-default span.cm-quote {color: #090;}
25
  .cm-s-default span.cm-hr {color: #999;}
26
  .cm-s-default span.cm-link {color: #00c;}
27
+ .cm-mustache {color: #611;font-weight:bold;}
28
 
29
  /************************************************************
30
  * Ambiance
64
  .cm-s-ambiance .CodeMirror-lines {}
65
  .cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor {border-left: 1px solid #7991E8;}
66
  .cm-s-ambiance .activeline {background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031);}
67
+ .cm-s-ambiance .cm-mustache {color: #AF2018;font-weight:bold;}
68
  .cm-s-ambiance, .cm-s-ambiance .CodeMirror-gutter {background-image: url("data:image/png;base64,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");
69
  }
70
 
93
  .cm-s-blackboard .cm-header { color: #FF6400; }
94
  .cm-s-blackboard .cm-hr { color: #AEAEAE; }
95
  .cm-s-blackboard .cm-link { color: #8DA6CE; }
96
+ .cm-s-blackboard .cm-mustache {color: #9D1E15;font-weight:bold;}
97
  /************************************************************
98
  * Cobalt
99
  ************************************************************/
114
  .cm-s-cobalt span.cm-bracket { color: #d8d8d8; }
115
  .cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; }
116
  .cm-s-cobalt span.cm-link { color: #845dc4; }
117
+ .cm-s-cobalt .cm-mustache {color: #9d1e15;font-weight:bold;}
118
  /************************************************************
119
  * Eclipse
120
  ************************************************************/
139
  .cm-s-eclipse span.cm-attribute {color: #00c;}
140
  .cm-s-eclipse span.cm-link {color: #219;}
141
  .cm-s-eclipse .CodeMirror-matchingbracket {border:1px solid grey; color:black !important;}
142
+ .cm-s-eclipse .cm-mustache {color: #f00;font-weight:bold;}
143
  /************************************************************
144
  * Elegant
145
  ************************************************************/
153
  .cm-s-elegant span.cm-builtin {color: #30a;}
154
  .cm-s-elegant span.cm-error {background-color: #fdd;}
155
  .cm-s-elegant span.cm-link {color: #762;}
156
+ .cm-s-elegant .cm-mustache {color: #262;font-weight:bold;}
157
  /************************************************************
158
  * Lesser Dark
159
  ************************************************************/
189
  .cm-s-lesser-dark span.cm-quote {color: #090;}
190
  .cm-s-lesser-dark span.cm-hr {color: #999;}
191
  .cm-s-lesser-dark span.cm-link {color: #00c;}
192
+ .cm-s-lesser-dark .cm-mustache {color: #9d1e15;font-weight:bold;}
193
  /************************************************************
194
  * Monokai
195
  ************************************************************/
212
  .cm-s-monokai span.cm-tag {color: #f92672;}
213
  .cm-s-monokai span.cm-link {color: #ae81ff;}
214
  .cm-s-monokai .CodeMirror-matchingbracket {text-decoration: underline;color: white !important;}
215
+ .cm-s-monokai .cm-mustache {background: #f92672;color: #f8f8f0;font-weight:bold;}
216
  /************************************************************
217
  * Neat
218
  ************************************************************/
225
  .cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; }
226
  .cm-s-neat span.cm-meta {color: #555;}
227
  .cm-s-neat span.cm-link { color: #3a3; }
228
+ .cm-s-neat .cm-mustache {color: #a86;font-weight:bold;}
229
  /************************************************************
230
  * Night
231
  ************************************************************/
247
  .cm-s-night span.cm-comment { color: #6900a1; }
248
  .cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; }
249
  .cm-s-night span.cm-link { color: #845dc4; }
250
+ .cm-s-night .cm-mustache {color: #9d1e15;font-weight:bold;}
251
  /************************************************************
252
  * Ruby Blue
253
  ************************************************************/
270
  .cm-s-rubyblue span.cm-link { color: #F4C20B; }
271
  .cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; }
272
  .cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; }
273
+ .cm-s-rubyblue .cm-mustache {color: #AF2018;font-weight:bold;}
274
  /************************************************************
275
  * Vibrant Ink
276
  ************************************************************/
297
  .cm-s-vibrant-ink .cm-header { color: #FF6400; }
298
  .cm-s-vibrant-ink .cm-hr { color: #AEAEAE; }
299
  .cm-s-vibrant-ink .cm-link { color: blue; }
300
+ .cm-s-vibrant-ink .cm-mustache {color: #8DA6CE;font-weight:bold;}
301
  /************************************************************
302
  * XQ-Dark
303
  ************************************************************/
346
  .cm-s-xq-dark span.cm-builtin {color: #30a;}
347
  .cm-s-xq-dark span.cm-bracket {color: #cc7;}
348
  .cm-s-xq-dark span.cm-tag {color: #FFBD40;}
349
+ .cm-s-xq-dark span.cm-attribute {color: #FFF700;}
350
+ .cm-s-xq-dark .cm-mustache {color: #f00;font-weight:bold;}
js/posts-jquery.js CHANGED
@@ -97,6 +97,7 @@ tags = {};
97
  }
98
  }
99
  $(document).ready(function(){
 
100
  $('#ed_toolbar').hide();
101
  $('#wpe_qt_content_strong').live("click", function() {
102
  insertOpenCloseTag('strong', 'b', '<strong>', '</strong>');
@@ -160,17 +161,21 @@ tags = {};
160
  insertLinkTag(link, title, blank);
161
  return false;
162
  })
 
 
163
  $('#content-tmce').click(function() {
164
- if(editor_status != 'tmce') {
165
  editor.toTextArea();
166
  switchEditors.switchto(this);
167
  editor_status = 'tmce';
168
  }
169
  })
170
  $('#content-html').click(function() {
171
- if(editor_status != 'html') {
 
172
  postCodeMirror('content');
173
  editor_status = 'html';
 
174
  }
175
  else {
176
  editor.toTextArea();
@@ -219,7 +224,7 @@ tags = {};
219
  }
220
  });
221
  };
222
- window.original_send_to_editor = window.send_to_editor;
223
  window.send_to_editor = function(html){
224
  if(editor_status == 'html') {
225
  var cursor = editor.getCursor(true);
@@ -233,13 +238,13 @@ tags = {};
233
  });
234
  editor.toTextArea();
235
  $('#content').setContentCursor(lineArray[cursor.line] + cursor.ch, lineArray[cursor.line] + cursor.ch);
236
- window.original_send_to_editor(html);
237
  postCodeMirror('content');
238
  editor.setCursor(cursor.line, cursor.ch + html.length)
239
  editor.focus();
240
  }
241
  else {
242
- window.original_send_to_editor(html);
243
  }
244
  };
245
  function postCodeMirror(element) {
97
  }
98
  }
99
  $(document).ready(function(){
100
+
101
  $('#ed_toolbar').hide();
102
  $('#wpe_qt_content_strong').live("click", function() {
103
  insertOpenCloseTag('strong', 'b', '<strong>', '</strong>');
161
  insertLinkTag(link, title, blank);
162
  return false;
163
  })
164
+ $('#content-tmce').attr('onclick','').unbind('click');
165
+ $('#content-html').attr('onclick','').unbind('click');
166
  $('#content-tmce').click(function() {
167
+ if(editor_status !== 'tmce') {
168
  editor.toTextArea();
169
  switchEditors.switchto(this);
170
  editor_status = 'tmce';
171
  }
172
  })
173
  $('#content-html').click(function() {
174
+ if(editor_status !== 'html') {
175
+ switchEditors.switchto(this);
176
  postCodeMirror('content');
177
  editor_status = 'html';
178
+ return false;
179
  }
180
  else {
181
  editor.toTextArea();
224
  }
225
  });
226
  };
227
+ window.wp_editor_send_to_editor = window.send_to_editor;
228
  window.send_to_editor = function(html){
229
  if(editor_status == 'html') {
230
  var cursor = editor.getCursor(true);
238
  });
239
  editor.toTextArea();
240
  $('#content').setContentCursor(lineArray[cursor.line] + cursor.ch, lineArray[cursor.line] + cursor.ch);
241
+ window.wp_editor_send_to_editor(html);
242
  postCodeMirror('content');
243
  editor.setCursor(cursor.line, cursor.ch + html.length)
244
  editor.focus();
245
  }
246
  else {
247
+ window.wp_editor_send_to_editor(html);
248
  }
249
  };
250
  function postCodeMirror(element) {
js/wpeditor.js CHANGED
@@ -41,7 +41,8 @@ function toggleFullscreenEditing() {
41
  var editorDiv = $jq('.CodeMirror');
42
  if(!editorDiv.hasClass('CodeMirror-fullscreen')) {
43
  toggleFullscreenEditing.beforeFullscreen = {
44
- height: editorDiv.height(),
 
45
  width: editorDiv.width()
46
  }
47
  editorDiv.addClass('CodeMirror-fullscreen');
@@ -53,8 +54,8 @@ function toggleFullscreenEditing() {
53
  else {
54
  editorDiv.removeClass('CodeMirror-fullscreen');
55
  editorDiv.height(toggleFullscreenEditing.beforeFullscreen.height);
56
- $jq('.CodeMirror-scroll').height(toggleFullscreenEditing.beforeFullscreen.height);
57
- editorDiv.width('97%');
58
  editor.refresh();
59
  }
60
  }
@@ -131,12 +132,24 @@ function toggleFullscreenEditing() {
131
  $('#save-result').fadeIn(1000).delay(3000).fadeOut(300);
132
  }
133
  else {
 
 
 
 
 
 
 
 
 
 
 
 
134
  editor.toTextArea();
135
  $('#new-content').val(result.content);
136
  $('#file').val(result.file);
137
  $('#path').val(result.path);
138
  $('#extension').val(result.extension);
139
- $('.current_file').html(result.file);
140
  runCodeMirror(result.extension);
141
  }
142
  }
@@ -156,13 +169,20 @@ function toggleFullscreenEditing() {
156
  'filesize': value.filesize,
157
  'file': value.file,
158
  'extension': value.extension,
159
- 'url': value.url
 
160
  }
161
  ))
162
  }
163
  else {
 
 
 
 
 
 
164
  newElement.children('ul').append(
165
- $('<li><a href="#" class="' + value.filetype + '">' + value.name + ' <span class="tiny">' + value.filesize + '</span></a></li>').addClass(
166
  value.extension + ' ' + value.filetype
167
  ).data({
168
  'path': value.path,
@@ -170,7 +190,8 @@ function toggleFullscreenEditing() {
170
  'filesize': value.filesize,
171
  'file': value.file,
172
  'extension': value.extension,
173
- 'url': value.url
 
174
  }
175
  ))
176
  }
@@ -191,6 +212,7 @@ function toggleFullscreenEditing() {
191
  filesize: '',
192
  file: '',
193
  extension: '',
 
194
  open: 'opened',
195
  loading: 'loading'
196
  }, handler);
@@ -201,7 +223,8 @@ function toggleFullscreenEditing() {
201
  'filesize': this.options.filesize,
202
  'file': this.options.file,
203
  'extension': this.options.extension,
204
- 'url': this.options.url
 
205
  }).bind('retrieve:finder', ajaxFolders).trigger('retrieve:finder')
206
  }
207
  });
41
  var editorDiv = $jq('.CodeMirror');
42
  if(!editorDiv.hasClass('CodeMirror-fullscreen')) {
43
  toggleFullscreenEditing.beforeFullscreen = {
44
+ height: editorDiv.height(),
45
+ scrollHeight: editorDiv.height() - 33,
46
  width: editorDiv.width()
47
  }
48
  editorDiv.addClass('CodeMirror-fullscreen');
54
  else {
55
  editorDiv.removeClass('CodeMirror-fullscreen');
56
  editorDiv.height(toggleFullscreenEditing.beforeFullscreen.height);
57
+ $jq('.CodeMirror-scroll').height(toggleFullscreenEditing.beforeFullscreen.scrollHeight);
58
+ editorDiv.width('100%');
59
  editor.refresh();
60
  }
61
  }
132
  $('#save-result').fadeIn(1000).delay(3000).fadeOut(300);
133
  }
134
  else {
135
+ var notWritable = '';
136
+ if(!result.writable) {
137
+ $('p.submit').hide();
138
+ $('div.writable-error').show();
139
+ notWritable = ' <span class="not-writable">(not writable)</span>';
140
+ $('.writable_status').html('Browsing');
141
+ }
142
+ else {
143
+ $('p.submit').show();
144
+ $('div.writable-error').hide();
145
+ $('.writable_status').html('Editing');
146
+ }
147
  editor.toTextArea();
148
  $('#new-content').val(result.content);
149
  $('#file').val(result.file);
150
  $('#path').val(result.path);
151
  $('#extension').val(result.extension);
152
+ $('.current_file').html(result.file + notWritable);
153
  runCodeMirror(result.extension);
154
  }
155
  }
169
  'filesize': value.filesize,
170
  'file': value.file,
171
  'extension': value.extension,
172
+ 'url': value.url,
173
+ 'writable': value.writable
174
  }
175
  ))
176
  }
177
  else {
178
+ var writable = '';
179
+ var writableClass = '';
180
+ if(!value.writable) {
181
+ writable = '<span class="writable">&times;</span>';
182
+ writableClass = ' not-writable';
183
+ }
184
  newElement.children('ul').append(
185
+ $('<li><a href="#" class="' + value.filetype + writableClass + '">' + writable + ' ' + value.name + ' <span class="tiny">' + value.filesize + '</span></a></li>').addClass(
186
  value.extension + ' ' + value.filetype
187
  ).data({
188
  'path': value.path,
190
  'filesize': value.filesize,
191
  'file': value.file,
192
  'extension': value.extension,
193
+ 'url': value.url,
194
+ 'writable': value.writable
195
  }
196
  ))
197
  }
212
  filesize: '',
213
  file: '',
214
  extension: '',
215
+ writable: '',
216
  open: 'opened',
217
  loading: 'loading'
218
  }, handler);
223
  'filesize': this.options.filesize,
224
  'file': this.options.file,
225
  'extension': this.options.extension,
226
+ 'url': this.options.url,
227
+ 'writable': this.options.writable
228
  }).bind('retrieve:finder', ajaxFolders).trigger('retrieve:finder')
229
  }
230
  });
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === WP Editor ===
2
  Contributors: benjaminprojas
3
  Donate link: http://wpeditor.net/
4
- Tags: plugin editor, theme editor, page editor, post editor, pages, posts, html, codemirror, plugins, themes, editor, fancybox, post.php, post-new.php, ajax, syntax highlighting, html syntax highlighting
5
  Requires at least: 3.0
6
- Tested up to: 3.4.1
7
- Stable tag: 1.1.0.3
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -69,6 +69,15 @@ Yes! While we don't have a need for further developers at this time, any financi
69
 
70
  == Changelog ==
71
 
 
 
 
 
 
 
 
 
 
72
  = 1.1.0.3 =
73
  * Added Ambiance, Blackboard, Lesser Dark, Vibrant Ink and XQ-Dark themes
74
  * Fixed text selection in all editors
@@ -116,6 +125,14 @@ Yes! While we don't have a need for further developers at this time, any financi
116
 
117
  == Upgrade Notice ==
118
 
 
 
 
 
 
 
 
 
119
  = 1.1.0.3 =
120
  Fixed text selection in all editors
121
  Fixed post editor highlighter not loading when visual editor is disabled
1
  === WP Editor ===
2
  Contributors: benjaminprojas
3
  Donate link: http://wpeditor.net/
4
+ Tags: code editor, plugin editor, theme editor, page editor, post editor, pages, posts, html, codemirror, plugins, themes, editor, fancybox, post.php, post-new.php, ajax, syntax highlighting, html syntax highlighting
5
  Requires at least: 3.0
6
+ Tested up to: 3.5
7
+ Stable tag: 1.2
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
69
 
70
  == Changelog ==
71
 
72
+ = 1.2 =
73
+ * Added Save, Undo, Redo, Search, Find Next, Find Prev, Replace, Replace All and Fullscreen buttons to plugin/theme editors
74
+ * Added ability to hide WP Editor menu icon from menu sidebar and move it to settings submenu
75
+ * Added ability to check if file is writable and add error messages accordingly in plugin/theme editors
76
+ * Added highlighting of shortcodes in Post editor
77
+ * Updated is_writeable() to is_writable()
78
+ * Fixed conflicts with TinyMCE Advanced and Ultimate TinyMCE plugins
79
+ * Fixed conflict with WooThemes themes
80
+
81
  = 1.1.0.3 =
82
  * Added Ambiance, Blackboard, Lesser Dark, Vibrant Ink and XQ-Dark themes
83
  * Fixed text selection in all editors
125
 
126
  == Upgrade Notice ==
127
 
128
+ = 1.2 =
129
+ Compatibility with WordPress 3.5
130
+ Added Save, Undo, Redo, Search, Find Next, Find Prev, Replace, Replace All and Fullscreen buttons to plugin/theme editors
131
+ Added ability to hide WP Editor menu icon from menu sidebar and move it to settings submenu
132
+ Added ability to check if file is writable and add error messages accordingly in plugin/theme editors
133
+ Added highlighting of shortcodes in Post editor
134
+ Fixed conflicts with multiple plugins and themes
135
+
136
  = 1.1.0.3 =
137
  Fixed text selection in all editors
138
  Fixed post editor highlighter not loading when visual editor is disabled
views/plugin-editor.php CHANGED
@@ -12,14 +12,14 @@
12
  <h3>
13
  <?php
14
  if(is_plugin_active($data['plugin'])) {
15
- if(is_writeable($data['real_file'])) {
16
  echo __('Editing <span class="current_file">', 'wpeditor') . $data['file'] . __('</span> (active)', 'wpeditor');
17
  }
18
  else {
19
  echo __('Browsing <span class="current_file">', 'wpeditor') . $data['file'] . __('</span> (active)', 'wpeditor');
20
  }
21
  } else {
22
- if (is_writeable($data['real_file'])) {
23
  echo __('Editing <span class="current_file">', 'wpeditor') . $data['file'] . __('</span> (inactive)', 'wpeditor');
24
  }
25
  else {
@@ -59,7 +59,7 @@
59
  <?php if(WPEditorSetting::getValue('plugin_file_upload')): ?>
60
  <h3><?php _e('Upload Files', 'wpeditor'); ?></h3>
61
  <div id="plugin-upload-files">
62
- <?php if(is_writeable($data['real_file'])): ?>
63
  <form enctype="multipart/form-data" id="plugin_upload_form" method="POST">
64
  <!-- MAX_FILE_SIZE must precede the file input field -->
65
  <!--input type="hidden" name="MAX_FILE_SIZE" value="30000" /-->
@@ -69,7 +69,7 @@
69
  <input type="hidden" name="current_plugin_root" value="<?php echo $data['current_plugin_root']; ?>" id="current_plugin_root" />
70
  <input type="text" name="directory" id="file_directory" style="width:190px" placeholder="<?php _e('Optional: Sub-Directory', 'wpeditor'); ?>" />
71
  <!-- Name of input element determines name in $_FILES array -->
72
- <input name="file" type="file" id="file" style="width:180px" />
73
  <div class="ajax-button-loader">
74
  <?php submit_button(__('Upload File', 'wpeditor'), 'primary', 'submit', false); ?>
75
  <div class="ajax-loader"></div>
@@ -90,7 +90,7 @@
90
  </div>
91
  </div>
92
 
93
- <form name="template" id="template_form" action="" method="post" class="ajax-editor-update">
94
  <?php wp_nonce_field('edit-plugin_' . $data['real_file']); ?>
95
  <div>
96
  <textarea cols="70" rows="25" name="new-content" id="new-content" tabindex="1"><?php echo $data['content'] ?></textarea>
@@ -106,7 +106,7 @@
106
  ?>
107
  <input type="hidden" name="extension" id="extension" value="<?php echo $pathinfo['extension']; ?>" />
108
  </div>
109
- <?php if(is_writeable($data['real_file'])): ?>
110
  <p class="submit">
111
  <?php
112
  if(isset($_GET['phperror'])) {
@@ -118,10 +118,28 @@
118
  }
119
  ?>
120
  </p>
 
 
 
 
 
121
  <?php else: ?>
122
- <p>
123
- <em><?php _e('You need to make this file writable before you can save your changes. See <a href="http://codex.wordpress.org/Changing_File_Permissions" target="_blank">the Codex</a> for more information.'); ?></em>
 
 
 
 
 
 
 
 
124
  </p>
 
 
 
 
 
125
  <?php endif; ?>
126
  </form>
127
  <script type="text/javascript">
@@ -168,14 +186,6 @@
168
  });
169
  return false;
170
  });
171
- <?php if(WPEditorSetting::getValue('enable_plugin_editor_height')) { ?>
172
- $('.CodeMirror-scroll, .CodeMirror').height('<?php echo WPEditorSetting::getValue("enable_plugin_editor_height"); ?>px');
173
- var scrollDivHeight = $('.CodeMirror-scroll div:first-child').height();
174
- var editorDivHeight = $('.CodeMirror').height();
175
- if(scrollDivHeight > editorDivHeight) {
176
- $('.CodeMirror-gutter').height(scrollDivHeight);
177
- }
178
- <?php } ?>
179
  })
180
  })(jQuery);
181
  function runCodeMirror(extension) {
@@ -240,6 +250,67 @@
240
  if(activeLine) {
241
  var hlLine = editor.setLineClass(0, activeLine);
242
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
  }
244
  </script>
245
  </div>
12
  <h3>
13
  <?php
14
  if(is_plugin_active($data['plugin'])) {
15
+ if(is_writable($data['real_file'])) {
16
  echo __('Editing <span class="current_file">', 'wpeditor') . $data['file'] . __('</span> (active)', 'wpeditor');
17
  }
18
  else {
19
  echo __('Browsing <span class="current_file">', 'wpeditor') . $data['file'] . __('</span> (active)', 'wpeditor');
20
  }
21
  } else {
22
+ if (is_writable($data['real_file'])) {
23
  echo __('Editing <span class="current_file">', 'wpeditor') . $data['file'] . __('</span> (inactive)', 'wpeditor');
24
  }
25
  else {
59
  <?php if(WPEditorSetting::getValue('plugin_file_upload')): ?>
60
  <h3><?php _e('Upload Files', 'wpeditor'); ?></h3>
61
  <div id="plugin-upload-files">
62
+ <?php if(is_writable($data['real_file'])): ?>
63
  <form enctype="multipart/form-data" id="plugin_upload_form" method="POST">
64
  <!-- MAX_FILE_SIZE must precede the file input field -->
65
  <!--input type="hidden" name="MAX_FILE_SIZE" value="30000" /-->
69
  <input type="hidden" name="current_plugin_root" value="<?php echo $data['current_plugin_root']; ?>" id="current_plugin_root" />
70
  <input type="text" name="directory" id="file_directory" style="width:190px" placeholder="<?php _e('Optional: Sub-Directory', 'wpeditor'); ?>" />
71
  <!-- Name of input element determines name in $_FILES array -->
72
+ <input name="file" type="file" id="upload_file" style="width:180px" />
73
  <div class="ajax-button-loader">
74
  <?php submit_button(__('Upload File', 'wpeditor'), 'primary', 'submit', false); ?>
75
  <div class="ajax-loader"></div>
90
  </div>
91
  </div>
92
 
93
+ <form name="template" id="template_form" action="" method="post" class="ajax-editor-update" style="float:left width:auto;overflow:hidden;position:relative;">
94
  <?php wp_nonce_field('edit-plugin_' . $data['real_file']); ?>
95
  <div>
96
  <textarea cols="70" rows="25" name="new-content" id="new-content" tabindex="1"><?php echo $data['content'] ?></textarea>
106
  ?>
107
  <input type="hidden" name="extension" id="extension" value="<?php echo $pathinfo['extension']; ?>" />
108
  </div>
109
+ <?php if(is_writable($data['real_file'])): ?>
110
  <p class="submit">
111
  <?php
112
  if(isset($_GET['phperror'])) {
118
  }
119
  ?>
120
  </p>
121
+ <div class="error writable-error" style="display:none;">
122
+ <p>
123
+ <em><?php _e('You need to make this file writable before you can save your changes. See <a href="http://codex.wordpress.org/Changing_File_Permissions" target="_blank">the Codex</a> for more information.'); ?></em>
124
+ </p>
125
+ </div>
126
  <?php else: ?>
127
+ <p class="submit" style="display:none;">
128
+ <?php
129
+ if(isset($_GET['phperror'])) {
130
+ echo '<input type="hidden" name="phperror" value="1" />'; ?>
131
+ <input type="submit" name="submit" class="button-primary" value="<?php _e('Update File and Attempt to Reactivate', 'wpeditor'); ?>" />
132
+ <?php } else { ?>
133
+ <input type="submit" name='submit' class="button-primary" value="<?php _e('Update File', 'wpeditor'); ?>" />
134
+ <?php
135
+ }
136
+ ?>
137
  </p>
138
+ <div class="error writable-error">
139
+ <p>
140
+ <em><?php _e('You need to make this file writable before you can save your changes. See <a href="http://codex.wordpress.org/Changing_File_Permissions" target="_blank">the Codex</a> for more information.'); ?></em>
141
+ </p>
142
+ </div>
143
  <?php endif; ?>
144
  </form>
145
  <script type="text/javascript">
186
  });
187
  return false;
188
  });
 
 
 
 
 
 
 
 
189
  })
190
  })(jQuery);
191
  function runCodeMirror(extension) {
250
  if(activeLine) {
251
  var hlLine = editor.setLineClass(0, activeLine);
252
  }
253
+ <?php if(WPEditorSetting::getValue('enable_plugin_editor_height')) { ?>
254
+ $jq = jQuery.noConflict();
255
+ $jq('.CodeMirror-scroll, .CodeMirror').height('<?php echo WPEditorSetting::getValue("enable_plugin_editor_height"); ?>px');
256
+ var scrollDivHeight = $jq('.CodeMirror-scroll div:first-child').height();
257
+ var editorDivHeight = $jq('.CodeMirror').height();
258
+ if(scrollDivHeight > editorDivHeight) {
259
+ $jq('.CodeMirror-gutter').height(scrollDivHeight);
260
+ }
261
+ <?php } ?>
262
+ if(!$jq('.CodeMirror .quicktags-toolbar').length) {
263
+ $jq('.CodeMirror').prepend('<div class="quicktags-toolbar">' +
264
+ '<a href="#" class="button-primary editor-button" id="plugin_save">save</a>&nbsp;' +
265
+ '<a href="#" class="button-secondary editor-button" id="plugin_undo">undo</a>&nbsp;' +
266
+ '<a href="#" class="button-secondary editor-button" id="plugin_redo">redo</a>&nbsp;' +
267
+ '<a href="#" class="button-secondary editor-button" id="plugin_search">search</a>&nbsp;' +
268
+ '<a href="#" class="button-secondary editor-button" id="plugin_find_prev">find prev</a>&nbsp;' +
269
+ '<a href="#" class="button-secondary editor-button" id="plugin_find_next">find next</a>&nbsp;' +
270
+ '<a href="#" class="button-secondary editor-button" id="plugin_replace">replace</a>&nbsp;' +
271
+ '<a href="#" class="button-secondary editor-button" id="plugin_replace_all">replace all</a>&nbsp;' +
272
+ '<a href="#" class="button-secondary editor-button" id="plugin_fullscreen">fullscreen</a>&nbsp;' +
273
+ '</div>'
274
+ );
275
+ $jq('.CodeMirror-scroll').height($jq('.CodeMirror-scroll').height() - 33);
276
+ editor.focus();
277
+ }
278
+ $jq('#plugin_fullscreen').live("click", function() {
279
+ toggleFullscreenEditing();
280
+ editor.focus();
281
+ })
282
+ $jq('#plugin_save').live("click", function() {
283
+ $jq('.ajax-editor-update').submit();
284
+ editor.focus();
285
+ })
286
+ $jq('#plugin_undo').live("click", function() {
287
+ editor.undo();
288
+ editor.focus();
289
+ })
290
+ $jq('#plugin_redo').live("click", function() {
291
+ editor.redo();
292
+ editor.focus();
293
+ })
294
+ $jq('#plugin_search').live("click", function() {
295
+ CodeMirror.commands.find(editor);
296
+ return false;
297
+ })
298
+ $jq('#plugin_find_next').live("click", function() {
299
+ CodeMirror.commands.findNext(editor);
300
+ return false;
301
+ })
302
+ $jq('#plugin_find_prev').live("click", function() {
303
+ CodeMirror.commands.findPrev(editor);
304
+ return false;
305
+ })
306
+ $jq('#plugin_replace').live("click", function() {
307
+ CodeMirror.commands.replace(editor);
308
+ return false;
309
+ })
310
+ $jq('#plugin_replace_all').live("click", function() {
311
+ CodeMirror.commands.replaceAll(editor);
312
+ return false;
313
+ })
314
  }
315
  </script>
316
  </div>
views/settings.php CHANGED
@@ -102,6 +102,25 @@
102
  </ul>
103
  </div>
104
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  <div id="save-settings">
106
  <ul>
107
  <li>
102
  </ul>
103
  </div>
104
  </div>
105
+ <div id="menu-location" class="section">
106
+ <div class="section-header">
107
+ <h3><?php _e('WP Editor Menu Location', 'wpeditor'); ?></h3>
108
+ </div>
109
+ <div class="section-body">
110
+ <ul>
111
+ <li>
112
+ <label for="hide_wpeditor_menu"><?php _e('Hide WP Editor Icon:', 'wpeditor'); ?></label>
113
+ </li>
114
+ <li class="indent">
115
+ <input type="radio" name="hide_wpeditor_menu" value="1" <?php echo (WPEditorSetting::getValue('hide_wpeditor_menu') == 1) ? 'checked="checked"' : ''; ?>> <?php _e('Yes', 'wpeditor'); ?>
116
+ <input type="radio" name="hide_wpeditor_menu" value="0" <?php echo (WPEditorSetting::getValue('hide_wpeditor_menu') != 1) ? 'checked="checked"' : ''; ?>> <?php _e('No', 'wpeditor'); ?>
117
+ </li>
118
+ <li class="indent description">
119
+ <p><?php _e("If set to yes, this will hide the WP Editor icon from the menu on the left. You will be able to access this settings page from the main Settings drop down instead.<br />Default: No", 'wpeditor'); ?></p>
120
+ </li>
121
+ </ul>
122
+ </div>
123
+ </div>
124
  <div id="save-settings">
125
  <ul>
126
  <li>
views/theme-editor.php CHANGED
@@ -16,11 +16,11 @@
16
  <?php echo $data['themes'][$data['theme']]['Name'] . ': '; ?>
17
  <?php endif; ?>
18
  <?php
19
- if(is_writeable($data['real_file'])) {
20
- echo __('Editing <span class="current_file">', 'wpeditor') . $data['file'] . __('</span>', 'wpeditor');
21
  }
22
  else {
23
- echo __('Browsing <span class="current_file">', 'wpeditor') . $data['file'] . __('</span>', 'wpeditor');
24
  }
25
  ?>
26
  </h3>
@@ -66,7 +66,7 @@
66
  <?php if(WPEditorSetting::getValue('theme_file_upload')): ?>
67
  <h3><?php _e('Upload Files', 'wpeditor'); ?></h3>
68
  <div id="theme-upload-files">
69
- <?php if(is_writeable($data['real_file'])): ?>
70
  <form enctype="multipart/form-data" id="theme_upload_form" method="POST">
71
  <!-- MAX_FILE_SIZE must precede the file input field -->
72
  <!--input type="hidden" name="MAX_FILE_SIZE" value="30000" /-->
@@ -76,7 +76,7 @@
76
  <input type="hidden" name="current_theme_root" value="<?php echo $data['current_theme_root']; ?>" id="current_theme_root" />
77
  <input type="text" name="directory" id="file_directory" style="width:190px" placeholder="<?php _e('Optional: Sub-Directory', 'wpeditor'); ?>" />
78
  <!-- Name of input element determines name in $_FILES array -->
79
- <input name="file" type="file" id="file" style="width:180px" />
80
  <div class="ajax-button-loader">
81
  <?php submit_button(__('Upload File', 'wpeditor'), 'primary', 'submit', false); ?>
82
  <div class="ajax-loader"></div>
@@ -97,7 +97,7 @@
97
  </div>
98
  </div>
99
 
100
- <form name="template" id="template_form" action="" method="post" class="ajax-editor-update">
101
  <?php wp_nonce_field('edit-theme_' . $data['real_file']); ?>
102
  <div>
103
  <textarea cols="70" rows="25" name="new-content" id="new-content" tabindex="1"><?php echo $data['content'] ?></textarea>
@@ -113,7 +113,7 @@
113
  ?>
114
  <input type="hidden" name="extension" id="extension" value="<?php echo $pathinfo['extension']; ?>" />
115
  </div>
116
- <?php if(is_writeable($data['real_file'])): ?>
117
  <p class="submit">
118
  <?php
119
  if(isset($_GET['phperror'])) {
@@ -125,10 +125,28 @@
125
  }
126
  ?>
127
  </p>
 
 
 
 
 
128
  <?php else: ?>
129
- <p>
130
- <em><?php _e('You need to make this file writable before you can save your changes. See <a href="http://codex.wordpress.org/Changing_File_Permissions" target="_blank">the Codex</a> for more information.'); ?></em>
 
 
 
 
 
 
 
 
131
  </p>
 
 
 
 
 
132
  <?php endif; ?>
133
  </form>
134
  <script type="text/javascript">
@@ -175,14 +193,6 @@
175
  });
176
  return false;
177
  });
178
- <?php if(WPEditorSetting::getValue('enable_theme_editor_height')) { ?>
179
- $('.CodeMirror-scroll, .CodeMirror').height('<?php echo WPEditorSetting::getValue("enable_theme_editor_height"); ?>px');
180
- var scrollDivHeight = $('.CodeMirror-scroll div:first-child').height();
181
- var editorDivHeight = $('.CodeMirror').height();
182
- if(scrollDivHeight > editorDivHeight) {
183
- $('.CodeMirror-gutter').height(scrollDivHeight);
184
- }
185
- <?php } ?>
186
  })
187
  })(jQuery);
188
  function runCodeMirror(extension) {
@@ -247,6 +257,67 @@
247
  if(activeLine) {
248
  var hlLine = editor.setLineClass(0, activeLine);
249
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
  }
251
  </script>
252
  </div>
16
  <?php echo $data['themes'][$data['theme']]['Name'] . ': '; ?>
17
  <?php endif; ?>
18
  <?php
19
+ if(is_writable($data['real_file'])) {
20
+ echo '<span class="writable_status">' . __('Editing', 'wpeditor') . '</span> <span class="current_file">' . $data['file'] . '</span>';
21
  }
22
  else {
23
+ echo '<span class="writable_status">' . __('Browsing', 'wpeditor') . '</span> <span class="current_file">' . $data['file'] . '</span>';
24
  }
25
  ?>
26
  </h3>
66
  <?php if(WPEditorSetting::getValue('theme_file_upload')): ?>
67
  <h3><?php _e('Upload Files', 'wpeditor'); ?></h3>
68
  <div id="theme-upload-files">
69
+ <?php if(is_writable($data['real_file'])): ?>
70
  <form enctype="multipart/form-data" id="theme_upload_form" method="POST">
71
  <!-- MAX_FILE_SIZE must precede the file input field -->
72
  <!--input type="hidden" name="MAX_FILE_SIZE" value="30000" /-->
76
  <input type="hidden" name="current_theme_root" value="<?php echo $data['current_theme_root']; ?>" id="current_theme_root" />
77
  <input type="text" name="directory" id="file_directory" style="width:190px" placeholder="<?php _e('Optional: Sub-Directory', 'wpeditor'); ?>" />
78
  <!-- Name of input element determines name in $_FILES array -->
79
+ <input name="file" type="file" id="upload_file" style="width:180px" />
80
  <div class="ajax-button-loader">
81
  <?php submit_button(__('Upload File', 'wpeditor'), 'primary', 'submit', false); ?>
82
  <div class="ajax-loader"></div>
97
  </div>
98
  </div>
99
 
100
+ <form name="template" id="template_form" action="" method="post" class="ajax-editor-update" style="float:left width:auto;overflow:hidden;">
101
  <?php wp_nonce_field('edit-theme_' . $data['real_file']); ?>
102
  <div>
103
  <textarea cols="70" rows="25" name="new-content" id="new-content" tabindex="1"><?php echo $data['content'] ?></textarea>
113
  ?>
114
  <input type="hidden" name="extension" id="extension" value="<?php echo $pathinfo['extension']; ?>" />
115
  </div>
116
+ <?php if(is_writable($data['real_file'])): ?>
117
  <p class="submit">
118
  <?php
119
  if(isset($_GET['phperror'])) {
125
  }
126
  ?>
127
  </p>
128
+ <div class="error writable-error" style="display:none;">
129
+ <p>
130
+ <em><?php _e('You need to make this file writable before you can save your changes. See <a href="http://codex.wordpress.org/Changing_File_Permissions" target="_blank">the Codex</a> for more information.'); ?></em>
131
+ </p>
132
+ </div>
133
  <?php else: ?>
134
+ <p class="submit" style="display:none;">
135
+ <?php
136
+ if(isset($_GET['phperror'])) {
137
+ echo '<input type="hidden" name="phperror" value="1" />'; ?>
138
+ <input type="submit" name="submit" class="button-primary" value="<?php _e('Update File and Attempt to Reactivate', 'wpeditor'); ?>" />
139
+ <?php } else { ?>
140
+ <input type="submit" name='submit' class="button-primary" value="<?php _e('Update File', 'wpeditor'); ?>" />
141
+ <?php
142
+ }
143
+ ?>
144
  </p>
145
+ <div class="error writable-error">
146
+ <p>
147
+ <em><?php _e('You need to make this file writable before you can save your changes. See <a href="http://codex.wordpress.org/Changing_File_Permissions" target="_blank">the Codex</a> for more information.'); ?></em>
148
+ </p>
149
+ </div>
150
  <?php endif; ?>
151
  </form>
152
  <script type="text/javascript">
193
  });
194
  return false;
195
  });
 
 
 
 
 
 
 
 
196
  })
197
  })(jQuery);
198
  function runCodeMirror(extension) {
257
  if(activeLine) {
258
  var hlLine = editor.setLineClass(0, activeLine);
259
  }
260
+ <?php if(WPEditorSetting::getValue('enable_theme_editor_height')) { ?>
261
+ $jq = jQuery.noConflict();
262
+ $jq('.CodeMirror-scroll, .CodeMirror').height('<?php echo WPEditorSetting::getValue("enable_theme_editor_height"); ?>px');
263
+ var scrollDivHeight = $jq('.CodeMirror-scroll div:first-child').height();
264
+ var editorDivHeight = $jq('.CodeMirror').height();
265
+ if(scrollDivHeight > editorDivHeight) {
266
+ $jq('.CodeMirror-gutter').height(scrollDivHeight);
267
+ }
268
+ <?php } ?>
269
+ if(!$jq('.CodeMirror .quicktags-toolbar').length) {
270
+ $jq('.CodeMirror').prepend('<div class="quicktags-toolbar">' +
271
+ '<a href="#" class="button-primary editor-button" id="theme_save">save</a>&nbsp;' +
272
+ '<a href="#" class="button-secondary editor-button" id="theme_undo">undo</a>&nbsp;' +
273
+ '<a href="#" class="button-secondary editor-button" id="theme_redo">redo</a>&nbsp;' +
274
+ '<a href="#" class="button-secondary editor-button" id="theme_search">search</a>&nbsp;' +
275
+ '<a href="#" class="button-secondary editor-button" id="theme_find_prev">find prev</a>&nbsp;' +
276
+ '<a href="#" class="button-secondary editor-button" id="theme_find_next">find next</a>&nbsp;' +
277
+ '<a href="#" class="button-secondary editor-button" id="theme_replace">replace</a>&nbsp;' +
278
+ '<a href="#" class="button-secondary editor-button" id="theme_replace_all">replace all</a>&nbsp;' +
279
+ '<a href="#" class="button-secondary editor-button" id="theme_fullscreen">fullscreen</a>&nbsp;' +
280
+ '</div>'
281
+ );
282
+ $jq('.CodeMirror-scroll').height($jq('.CodeMirror-scroll').height() - 33);
283
+ editor.focus();
284
+ }
285
+ $jq('#theme_fullscreen').live("click", function() {
286
+ toggleFullscreenEditing();
287
+ editor.focus();
288
+ })
289
+ $jq('#theme_save').live("click", function() {
290
+ $jq('.ajax-editor-update').submit();
291
+ editor.focus();
292
+ })
293
+ $jq('#theme_undo').live("click", function() {
294
+ editor.undo();
295
+ editor.focus();
296
+ })
297
+ $jq('#theme_redo').live("click", function() {
298
+ editor.redo();
299
+ editor.focus();
300
+ })
301
+ $jq('#theme_search').live("click", function() {
302
+ CodeMirror.commands.find(editor);
303
+ return false;
304
+ })
305
+ $jq('#theme_find_next').live("click", function() {
306
+ CodeMirror.commands.findNext(editor);
307
+ return false;
308
+ })
309
+ $jq('#theme_find_prev').live("click", function() {
310
+ CodeMirror.commands.findPrev(editor);
311
+ return false;
312
+ })
313
+ $jq('#theme_replace').live("click", function() {
314
+ CodeMirror.commands.replace(editor);
315
+ return false;
316
+ })
317
+ $jq('#theme_replace_all').live("click", function() {
318
+ CodeMirror.commands.replaceAll(editor);
319
+ return false;
320
+ })
321
  }
322
  </script>
323
  </div>
wpeditor.css CHANGED
@@ -233,7 +233,7 @@ span.tiny {
233
  }
234
  .CodeMirror {
235
  height:450px;
236
- width:97%;
237
  }
238
  .wp-editor-container .CodeMirror {
239
  width:100% !important;
@@ -264,7 +264,7 @@ span.tiny {
264
  margin:0 5px 0 0;
265
  padding:0;
266
  }
267
- .current_file {
268
  font-weight:bold;
269
  }
270
  .normal_list {
@@ -324,4 +324,27 @@ a.donate, a.support {
324
  background-image: -o-linear-gradient(bottom,#E3E3E3,white);
325
  background-image: -webkit-linear-gradient(bottom,#E3E3E3,white);
326
  background-image: linear-gradient(bottom,#E3E3E3,white);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
327
  }
233
  }
234
  .CodeMirror {
235
  height:450px;
236
+ width:100%;
237
  }
238
  .wp-editor-container .CodeMirror {
239
  width:100% !important;
264
  margin:0 5px 0 0;
265
  padding:0;
266
  }
267
+ .current_file, .writable_status, .not-writable {
268
  font-weight:bold;
269
  }
270
  .normal_list {
324
  background-image: -o-linear-gradient(bottom,#E3E3E3,white);
325
  background-image: -webkit-linear-gradient(bottom,#E3E3E3,white);
326
  background-image: linear-gradient(bottom,#E3E3E3,white);
327
+ }
328
+ #plugin-editor-files .plugin-folders ul a.not-writable, #theme-editor-files .theme-folders ul a.not-writable, span.not-writable {
329
+ color: red;
330
+ }
331
+ .quicktags-toolbar {
332
+ border-bottom-style: solid;
333
+ border-bottom-width: 1px;
334
+ -webkit-border-top-right-radius: 3px;
335
+ -webkit-border-top-left-radius: 3px;
336
+ border-top-right-radius: 3px;
337
+ border-top-left-radius: 3px;
338
+ padding: 5px 8px 0;
339
+ min-height: 29px;
340
+ border-bottom: 1px solid #D1D1D1;
341
+ background: #EEE;
342
+ background-image: -webkit-gradient(linear,left bottom,left top,from(#E5E5E5),to(#F4F4F4));
343
+ background-image: -webkit-linear-gradient(bottom,#E5E5E5,#F4F4F4);
344
+ background-image: -moz-linear-gradient(bottom,#E5E5E5,#F4F4F4);
345
+ background-image: -o-linear-gradient(bottom,#E5E5E5,#F4F4F4);
346
+ background-image: linear-gradient(to top,#E5E5E5,#F4F4F4);
347
+ }
348
+ .editor-button {
349
+ font-family:Arial, Helvetica, 'sans-serif normal';
350
  }
wpeditor.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: WP Editor
4
  Plugin URI: http://wpeditor.net
5
  Description: This plugin modifies the default behavior of the WordPress plugin and theme editors.
6
- Version: 1.1.0.3
7
  Author: Benjamin Rojas
8
  Author URI: http://benjaminrojas.net
9
  Text Domain: wpeditor
@@ -30,9 +30,6 @@ if(!class_exists('WPEditor')) {
30
 
31
  ob_start();
32
 
33
- // Define the WP Editor version number
34
- define('WPEDITOR_VERSION_NUMBER', '1.1.0.3');
35
-
36
  $wp_34 = false;
37
  if(version_compare(get_bloginfo('version'), '3.4', '>=')) {
38
  $wp_34 = true;
@@ -43,6 +40,9 @@ if(!class_exists('WPEditor')) {
43
  define('WPEDITOR_PATH', plugin_dir_path( __FILE__ ));
44
  define('WPEDITOR_URL', plugins_url() . '/' . basename(dirname(__FILE__)));
45
 
 
 
 
46
  // IS_ADMIN is true when the dashboard or the administration panels are displayed
47
  if(!defined('IS_ADMIN')) {
48
  define('IS_ADMIN', is_admin());
@@ -83,4 +83,11 @@ function wpEditorSettingsLink($links, $file) {
83
  array_unshift($links, $settings);
84
  }
85
  return $links;
 
 
 
 
 
 
 
86
  }
3
  Plugin Name: WP Editor
4
  Plugin URI: http://wpeditor.net
5
  Description: This plugin modifies the default behavior of the WordPress plugin and theme editors.
6
+ Version: 1.2
7
  Author: Benjamin Rojas
8
  Author URI: http://benjaminrojas.net
9
  Text Domain: wpeditor
30
 
31
  ob_start();
32
 
 
 
 
33
  $wp_34 = false;
34
  if(version_compare(get_bloginfo('version'), '3.4', '>=')) {
35
  $wp_34 = true;
40
  define('WPEDITOR_PATH', plugin_dir_path( __FILE__ ));
41
  define('WPEDITOR_URL', plugins_url() . '/' . basename(dirname(__FILE__)));
42
 
43
+ // Define the WP Editor version number
44
+ define('WPEDITOR_VERSION_NUMBER', wpEditorVersionNumber());
45
+
46
  // IS_ADMIN is true when the dashboard or the administration panels are displayed
47
  if(!defined('IS_ADMIN')) {
48
  define('IS_ADMIN', is_admin());
83
  array_unshift($links, $settings);
84
  }
85
  return $links;
86
+ }
87
+ function wpEditorVersionNumber() {
88
+ if(!function_exists('get_plugin_data')) {
89
+ require_once(ABSPATH . 'wp-admin/includes/plugin.php');
90
+ }
91
+ $plugin_data = get_plugin_data(WPEDITOR_PATH . '/wpeditor.php');
92
+ return $plugin_data['Version'];
93
  }