Version Description
- 10/03/2016
- Fix: solved a conflict with the
shortcoder
plugin.
Download this release
Release Info
Developer | diana_burduja |
Plugin | Simple Custom CSS and JS |
Version | 1.5 |
Comparing to | |
See all releases |
Code changes from version 2.10 to 1.5
- assets/ccj_admin-url_rules.js +0 -294
- assets/ccj_admin.css +0 -379
- assets/ccj_admin.js +0 -60
- assets/codemirror/addon/dialog.css +0 -32
- assets/codemirror/addon/dialog.js +0 -157
- assets/codemirror/addon/jump-to-line.js +0 -49
- assets/codemirror/addon/matchesonscrollbar.css +0 -8
- assets/codemirror/addon/scroll/simplescrollbars.css +0 -66
- assets/codemirror/addon/scroll/simplescrollbars.js +0 -152
- assets/codemirror/addon/search.js +0 -249
- assets/codemirror/addon/searchcursor.js +0 -189
- assets/codemirror/mode/xml/xml.js +0 -394
- assets/images/button-close-hover.png +0 -0
- assets/images/button-close.png +0 -0
- custom-css-js.php +88 -36
- includes/admin-addons.php +0 -186
- includes/admin-notices.php +0 -221
- includes/admin-screens.php +220 -643
- includes/admin-warnings.php +0 -100
- readme.txt +5 -69
- screenshot-1.jpg +0 -0
- screenshot-2.jpg +0 -0
- screenshot-3.jpg +0 -0
- screenshot-4.jpg +0 -0
assets/ccj_admin-url_rules.js
DELETED
@@ -1,294 +0,0 @@
|
|
1 |
-
|
2 |
-
if (!String.prototype.trim) {(function() {
|
3 |
-
var r = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
|
4 |
-
String.prototype.trim = function() {
|
5 |
-
return this.replace(r, '');
|
6 |
-
};
|
7 |
-
})();};
|
8 |
-
|
9 |
-
if (!String.prototype.esc_html) {(function() {
|
10 |
-
var r = /[&<>"'\/]/g;
|
11 |
-
var entity_map = {'&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/'};
|
12 |
-
String.prototype.esc_html = function() {
|
13 |
-
return this.replace(r, function from_entity_map(s) {
|
14 |
-
return entity_map[s];
|
15 |
-
});
|
16 |
-
};
|
17 |
-
})();};
|
18 |
-
|
19 |
-
if (!String.prototype.capitalize) {
|
20 |
-
String.prototype.capitalize = function() {
|
21 |
-
return this.charAt(0).toUpperCase() + this.slice(1);
|
22 |
-
}
|
23 |
-
};
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
;jQuery(document).ready(function($) {
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
var elist_index = {};
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
function elist_arrange(names) {
|
36 |
-
|
37 |
-
var rq = /\%quot\%/g;
|
38 |
-
var n, name, field, editable, f;
|
39 |
-
var filters = {
|
40 |
-
'contains' : 'Contains',
|
41 |
-
'not-contains' : 'Not contains',
|
42 |
-
'equal-to' : 'Is equal to',
|
43 |
-
'not-equal-to' : 'Not equal to',
|
44 |
-
'begins-with' : 'Starts with',
|
45 |
-
'ends-by' : 'Ends by',
|
46 |
-
'all' : 'All Website',
|
47 |
-
'first-page' : 'First page'
|
48 |
-
};
|
49 |
-
|
50 |
-
for (n in names) {
|
51 |
-
|
52 |
-
name = names[n];
|
53 |
-
field = $('#wplnst-scan-' + name).val();
|
54 |
-
field = ('' === field)? [] : JSON.parse(field);
|
55 |
-
if (!(field instanceof Array) || 0 == field.length)
|
56 |
-
continue;
|
57 |
-
|
58 |
-
elist_index[name] = field.length;
|
59 |
-
editable = ('true' == $('#wplnst-elist-' + name).attr('data-editable'));
|
60 |
-
|
61 |
-
if ('anchor-filters' == name) {
|
62 |
-
for (f in field)
|
63 |
-
elist_add_row(name, elist_get_row(name, {'value' : field[f]['value'].esc_html().replace(rq, '"'), 'type' : filters[ field[f]['type']].esc_html().replace('-', ' ')}, editable), field[f]['index']);
|
64 |
-
|
65 |
-
}
|
66 |
-
}
|
67 |
-
}
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
function elist_add(name, value, inputs, row) {
|
72 |
-
|
73 |
-
var field = $('#wplnst-scan-' + name).val();
|
74 |
-
field = ('' === field)? [] : JSON.parse(field);
|
75 |
-
if (!(field instanceof Array) || field.length > 25)
|
76 |
-
return;
|
77 |
-
|
78 |
-
(name in elist_index)? elist_index[name]++ : elist_index[name] = 0;
|
79 |
-
value['index'] = elist_index[name] + 1;
|
80 |
-
field.push(value);
|
81 |
-
|
82 |
-
$('#wplnst-scan-' + name).val(JSON.stringify(field));
|
83 |
-
|
84 |
-
for (var i = 0; i < inputs.length; i++)
|
85 |
-
$('#' + inputs[i]).val('');
|
86 |
-
|
87 |
-
elist_add_row(name, row, value['index']);
|
88 |
-
}
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
function elist_add_row(name, row, index) {
|
93 |
-
row = row.replace(/\%class\-index\%/g, 'wplnst-' + name + '-' + index);
|
94 |
-
row = row.replace('%close%', '<a href="#" class="wplnst-elist-close-link" data-name = "' + name + '" data-index="' + index + '"> </a>');
|
95 |
-
$('#' + 'wplnst-elist-' + name).append(row);
|
96 |
-
$('#' + 'wplnst-elist-' + name).show();
|
97 |
-
}
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
function elist_get_row(name, args, editable) {
|
102 |
-
|
103 |
-
if ('anchor-filters' == name)
|
104 |
-
return '<tr class="%class-index%"><td class="wplnst-elist-type wplnst-afs-type">' + $('#wplnst-elist-anchor-filters').attr('data-label') + ' <strong>' + args['type'] + '</strong></td><td class="wplnst-elist-val wplnst-afs-val">' + args['value'] + '</td><td class="wplnst-elist-close wplnst-afs-close">' + (editable? '%close%' : '') + '</td></tr><tr class="%class-index%"><td colspan="3" class="wplnst-elist-split"></td></tr>';
|
105 |
-
|
106 |
-
return false;
|
107 |
-
}
|
108 |
-
|
109 |
-
|
110 |
-
$('.wplnst-elist').on('click', '.wplnst-elist-close-link', function() {
|
111 |
-
|
112 |
-
var name = $(this).attr('data-name');
|
113 |
-
var index = $(this).attr('data-index');
|
114 |
-
|
115 |
-
var field = $('#wplnst-scan-' + name).val();
|
116 |
-
if ('' !== field) {
|
117 |
-
|
118 |
-
field = JSON.parse(field);
|
119 |
-
if (field instanceof Array) {
|
120 |
-
|
121 |
-
var field_new = [];
|
122 |
-
for (var i = 0; i < field.length; i++) {
|
123 |
-
if (index != field[i]['index'])
|
124 |
-
field_new.push(field[i]);
|
125 |
-
}
|
126 |
-
|
127 |
-
$('#wplnst-scan-' + name).val(JSON.stringify(field_new));
|
128 |
-
$('.wplnst-' + name + '-' + index).remove();
|
129 |
-
|
130 |
-
if (0 === field_new.length)
|
131 |
-
$('#' + 'wplnst-elist-' + name).hide();
|
132 |
-
}
|
133 |
-
}
|
134 |
-
|
135 |
-
return false;
|
136 |
-
});
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
$('.wplnst-status-level').click(function() {
|
141 |
-
var level = $(this).attr('id').replace('ck-status-level-', '');
|
142 |
-
$('.wplnst-code-level-' + level).prop('checked', false);
|
143 |
-
});
|
144 |
-
|
145 |
-
$('.wplnst-code-level').click(function() {
|
146 |
-
var level = $(this).attr('id').replace('ck-status-code-', '').charAt(0);
|
147 |
-
$('#ck-status-level-' + level).prop('checked', false);
|
148 |
-
});
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
$('#wplnst-save-and-run').click(function() {
|
153 |
-
$('#wplnst-scan-run').val('1');
|
154 |
-
$('#wplnst-form').submit();
|
155 |
-
});
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
$('#wplnst-cf-new-add').click(function() {
|
160 |
-
var name = $('#wplnst-cf-new').val().trim();
|
161 |
-
if ('' === name)
|
162 |
-
return;
|
163 |
-
elist_add('custom-fields', {'name' : name, 'type': $('#wplnst-cf-new-type').val()}, ['wplnst-cf-new'], elist_get_row('custom-fields', {'name' : name.esc_html(), 'type' : $('#wplnst-cf-new-type option:selected').text().esc_html()}, true));
|
164 |
-
});
|
165 |
-
|
166 |
-
$('#wplnst-cf-new').bind('keypress', function(e) {
|
167 |
-
if (e.keyCode == 13) {
|
168 |
-
$('#wplnst-cf-new-add').click();
|
169 |
-
return false;
|
170 |
-
}
|
171 |
-
});
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
$('#wplnst-af-new-add').click(function() {
|
176 |
-
var value = $('#wplnst-af-new').val().trim();
|
177 |
-
var type = $('#wplnst-af-new-type').val();
|
178 |
-
|
179 |
-
if ( type === 'empty' || type === 'all' || type === 'first-page' ) {
|
180 |
-
value = '';
|
181 |
-
} else if ( value === '' ) {
|
182 |
-
return;
|
183 |
-
}
|
184 |
-
elist_add('anchor-filters', {'value' : value, 'type': type}, ['wplnst-af-new'], elist_get_row('anchor-filters', {'type' : $('#wplnst-af-new-type option:selected').text().esc_html(), 'value' : value.esc_html() }, true));
|
185 |
-
});
|
186 |
-
|
187 |
-
$('#wplnst-af-new').bind('keypress', function(e) {
|
188 |
-
if (e.keyCode == 13) {
|
189 |
-
$('#wplnst-af-new-add').click();
|
190 |
-
return false;
|
191 |
-
}
|
192 |
-
});
|
193 |
-
|
194 |
-
$('#wplnst-af-new-type').change(function() {
|
195 |
-
var disabled = ('empty' == $(this).val());
|
196 |
-
$('#wplnst-af-new').attr('disabled', disabled);
|
197 |
-
});
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
$('#wplnst-ius-new-add').click(function() {
|
202 |
-
var value = $('#wplnst-ius-new').val().trim();
|
203 |
-
if ('' === value)
|
204 |
-
return;
|
205 |
-
elist_add('include-urls', {'value' : value, 'type': $('#wplnst-ius-new-type').val()}, ['wplnst-ius-new'], elist_get_row('include-urls', {'value' : value.esc_html(), 'type' : $('#wplnst-ius-new-type option:selected').text().esc_html()}, true));
|
206 |
-
});
|
207 |
-
|
208 |
-
$('#wplnst-ius-new').bind('keypress', function(e) {
|
209 |
-
if (e.keyCode == 13) {
|
210 |
-
$('#wplnst-ius-new-add').click();
|
211 |
-
return false;
|
212 |
-
}
|
213 |
-
});
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
$('#wplnst-eus-new-add').click(function() {
|
218 |
-
var value = $('#wplnst-eus-new').val().trim();
|
219 |
-
if ('' === value)
|
220 |
-
return;
|
221 |
-
elist_add('exclude-urls', {'value' : value, 'type': $('#wplnst-eus-new-type').val()}, ['wplnst-eus-new'], elist_get_row('exclude-urls', {'value' : value.esc_html(), 'type' : $('#wplnst-eus-new-type option:selected').text().esc_html()}, true));
|
222 |
-
});
|
223 |
-
|
224 |
-
$('#wplnst-eus-new').bind('keypress', function(e) {
|
225 |
-
if (e.keyCode == 13) {
|
226 |
-
$('#wplnst-eus-new-add').click();
|
227 |
-
return false;
|
228 |
-
}
|
229 |
-
});
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
$('#wplnst-hes-new-add').click(function() {
|
234 |
-
|
235 |
-
var att = $('#wplnst-hes-new-att').val().trim();
|
236 |
-
if ('' === att)
|
237 |
-
return;
|
238 |
-
|
239 |
-
var element = $('#wplnst-hes-new').val();
|
240 |
-
var having = $('#wplnst-hes-new-have').val();
|
241 |
-
|
242 |
-
var op = op_text = value = '';
|
243 |
-
if ('have' == having) {
|
244 |
-
|
245 |
-
var op = $('#wplnst-hes-new-op').val();
|
246 |
-
var op_text = $('#wplnst-hes-new-op option:selected').text().toLowerCase();
|
247 |
-
var value = '' + $('#wplnst-hes-new-val').val().trim();
|
248 |
-
|
249 |
-
if ('not-empty' == op || 'empty' == op) {
|
250 |
-
value = '';
|
251 |
-
} else if ('' === value) {
|
252 |
-
return;
|
253 |
-
}
|
254 |
-
}
|
255 |
-
|
256 |
-
elist_add(
|
257 |
-
'html-attributes',
|
258 |
-
{'att' : att, 'element' : element, 'having' : having, 'op' : op, 'value' : value},
|
259 |
-
['wplnst-hes-new-att', 'wplnst-hes-new-val'],
|
260 |
-
elist_get_row('html-attributes', {'element' : element.esc_html(), 'having' : $('#wplnst-hes-new-have option:selected').text().toLowerCase().esc_html(), 'att' : att.esc_html(), 'op' : op_text.esc_html(), 'value' : value.esc_html()}, true)
|
261 |
-
);
|
262 |
-
});
|
263 |
-
|
264 |
-
$('#wplnst-hes-new-att').bind('keypress', function(e) {
|
265 |
-
if (e.keyCode == 13) {
|
266 |
-
$('#wplnst-hes-new-add').click();
|
267 |
-
return false;
|
268 |
-
}
|
269 |
-
});
|
270 |
-
|
271 |
-
$('#wplnst-hes-new-val').bind('keypress', function(e) {
|
272 |
-
if (e.keyCode == 13) {
|
273 |
-
$('#wplnst-hes-new-add').click();
|
274 |
-
return false;
|
275 |
-
}
|
276 |
-
});
|
277 |
-
|
278 |
-
$('#wplnst-hes-new-have').change(function() {
|
279 |
-
var disabled = ('have' != $(this).val());
|
280 |
-
$('#wplnst-hes-new-op').attr('disabled', disabled);
|
281 |
-
$('#wplnst-hes-new-val').attr('disabled', disabled);
|
282 |
-
});
|
283 |
-
|
284 |
-
$('#wplnst-hes-new-op').change(function() {
|
285 |
-
$('#wplnst-hes-new-val').attr('disabled', ('empty' == $(this).val() || 'not-empty' == $(this).val()));
|
286 |
-
});
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
elist_arrange(['anchor-filters']);
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/ccj_admin.css
DELETED
@@ -1,379 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Add Custom Code buttons
|
3 |
-
*/
|
4 |
-
.updated.buttons {
|
5 |
-
border: none;
|
6 |
-
background-color: transparent;
|
7 |
-
box-shadow: none;
|
8 |
-
padding: 0;
|
9 |
-
margin: 15px 0 15px !important;
|
10 |
-
}
|
11 |
-
.custom-btn {
|
12 |
-
background: #0c73b8;
|
13 |
-
border-radius: 2px;
|
14 |
-
color: #ffffff;
|
15 |
-
font-size: 17px;
|
16 |
-
padding: 10px 20px 10px 20px !important;
|
17 |
-
text-decoration: none;
|
18 |
-
}
|
19 |
-
.custom-btn:hover {
|
20 |
-
color: #fff;
|
21 |
-
background: #2eaadd;
|
22 |
-
text-decoration: none;
|
23 |
-
}
|
24 |
-
.custom-js-btn { background: #e4a228; }
|
25 |
-
.custom-js-btn:hover { background: #eebf31; }
|
26 |
-
.custom-php-btn { background: #e45126; }
|
27 |
-
.custom-php-btn:hover { background: #f6652c; }
|
28 |
-
|
29 |
-
.update.notice a { display: none; }
|
30 |
-
|
31 |
-
|
32 |
-
/**
|
33 |
-
* Change the `edit` screen
|
34 |
-
*/
|
35 |
-
.inline.hide-if-no-js{ display: none; }
|
36 |
-
.view-switch { display: none; }
|
37 |
-
#modified { width: 140px; }
|
38 |
-
#type.manage-column { width: 50px; }
|
39 |
-
.language {
|
40 |
-
background: #0c73b8;
|
41 |
-
border-radius: 2px;
|
42 |
-
color: #ffffff;
|
43 |
-
font-size: 12px;
|
44 |
-
padding: 5px 10px !important;
|
45 |
-
text-decoration: none;
|
46 |
-
}
|
47 |
-
.language-js { background: #e4a228; }
|
48 |
-
.language-php { background: #e45126; }
|
49 |
-
.language-html { background: #e45126; }
|
50 |
-
.widefat td, .widefat th, .type.column-type, .check-column, .column-active { vertical-align: middle !important; }
|
51 |
-
.type.column-type {
|
52 |
-
text-align: center;
|
53 |
-
}
|
54 |
-
.column-options span { margin-left: 7px; }
|
55 |
-
.column-active .dashicons { font-size: 17px; }
|
56 |
-
.column-active a, .column-active a:active, .column-active a:hover, .column-active a:focus { display: block; outline: 0; border: 0; text-decoration: none; }
|
57 |
-
#active.manage-column { width: 30px; }
|
58 |
-
|
59 |
-
|
60 |
-
/**
|
61 |
-
* Code Mirror editor
|
62 |
-
*/
|
63 |
-
#content {
|
64 |
-
width: 100%;
|
65 |
-
padding-left: 36px;
|
66 |
-
border-top: 0;
|
67 |
-
border-bottom: 0;
|
68 |
-
}
|
69 |
-
|
70 |
-
#minor-publishing { display: none; }
|
71 |
-
#post-body #normal-sortables { min-height: 0px; }
|
72 |
-
.CodeMirror {
|
73 |
-
margin-top: 0px;
|
74 |
-
border: 1px solid #ddd;
|
75 |
-
border-bottom: none;
|
76 |
-
border-top: none;
|
77 |
-
}
|
78 |
-
.CodeMirror pre { padding-left: 7px; line-height: 1.25; }
|
79 |
-
|
80 |
-
.code-mirror-buttons {
|
81 |
-
margin-top: 15px;
|
82 |
-
width: calc(100% - 2px);
|
83 |
-
background: #f7f7f7;
|
84 |
-
border: 1px solid #ddd;
|
85 |
-
border-bottom: none;
|
86 |
-
height: 36px;
|
87 |
-
}
|
88 |
-
.code-mirror-buttons .button-right {
|
89 |
-
display: block;
|
90 |
-
float: right;
|
91 |
-
}
|
92 |
-
.code-mirror-buttons button {
|
93 |
-
padding: 2px 3px;
|
94 |
-
line-height: normal;
|
95 |
-
font-size: 14px;
|
96 |
-
cursor: pointer;
|
97 |
-
color: #333;
|
98 |
-
text-align: center;
|
99 |
-
overflow: visible;
|
100 |
-
margin: 6px 4px;
|
101 |
-
border: none;
|
102 |
-
background-color: transparent;
|
103 |
-
border: 1px solid transparent;
|
104 |
-
}
|
105 |
-
.code-mirror-buttons button:hover, .code-mirror-buttons button:focus {
|
106 |
-
color: #333;
|
107 |
-
background-color: #e3e3e3;
|
108 |
-
border: 1px solid #ccc;
|
109 |
-
border-radius: 1px;
|
110 |
-
}
|
111 |
-
.code-mirror-buttons button i {
|
112 |
-
font: 400 20px/1 dashicons;
|
113 |
-
vertical-align: middle;
|
114 |
-
speak: none;
|
115 |
-
color: #777;
|
116 |
-
line-height: 20px;
|
117 |
-
width: 20px;
|
118 |
-
height: 20px;
|
119 |
-
}
|
120 |
-
i.ccj-i-fullscreen:before {
|
121 |
-
content: "\f211";
|
122 |
-
}
|
123 |
-
|
124 |
-
.code-mirror-before {
|
125 |
-
border: 1px solid #ddd;
|
126 |
-
border-bottom: none;
|
127 |
-
background-color: #f7f7f7;
|
128 |
-
margin-top: 24px;
|
129 |
-
}
|
130 |
-
.code-mirror-before div {
|
131 |
-
color: #8F8F8F;
|
132 |
-
margin-left: 29px;
|
133 |
-
border-left: 1px solid #ddd;
|
134 |
-
padding: 3px 8px;
|
135 |
-
background-color: #fff;
|
136 |
-
}
|
137 |
-
|
138 |
-
.code-mirror-after {
|
139 |
-
border: 1px solid #ddd;
|
140 |
-
border-top: none;
|
141 |
-
background-color: #f7f7f7;
|
142 |
-
}
|
143 |
-
.code-mirror-after div {
|
144 |
-
color: #8F8F8F;
|
145 |
-
margin-left: 29px;
|
146 |
-
border-left: 1px solid #ddd;
|
147 |
-
padding: 3px 8px;
|
148 |
-
background-color: #fff;
|
149 |
-
}
|
150 |
-
/*
|
151 |
-
.cm-s-default .cm-atom { color: #549d18; }
|
152 |
-
.cm-s-default .cm-property { color: #b62625; }
|
153 |
-
.cm-s-default .cm-qualifier, .cm-s-default .cm-tag { color: #4731E4; }
|
154 |
-
*/
|
155 |
-
|
156 |
-
|
157 |
-
/**
|
158 |
-
* Options meta box
|
159 |
-
*/
|
160 |
-
.radio-group input { margin-top: 1px; }
|
161 |
-
.radio-group label { padding: 2px 0; }
|
162 |
-
.options_meta_box h3 { margin-top: 10px !important; }
|
163 |
-
.radio-group { line-height: 30px; padding-left: 10px; }
|
164 |
-
.radio-group .dashicons-before:before { margin: 7px 3px 0 3px; }
|
165 |
-
.options_meta_box select { margin-left: 10px; }
|
166 |
-
#custom-code-options .options_meta_box select {
|
167 |
-
margin-left: 0px;
|
168 |
-
width: 100%;
|
169 |
-
}
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
/**
|
174 |
-
* Revisions
|
175 |
-
*/
|
176 |
-
table.revisions {
|
177 |
-
width: 100%;
|
178 |
-
max-width: 100%;
|
179 |
-
background-color: transparent;
|
180 |
-
border-spacing: 0;
|
181 |
-
border-collapse: collapse;
|
182 |
-
border-color: gray;
|
183 |
-
}
|
184 |
-
table.revisions thead, table.revisions tbody {
|
185 |
-
vertical-align: middle;
|
186 |
-
}
|
187 |
-
table.revisions tbody tr:hover {
|
188 |
-
background-color: #f7f7f9;
|
189 |
-
}
|
190 |
-
table.revisions thead th {
|
191 |
-
white-space: nowrap;
|
192 |
-
text-align: left;
|
193 |
-
padding: 8px;
|
194 |
-
line-height: 1.42857143;
|
195 |
-
vertical-align: bottom;
|
196 |
-
border-bottom: 2px solid #ddd;
|
197 |
-
}
|
198 |
-
table.revisions tbody td {
|
199 |
-
padding: 8px;
|
200 |
-
line-height: 1.42857143;
|
201 |
-
vertical-align: top;
|
202 |
-
border-top: 1px solid #ddd;
|
203 |
-
}
|
204 |
-
tr.current-revision {
|
205 |
-
background-color: #00ff00;
|
206 |
-
}
|
207 |
-
td.revisions-compare, td.revisions-restore, td.revisions-delete {
|
208 |
-
width: 36px;
|
209 |
-
}
|
210 |
-
td.revisions-compare, th.revisions-compare {
|
211 |
-
text-align: center !important;
|
212 |
-
}
|
213 |
-
table.revisions a {
|
214 |
-
text-decoration: none;
|
215 |
-
}
|
216 |
-
table.revisions a:hover {
|
217 |
-
text-decoration: underline;
|
218 |
-
}
|
219 |
-
table.revisions .hidden {
|
220 |
-
visibility: hidden;
|
221 |
-
}
|
222 |
-
div#TB_window {
|
223 |
-
width: 90% !important;
|
224 |
-
margin-left: -45% !important;
|
225 |
-
height: 90% !important;
|
226 |
-
margin-top: -22% !important;
|
227 |
-
}
|
228 |
-
div#TB_window .error {
|
229 |
-
padding: 15px;
|
230 |
-
margin-bottom: 20px;
|
231 |
-
border: 1px solid transparent;
|
232 |
-
border-radius: 4px;
|
233 |
-
color: #a94442;
|
234 |
-
background-color: #f2dede;
|
235 |
-
border-color: #ebccd1;
|
236 |
-
}
|
237 |
-
iframe#TB_iframeContent {
|
238 |
-
width: 100% !important;
|
239 |
-
height: 100% !important;
|
240 |
-
}
|
241 |
-
#url-rules textarea {
|
242 |
-
width: 100%;
|
243 |
-
height: 200px;
|
244 |
-
}
|
245 |
-
|
246 |
-
|
247 |
-
/* URL Rules */
|
248 |
-
.wplnst-elist-visible { display: block; }
|
249 |
-
.wplnst-elist-readonly { margin: 0; }
|
250 |
-
|
251 |
-
.wplnst-elist tr {
|
252 |
-
margin-bottom: 10px;
|
253 |
-
}
|
254 |
-
|
255 |
-
.wplnst-elist tr td {
|
256 |
-
margin: 0; padding: 4px 5px;
|
257 |
-
}
|
258 |
-
|
259 |
-
.wplnst-elist tr td.wplnst-elist-val {
|
260 |
-
color: #5c5a5a;
|
261 |
-
background: rgba(0,115,170,0.6);
|
262 |
-
}
|
263 |
-
|
264 |
-
#wplnst-af-new { width: 361px; }
|
265 |
-
#wplnst-ius-new { width: 425px; }
|
266 |
-
#wplnst-eus-new { width: 425px; }
|
267 |
-
|
268 |
-
.wplnst-elist tr td.wplnst-cfs-val { width: 205px; }
|
269 |
-
.wplnst-elist tr td.wplnst-afs-val { width: 350px; }
|
270 |
-
.wplnst-elist tr td.wplnst-ius-val { width: 415px; }
|
271 |
-
.wplnst-elist tr td.wplnst-eus-val { width: 415px; }
|
272 |
-
|
273 |
-
.wplnst-elist tr td.wplnst-elist-type {
|
274 |
-
color: #6f6f6f;
|
275 |
-
}
|
276 |
-
|
277 |
-
.wplnst-elist tr td.wplnst-cfs-type { width: 53px; padding-left: 12px; }
|
278 |
-
.wplnst-elist tr td.wplnst-afs-type { width: 200px; padding-left: 0; }
|
279 |
-
.wplnst-elist tr td.wplnst-ius-type { width: 121px; padding-left: 14px; }
|
280 |
-
.wplnst-elist tr td.wplnst-eus-type { width: 121px; padding-left: 14px; }
|
281 |
-
|
282 |
-
.wplnst-elist tr td.wplnst-hes-ele { width: 55px; font-weight: bold; }
|
283 |
-
.wplnst-elist tr td.wplnst-hes-have { width: 87px; font-weight: bold; }
|
284 |
-
.wplnst-elist tr td.wplnst-hes-att { width: 125px; }
|
285 |
-
.wplnst-elist tr td.wplnst-hes-op { width: 112px; padding-left: 15px; font-weight: bold; }
|
286 |
-
.wplnst-elist tr td.wplnst-hes-val { width: 126px; }
|
287 |
-
|
288 |
-
.wplnst-elist tr td.wplnst-elist-close {
|
289 |
-
padding-left: 21px;
|
290 |
-
}
|
291 |
-
|
292 |
-
.wplnst-elist tr td.wplnst-elist-close .wplnst-elist-close-link {
|
293 |
-
display: block;
|
294 |
-
width: 16px; height: 16px;
|
295 |
-
outline: none; border: 0;
|
296 |
-
text-indent: -9999px;
|
297 |
-
background: url(images/button-close.png) left top no-repeat;
|
298 |
-
}
|
299 |
-
|
300 |
-
.wplnst-elist tr td.wplnst-elist-close .wplnst-elist-close-link:hover {
|
301 |
-
background: url(images/button-close-hover.png) left top no-repeat;
|
302 |
-
}
|
303 |
-
|
304 |
-
.wplnst-elist tr td.wplnst-elist-split {
|
305 |
-
height: 3px;
|
306 |
-
}
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
#ccj-preview_url {
|
311 |
-
width: 78%;
|
312 |
-
}
|
313 |
-
#ccj-preview {
|
314 |
-
width: 20%;
|
315 |
-
text-align: center;
|
316 |
-
}
|
317 |
-
|
318 |
-
/**
|
319 |
-
* Settings page
|
320 |
-
*/
|
321 |
-
#ccj_duration_preview, #ccj_editor_theme {
|
322 |
-
width: 220px;
|
323 |
-
}
|
324 |
-
.custom-css-js_page_custom-css-js-config .CodeMirror {
|
325 |
-
height: 200px;
|
326 |
-
}
|
327 |
-
.role-permissions, .role-permissions2 {
|
328 |
-
width: 100%;
|
329 |
-
}
|
330 |
-
.role-permissions td, .role-permissions th, .role-permissions2 td {
|
331 |
-
padding: 6px;
|
332 |
-
text-align: center;
|
333 |
-
}
|
334 |
-
.role-permissions td.desc, .role-permissions2 td.desc {
|
335 |
-
width: 35%;
|
336 |
-
text-align: right;
|
337 |
-
padding-right: 20px;
|
338 |
-
}
|
339 |
-
.role-permissions2 td {
|
340 |
-
text-align: left;
|
341 |
-
}
|
342 |
-
.custom-css-js_page_custom-css-js-config .dashicons-editor-help {
|
343 |
-
color: #999;
|
344 |
-
}
|
345 |
-
|
346 |
-
/**
|
347 |
-
* Overlay
|
348 |
-
*/
|
349 |
-
#normal-sortables, .ccj_opaque {
|
350 |
-
opacity: 0.4;
|
351 |
-
}
|
352 |
-
.ccj_only_premium {
|
353 |
-
z-index:9999;
|
354 |
-
width: 160px;
|
355 |
-
height: 60px;
|
356 |
-
position: absolute;
|
357 |
-
margin-left: 254px;
|
358 |
-
color: white;
|
359 |
-
}
|
360 |
-
.ccj_only_premium>div {
|
361 |
-
font-family:sans-serif;font-size:13px;text-align: center; border-radius: 5px; float: left; background-color: rgb(51, 51, 51); color: white; width: 207px; padding: 20px 20px;
|
362 |
-
}
|
363 |
-
.ccj_only_premium a {
|
364 |
-
color: white; text-decoration: none;
|
365 |
-
transition: color 0.3s;
|
366 |
-
}
|
367 |
-
.ccj_only_premium a:hover {
|
368 |
-
color: #0073aa; text-decoration: none;
|
369 |
-
}
|
370 |
-
.ccj_only_premium-right {
|
371 |
-
width: 80px;
|
372 |
-
margin-left: 130px;
|
373 |
-
margin-top: -120px;
|
374 |
-
}
|
375 |
-
.ccj_only_premium-right>div {
|
376 |
-
width: 200px;
|
377 |
-
padding: 10px;
|
378 |
-
margin-left: -110px;
|
379 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/ccj_admin.js
DELETED
@@ -1,60 +0,0 @@
|
|
1 |
-
jQuery(document).ready( function($) {
|
2 |
-
|
3 |
-
$('.page-title-action').hide();
|
4 |
-
|
5 |
-
// Initialize the CodeMirror editor
|
6 |
-
if ( $('#content').length > 0 ) {
|
7 |
-
var content_mode = $("#content").attr('mode');
|
8 |
-
if ( content_mode == 'html' ) {
|
9 |
-
var content_mode = {
|
10 |
-
name: "htmlmixed",
|
11 |
-
scriptTypes: [{matches: /\/x-handlebars-template|\/x-mustache/i,
|
12 |
-
mode: null}]
|
13 |
-
};
|
14 |
-
}
|
15 |
-
var options = {
|
16 |
-
lineNumbers: true,
|
17 |
-
mode: content_mode,
|
18 |
-
matchBrackets: true
|
19 |
-
};
|
20 |
-
if ( typeof CCJ !== 'undefined' && CCJ.scroll !== '0' ) {
|
21 |
-
options['scrollbarStyle'] = "simple";
|
22 |
-
}
|
23 |
-
|
24 |
-
|
25 |
-
var cm_width = $('#title').width() + 16;
|
26 |
-
var cm_height = 500;
|
27 |
-
|
28 |
-
var editor = CodeMirror.fromTextArea(document.getElementById("content"), options);
|
29 |
-
|
30 |
-
editor.setSize(cm_width, cm_height);
|
31 |
-
|
32 |
-
$('.CodeMirror').resizable({
|
33 |
-
resize: function() {
|
34 |
-
editor.setSize($(this).width(), $(this).height());
|
35 |
-
} ,
|
36 |
-
maxWidth: cm_width,
|
37 |
-
minWidth: cm_width,
|
38 |
-
minHeight: 200
|
39 |
-
|
40 |
-
});
|
41 |
-
|
42 |
-
$(window).resize(function () {
|
43 |
-
var cm_width = $('#title').width() + 16;
|
44 |
-
var cm_height = $('.CodeMirror').height();
|
45 |
-
editor.setSize(cm_width, cm_height);
|
46 |
-
});
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
}
|
51 |
-
|
52 |
-
// Make the inactive rows opaque
|
53 |
-
if ( $('.dashicons-star-empty.ccj_row').length > 0 ) {
|
54 |
-
$('.dashicons-star-empty.ccj_row').each(function(){
|
55 |
-
$(this).parent().parent().parent().css('opacity', '0.4');
|
56 |
-
});
|
57 |
-
}
|
58 |
-
|
59 |
-
});
|
60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/codemirror/addon/dialog.css
DELETED
@@ -1,32 +0,0 @@
|
|
1 |
-
.CodeMirror-dialog {
|
2 |
-
position: absolute;
|
3 |
-
left: 0; right: 0;
|
4 |
-
background: inherit;
|
5 |
-
z-index: 15;
|
6 |
-
padding: .1em .8em;
|
7 |
-
overflow: hidden;
|
8 |
-
color: inherit;
|
9 |
-
}
|
10 |
-
|
11 |
-
.CodeMirror-dialog-top {
|
12 |
-
border-bottom: 1px solid #eee;
|
13 |
-
top: 0;
|
14 |
-
}
|
15 |
-
|
16 |
-
.CodeMirror-dialog-bottom {
|
17 |
-
border-top: 1px solid #eee;
|
18 |
-
bottom: 0;
|
19 |
-
}
|
20 |
-
|
21 |
-
.CodeMirror-dialog input {
|
22 |
-
border: none;
|
23 |
-
outline: none;
|
24 |
-
background: transparent;
|
25 |
-
width: 20em;
|
26 |
-
color: inherit;
|
27 |
-
font-family: monospace;
|
28 |
-
}
|
29 |
-
|
30 |
-
.CodeMirror-dialog button {
|
31 |
-
font-size: 70%;
|
32 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/codemirror/addon/dialog.js
DELETED
@@ -1,157 +0,0 @@
|
|
1 |
-
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
2 |
-
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
3 |
-
|
4 |
-
// Open simple dialogs on top of an editor. Relies on dialog.css.
|
5 |
-
|
6 |
-
(function(mod) {
|
7 |
-
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
8 |
-
mod(require("../../lib/codemirror"));
|
9 |
-
else if (typeof define == "function" && define.amd) // AMD
|
10 |
-
define(["../../lib/codemirror"], mod);
|
11 |
-
else // Plain browser env
|
12 |
-
mod(CodeMirror);
|
13 |
-
})(function(CodeMirror) {
|
14 |
-
function dialogDiv(cm, template, bottom) {
|
15 |
-
var wrap = cm.getWrapperElement();
|
16 |
-
var dialog;
|
17 |
-
dialog = wrap.appendChild(document.createElement("div"));
|
18 |
-
if (bottom)
|
19 |
-
dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom";
|
20 |
-
else
|
21 |
-
dialog.className = "CodeMirror-dialog CodeMirror-dialog-top";
|
22 |
-
|
23 |
-
if (typeof template == "string") {
|
24 |
-
dialog.innerHTML = template;
|
25 |
-
} else { // Assuming it's a detached DOM element.
|
26 |
-
dialog.appendChild(template);
|
27 |
-
}
|
28 |
-
return dialog;
|
29 |
-
}
|
30 |
-
|
31 |
-
function closeNotification(cm, newVal) {
|
32 |
-
if (cm.state.currentNotificationClose)
|
33 |
-
cm.state.currentNotificationClose();
|
34 |
-
cm.state.currentNotificationClose = newVal;
|
35 |
-
}
|
36 |
-
|
37 |
-
CodeMirror.defineExtension("openDialog", function(template, callback, options) {
|
38 |
-
if (!options) options = {};
|
39 |
-
|
40 |
-
closeNotification(this, null);
|
41 |
-
|
42 |
-
var dialog = dialogDiv(this, template, options.bottom);
|
43 |
-
var closed = false, me = this;
|
44 |
-
function close(newVal) {
|
45 |
-
if (typeof newVal == 'string') {
|
46 |
-
inp.value = newVal;
|
47 |
-
} else {
|
48 |
-
if (closed) return;
|
49 |
-
closed = true;
|
50 |
-
dialog.parentNode.removeChild(dialog);
|
51 |
-
me.focus();
|
52 |
-
|
53 |
-
if (options.onClose) options.onClose(dialog);
|
54 |
-
}
|
55 |
-
}
|
56 |
-
|
57 |
-
var inp = dialog.getElementsByTagName("input")[0], button;
|
58 |
-
if (inp) {
|
59 |
-
inp.focus();
|
60 |
-
|
61 |
-
if (options.value) {
|
62 |
-
inp.value = options.value;
|
63 |
-
if (options.selectValueOnOpen !== false) {
|
64 |
-
inp.select();
|
65 |
-
}
|
66 |
-
}
|
67 |
-
|
68 |
-
if (options.onInput)
|
69 |
-
CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);});
|
70 |
-
if (options.onKeyUp)
|
71 |
-
CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);});
|
72 |
-
|
73 |
-
CodeMirror.on(inp, "keydown", function(e) {
|
74 |
-
if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }
|
75 |
-
if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {
|
76 |
-
inp.blur();
|
77 |
-
CodeMirror.e_stop(e);
|
78 |
-
close();
|
79 |
-
}
|
80 |
-
if (e.keyCode == 13) callback(inp.value, e);
|
81 |
-
});
|
82 |
-
|
83 |
-
if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close);
|
84 |
-
} else if (button = dialog.getElementsByTagName("button")[0]) {
|
85 |
-
CodeMirror.on(button, "click", function() {
|
86 |
-
close();
|
87 |
-
me.focus();
|
88 |
-
});
|
89 |
-
|
90 |
-
if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close);
|
91 |
-
|
92 |
-
button.focus();
|
93 |
-
}
|
94 |
-
return close;
|
95 |
-
});
|
96 |
-
|
97 |
-
CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) {
|
98 |
-
closeNotification(this, null);
|
99 |
-
var dialog = dialogDiv(this, template, options && options.bottom);
|
100 |
-
var buttons = dialog.getElementsByTagName("button");
|
101 |
-
var closed = false, me = this, blurring = 1;
|
102 |
-
function close() {
|
103 |
-
if (closed) return;
|
104 |
-
closed = true;
|
105 |
-
dialog.parentNode.removeChild(dialog);
|
106 |
-
me.focus();
|
107 |
-
}
|
108 |
-
buttons[0].focus();
|
109 |
-
for (var i = 0; i < buttons.length; ++i) {
|
110 |
-
var b = buttons[i];
|
111 |
-
(function(callback) {
|
112 |
-
CodeMirror.on(b, "click", function(e) {
|
113 |
-
CodeMirror.e_preventDefault(e);
|
114 |
-
close();
|
115 |
-
if (callback) callback(me);
|
116 |
-
});
|
117 |
-
})(callbacks[i]);
|
118 |
-
CodeMirror.on(b, "blur", function() {
|
119 |
-
--blurring;
|
120 |
-
setTimeout(function() { if (blurring <= 0) close(); }, 200);
|
121 |
-
});
|
122 |
-
CodeMirror.on(b, "focus", function() { ++blurring; });
|
123 |
-
}
|
124 |
-
});
|
125 |
-
|
126 |
-
/*
|
127 |
-
* openNotification
|
128 |
-
* Opens a notification, that can be closed with an optional timer
|
129 |
-
* (default 5000ms timer) and always closes on click.
|
130 |
-
*
|
131 |
-
* If a notification is opened while another is opened, it will close the
|
132 |
-
* currently opened one and open the new one immediately.
|
133 |
-
*/
|
134 |
-
CodeMirror.defineExtension("openNotification", function(template, options) {
|
135 |
-
closeNotification(this, close);
|
136 |
-
var dialog = dialogDiv(this, template, options && options.bottom);
|
137 |
-
var closed = false, doneTimer;
|
138 |
-
var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000;
|
139 |
-
|
140 |
-
function close() {
|
141 |
-
if (closed) return;
|
142 |
-
closed = true;
|
143 |
-
clearTimeout(doneTimer);
|
144 |
-
dialog.parentNode.removeChild(dialog);
|
145 |
-
}
|
146 |
-
|
147 |
-
CodeMirror.on(dialog, 'click', function(e) {
|
148 |
-
CodeMirror.e_preventDefault(e);
|
149 |
-
close();
|
150 |
-
});
|
151 |
-
|
152 |
-
if (duration)
|
153 |
-
doneTimer = setTimeout(close, duration);
|
154 |
-
|
155 |
-
return close;
|
156 |
-
});
|
157 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/codemirror/addon/jump-to-line.js
DELETED
@@ -1,49 +0,0 @@
|
|
1 |
-
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
2 |
-
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
3 |
-
|
4 |
-
// Defines jumpToLine command. Uses dialog.js if present.
|
5 |
-
|
6 |
-
(function(mod) {
|
7 |
-
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
8 |
-
mod(require("../../lib/codemirror"), require("../dialog/dialog"));
|
9 |
-
else if (typeof define == "function" && define.amd) // AMD
|
10 |
-
define(["../../lib/codemirror", "../dialog/dialog"], mod);
|
11 |
-
else // Plain browser env
|
12 |
-
mod(CodeMirror);
|
13 |
-
})(function(CodeMirror) {
|
14 |
-
"use strict";
|
15 |
-
|
16 |
-
function dialog(cm, text, shortText, deflt, f) {
|
17 |
-
if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true});
|
18 |
-
else f(prompt(shortText, deflt));
|
19 |
-
}
|
20 |
-
|
21 |
-
var jumpDialog =
|
22 |
-
'Jump to line: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use line:column or scroll% syntax)</span>';
|
23 |
-
|
24 |
-
function interpretLine(cm, string) {
|
25 |
-
var num = Number(string)
|
26 |
-
if (/^[-+]/.test(string)) return cm.getCursor().line + num
|
27 |
-
else return num - 1
|
28 |
-
}
|
29 |
-
|
30 |
-
CodeMirror.commands.jumpToLine = function(cm) {
|
31 |
-
var cur = cm.getCursor();
|
32 |
-
dialog(cm, jumpDialog, "Jump to line:", (cur.line + 1) + ":" + cur.ch, function(posStr) {
|
33 |
-
if (!posStr) return;
|
34 |
-
|
35 |
-
var match;
|
36 |
-
if (match = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(posStr)) {
|
37 |
-
cm.setCursor(interpretLine(cm, match[1]), Number(match[2]))
|
38 |
-
} else if (match = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(posStr)) {
|
39 |
-
var line = Math.round(cm.lineCount() * Number(match[1]) / 100);
|
40 |
-
if (/^[-+]/.test(match[1])) line = cur.line + line + 1;
|
41 |
-
cm.setCursor(line - 1, cur.ch);
|
42 |
-
} else if (match = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(posStr)) {
|
43 |
-
cm.setCursor(interpretLine(cm, match[1]), cur.ch);
|
44 |
-
}
|
45 |
-
});
|
46 |
-
};
|
47 |
-
|
48 |
-
CodeMirror.keyMap["default"]["Alt-G"] = "jumpToLine";
|
49 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/codemirror/addon/matchesonscrollbar.css
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
.CodeMirror-search-match {
|
2 |
-
background: gold;
|
3 |
-
border-top: 1px solid orange;
|
4 |
-
border-bottom: 1px solid orange;
|
5 |
-
-moz-box-sizing: border-box;
|
6 |
-
box-sizing: border-box;
|
7 |
-
opacity: .5;
|
8 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/codemirror/addon/scroll/simplescrollbars.css
DELETED
@@ -1,66 +0,0 @@
|
|
1 |
-
.CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div {
|
2 |
-
position: absolute;
|
3 |
-
background: #ccc;
|
4 |
-
-moz-box-sizing: border-box;
|
5 |
-
box-sizing: border-box;
|
6 |
-
border: 1px solid #bbb;
|
7 |
-
border-radius: 2px;
|
8 |
-
}
|
9 |
-
|
10 |
-
.CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical {
|
11 |
-
position: absolute;
|
12 |
-
z-index: 6;
|
13 |
-
background: #eee;
|
14 |
-
}
|
15 |
-
|
16 |
-
.CodeMirror-simplescroll-horizontal {
|
17 |
-
bottom: 0; left: 0;
|
18 |
-
height: 8px;
|
19 |
-
}
|
20 |
-
.CodeMirror-simplescroll-horizontal div {
|
21 |
-
bottom: 0;
|
22 |
-
height: 100%;
|
23 |
-
}
|
24 |
-
|
25 |
-
.CodeMirror-simplescroll-vertical {
|
26 |
-
right: 0; top: 0;
|
27 |
-
width: 8px;
|
28 |
-
}
|
29 |
-
.CodeMirror-simplescroll-vertical div {
|
30 |
-
right: 0;
|
31 |
-
width: 100%;
|
32 |
-
}
|
33 |
-
|
34 |
-
|
35 |
-
.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler {
|
36 |
-
display: none;
|
37 |
-
}
|
38 |
-
|
39 |
-
.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div {
|
40 |
-
position: absolute;
|
41 |
-
background: #bcd;
|
42 |
-
border-radius: 3px;
|
43 |
-
}
|
44 |
-
|
45 |
-
.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical {
|
46 |
-
position: absolute;
|
47 |
-
z-index: 6;
|
48 |
-
}
|
49 |
-
|
50 |
-
.CodeMirror-overlayscroll-horizontal {
|
51 |
-
bottom: 0; left: 0;
|
52 |
-
height: 6px;
|
53 |
-
}
|
54 |
-
.CodeMirror-overlayscroll-horizontal div {
|
55 |
-
bottom: 0;
|
56 |
-
height: 100%;
|
57 |
-
}
|
58 |
-
|
59 |
-
.CodeMirror-overlayscroll-vertical {
|
60 |
-
right: 0; top: 0;
|
61 |
-
width: 6px;
|
62 |
-
}
|
63 |
-
.CodeMirror-overlayscroll-vertical div {
|
64 |
-
right: 0;
|
65 |
-
width: 100%;
|
66 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/codemirror/addon/scroll/simplescrollbars.js
DELETED
@@ -1,152 +0,0 @@
|
|
1 |
-
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
2 |
-
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
3 |
-
|
4 |
-
(function(mod) {
|
5 |
-
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
6 |
-
mod(require("../../lib/codemirror"));
|
7 |
-
else if (typeof define == "function" && define.amd) // AMD
|
8 |
-
define(["../../lib/codemirror"], mod);
|
9 |
-
else // Plain browser env
|
10 |
-
mod(CodeMirror);
|
11 |
-
})(function(CodeMirror) {
|
12 |
-
"use strict";
|
13 |
-
|
14 |
-
function Bar(cls, orientation, scroll) {
|
15 |
-
this.orientation = orientation;
|
16 |
-
this.scroll = scroll;
|
17 |
-
this.screen = this.total = this.size = 1;
|
18 |
-
this.pos = 0;
|
19 |
-
|
20 |
-
this.node = document.createElement("div");
|
21 |
-
this.node.className = cls + "-" + orientation;
|
22 |
-
this.inner = this.node.appendChild(document.createElement("div"));
|
23 |
-
|
24 |
-
var self = this;
|
25 |
-
CodeMirror.on(this.inner, "mousedown", function(e) {
|
26 |
-
if (e.which != 1) return;
|
27 |
-
CodeMirror.e_preventDefault(e);
|
28 |
-
var axis = self.orientation == "horizontal" ? "pageX" : "pageY";
|
29 |
-
var start = e[axis], startpos = self.pos;
|
30 |
-
function done() {
|
31 |
-
CodeMirror.off(document, "mousemove", move);
|
32 |
-
CodeMirror.off(document, "mouseup", done);
|
33 |
-
}
|
34 |
-
function move(e) {
|
35 |
-
if (e.which != 1) return done();
|
36 |
-
self.moveTo(startpos + (e[axis] - start) * (self.total / self.size));
|
37 |
-
}
|
38 |
-
CodeMirror.on(document, "mousemove", move);
|
39 |
-
CodeMirror.on(document, "mouseup", done);
|
40 |
-
});
|
41 |
-
|
42 |
-
CodeMirror.on(this.node, "click", function(e) {
|
43 |
-
CodeMirror.e_preventDefault(e);
|
44 |
-
var innerBox = self.inner.getBoundingClientRect(), where;
|
45 |
-
if (self.orientation == "horizontal")
|
46 |
-
where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0;
|
47 |
-
else
|
48 |
-
where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0;
|
49 |
-
self.moveTo(self.pos + where * self.screen);
|
50 |
-
});
|
51 |
-
|
52 |
-
function onWheel(e) {
|
53 |
-
var moved = CodeMirror.wheelEventPixels(e)[self.orientation == "horizontal" ? "x" : "y"];
|
54 |
-
var oldPos = self.pos;
|
55 |
-
self.moveTo(self.pos + moved);
|
56 |
-
if (self.pos != oldPos) CodeMirror.e_preventDefault(e);
|
57 |
-
}
|
58 |
-
CodeMirror.on(this.node, "mousewheel", onWheel);
|
59 |
-
CodeMirror.on(this.node, "DOMMouseScroll", onWheel);
|
60 |
-
}
|
61 |
-
|
62 |
-
Bar.prototype.setPos = function(pos, force) {
|
63 |
-
if (pos < 0) pos = 0;
|
64 |
-
if (pos > this.total - this.screen) pos = this.total - this.screen;
|
65 |
-
if (!force && pos == this.pos) return false;
|
66 |
-
this.pos = pos;
|
67 |
-
this.inner.style[this.orientation == "horizontal" ? "left" : "top"] =
|
68 |
-
(pos * (this.size / this.total)) + "px";
|
69 |
-
return true
|
70 |
-
};
|
71 |
-
|
72 |
-
Bar.prototype.moveTo = function(pos) {
|
73 |
-
if (this.setPos(pos)) this.scroll(pos, this.orientation);
|
74 |
-
}
|
75 |
-
|
76 |
-
var minButtonSize = 10;
|
77 |
-
|
78 |
-
Bar.prototype.update = function(scrollSize, clientSize, barSize) {
|
79 |
-
var sizeChanged = this.screen != clientSize || this.total != scrollSize || this.size != barSize
|
80 |
-
if (sizeChanged) {
|
81 |
-
this.screen = clientSize;
|
82 |
-
this.total = scrollSize;
|
83 |
-
this.size = barSize;
|
84 |
-
}
|
85 |
-
|
86 |
-
var buttonSize = this.screen * (this.size / this.total);
|
87 |
-
if (buttonSize < minButtonSize) {
|
88 |
-
this.size -= minButtonSize - buttonSize;
|
89 |
-
buttonSize = minButtonSize;
|
90 |
-
}
|
91 |
-
this.inner.style[this.orientation == "horizontal" ? "width" : "height"] =
|
92 |
-
buttonSize + "px";
|
93 |
-
this.setPos(this.pos, sizeChanged);
|
94 |
-
};
|
95 |
-
|
96 |
-
function SimpleScrollbars(cls, place, scroll) {
|
97 |
-
this.addClass = cls;
|
98 |
-
this.horiz = new Bar(cls, "horizontal", scroll);
|
99 |
-
place(this.horiz.node);
|
100 |
-
this.vert = new Bar(cls, "vertical", scroll);
|
101 |
-
place(this.vert.node);
|
102 |
-
this.width = null;
|
103 |
-
}
|
104 |
-
|
105 |
-
SimpleScrollbars.prototype.update = function(measure) {
|
106 |
-
if (this.width == null) {
|
107 |
-
var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle;
|
108 |
-
if (style) this.width = parseInt(style.height);
|
109 |
-
}
|
110 |
-
var width = this.width || 0;
|
111 |
-
|
112 |
-
var needsH = measure.scrollWidth > measure.clientWidth + 1;
|
113 |
-
var needsV = measure.scrollHeight > measure.clientHeight + 1;
|
114 |
-
this.vert.node.style.display = needsV ? "block" : "none";
|
115 |
-
this.horiz.node.style.display = needsH ? "block" : "none";
|
116 |
-
|
117 |
-
if (needsV) {
|
118 |
-
this.vert.update(measure.scrollHeight, measure.clientHeight,
|
119 |
-
measure.viewHeight - (needsH ? width : 0));
|
120 |
-
this.vert.node.style.bottom = needsH ? width + "px" : "0";
|
121 |
-
}
|
122 |
-
if (needsH) {
|
123 |
-
this.horiz.update(measure.scrollWidth, measure.clientWidth,
|
124 |
-
measure.viewWidth - (needsV ? width : 0) - measure.barLeft);
|
125 |
-
this.horiz.node.style.right = needsV ? width + "px" : "0";
|
126 |
-
this.horiz.node.style.left = measure.barLeft + "px";
|
127 |
-
}
|
128 |
-
|
129 |
-
return {right: needsV ? width : 0, bottom: needsH ? width : 0};
|
130 |
-
};
|
131 |
-
|
132 |
-
SimpleScrollbars.prototype.setScrollTop = function(pos) {
|
133 |
-
this.vert.setPos(pos);
|
134 |
-
};
|
135 |
-
|
136 |
-
SimpleScrollbars.prototype.setScrollLeft = function(pos) {
|
137 |
-
this.horiz.setPos(pos);
|
138 |
-
};
|
139 |
-
|
140 |
-
SimpleScrollbars.prototype.clear = function() {
|
141 |
-
var parent = this.horiz.node.parentNode;
|
142 |
-
parent.removeChild(this.horiz.node);
|
143 |
-
parent.removeChild(this.vert.node);
|
144 |
-
};
|
145 |
-
|
146 |
-
CodeMirror.scrollbarModel.simple = function(place, scroll) {
|
147 |
-
return new SimpleScrollbars("CodeMirror-simplescroll", place, scroll);
|
148 |
-
};
|
149 |
-
CodeMirror.scrollbarModel.overlay = function(place, scroll) {
|
150 |
-
return new SimpleScrollbars("CodeMirror-overlayscroll", place, scroll);
|
151 |
-
};
|
152 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/codemirror/addon/search.js
DELETED
@@ -1,249 +0,0 @@
|
|
1 |
-
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
2 |
-
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
3 |
-
|
4 |
-
// Define search commands. Depends on dialog.js or another
|
5 |
-
// implementation of the openDialog method.
|
6 |
-
|
7 |
-
// Replace works a little oddly -- it will do the replace on the next
|
8 |
-
// Ctrl-G (or whatever is bound to findNext) press. You prevent a
|
9 |
-
// replace by making sure the match is no longer selected when hitting
|
10 |
-
// Ctrl-G.
|
11 |
-
|
12 |
-
(function(mod) {
|
13 |
-
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
14 |
-
mod(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog"));
|
15 |
-
else if (typeof define == "function" && define.amd) // AMD
|
16 |
-
define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], mod);
|
17 |
-
else // Plain browser env
|
18 |
-
mod(CodeMirror);
|
19 |
-
})(function(CodeMirror) {
|
20 |
-
"use strict";
|
21 |
-
|
22 |
-
function searchOverlay(query, caseInsensitive) {
|
23 |
-
if (typeof query == "string")
|
24 |
-
query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g");
|
25 |
-
else if (!query.global)
|
26 |
-
query = new RegExp(query.source, query.ignoreCase ? "gi" : "g");
|
27 |
-
|
28 |
-
return {token: function(stream) {
|
29 |
-
query.lastIndex = stream.pos;
|
30 |
-
var match = query.exec(stream.string);
|
31 |
-
if (match && match.index == stream.pos) {
|
32 |
-
stream.pos += match[0].length || 1;
|
33 |
-
return "searching";
|
34 |
-
} else if (match) {
|
35 |
-
stream.pos = match.index;
|
36 |
-
} else {
|
37 |
-
stream.skipToEnd();
|
38 |
-
}
|
39 |
-
}};
|
40 |
-
}
|
41 |
-
|
42 |
-
function SearchState() {
|
43 |
-
this.posFrom = this.posTo = this.lastQuery = this.query = null;
|
44 |
-
this.overlay = null;
|
45 |
-
}
|
46 |
-
|
47 |
-
function getSearchState(cm) {
|
48 |
-
return cm.state.search || (cm.state.search = new SearchState());
|
49 |
-
}
|
50 |
-
|
51 |
-
function queryCaseInsensitive(query) {
|
52 |
-
return typeof query == "string" && query == query.toLowerCase();
|
53 |
-
}
|
54 |
-
|
55 |
-
function getSearchCursor(cm, query, pos) {
|
56 |
-
// Heuristic: if the query string is all lowercase, do a case insensitive search.
|
57 |
-
return cm.getSearchCursor(query, pos, queryCaseInsensitive(query));
|
58 |
-
}
|
59 |
-
|
60 |
-
function persistentDialog(cm, text, deflt, onEnter, onKeyDown) {
|
61 |
-
cm.openDialog(text, onEnter, {
|
62 |
-
value: deflt,
|
63 |
-
selectValueOnOpen: true,
|
64 |
-
closeOnEnter: false,
|
65 |
-
onClose: function() { clearSearch(cm); },
|
66 |
-
onKeyDown: onKeyDown
|
67 |
-
});
|
68 |
-
}
|
69 |
-
|
70 |
-
function dialog(cm, text, shortText, deflt, f) {
|
71 |
-
if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true});
|
72 |
-
else f(prompt(shortText, deflt));
|
73 |
-
}
|
74 |
-
|
75 |
-
function confirmDialog(cm, text, shortText, fs) {
|
76 |
-
if (cm.openConfirm) cm.openConfirm(text, fs);
|
77 |
-
else if (confirm(shortText)) fs[0]();
|
78 |
-
}
|
79 |
-
|
80 |
-
function parseString(string) {
|
81 |
-
return string.replace(/\\(.)/g, function(_, ch) {
|
82 |
-
if (ch == "n") return "\n"
|
83 |
-
if (ch == "r") return "\r"
|
84 |
-
return ch
|
85 |
-
})
|
86 |
-
}
|
87 |
-
|
88 |
-
function parseQuery(query) {
|
89 |
-
var isRE = query.match(/^\/(.*)\/([a-z]*)$/);
|
90 |
-
if (isRE) {
|
91 |
-
try { query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); }
|
92 |
-
catch(e) {} // Not a regular expression after all, do a string search
|
93 |
-
} else {
|
94 |
-
query = parseString(query)
|
95 |
-
}
|
96 |
-
if (typeof query == "string" ? query == "" : query.test(""))
|
97 |
-
query = /x^/;
|
98 |
-
return query;
|
99 |
-
}
|
100 |
-
|
101 |
-
var queryDialog =
|
102 |
-
'Search: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>';
|
103 |
-
|
104 |
-
function startSearch(cm, state, query) {
|
105 |
-
state.queryText = query;
|
106 |
-
state.query = parseQuery(query);
|
107 |
-
cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query));
|
108 |
-
state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query));
|
109 |
-
cm.addOverlay(state.overlay);
|
110 |
-
if (cm.showMatchesOnScrollbar) {
|
111 |
-
if (state.annotate) { state.annotate.clear(); state.annotate = null; }
|
112 |
-
state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query));
|
113 |
-
}
|
114 |
-
}
|
115 |
-
|
116 |
-
function doSearch(cm, rev, persistent, immediate) {
|
117 |
-
var state = getSearchState(cm);
|
118 |
-
if (state.query) return findNext(cm, rev);
|
119 |
-
var q = cm.getSelection() || state.lastQuery;
|
120 |
-
if (persistent && cm.openDialog) {
|
121 |
-
var hiding = null
|
122 |
-
var searchNext = function(query, event) {
|
123 |
-
CodeMirror.e_stop(event);
|
124 |
-
if (!query) return;
|
125 |
-
if (query != state.queryText) {
|
126 |
-
startSearch(cm, state, query);
|
127 |
-
state.posFrom = state.posTo = cm.getCursor();
|
128 |
-
}
|
129 |
-
if (hiding) hiding.style.opacity = 1
|
130 |
-
findNext(cm, event.shiftKey, function(_, to) {
|
131 |
-
var dialog
|
132 |
-
if (to.line < 3 && document.querySelector &&
|
133 |
-
(dialog = cm.display.wrapper.querySelector(".CodeMirror-dialog")) &&
|
134 |
-
dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, "window").top)
|
135 |
-
(hiding = dialog).style.opacity = .4
|
136 |
-
})
|
137 |
-
};
|
138 |
-
persistentDialog(cm, queryDialog, q, searchNext, function(event, query) {
|
139 |
-
var cmd = CodeMirror.keyMap[cm.getOption("keyMap")][CodeMirror.keyName(event)];
|
140 |
-
if (cmd == "findNext" || cmd == "findPrev") {
|
141 |
-
CodeMirror.e_stop(event);
|
142 |
-
startSearch(cm, getSearchState(cm), query);
|
143 |
-
cm.execCommand(cmd);
|
144 |
-
} else if (cmd == "find" || cmd == "findPersistent") {
|
145 |
-
CodeMirror.e_stop(event);
|
146 |
-
searchNext(query, event);
|
147 |
-
}
|
148 |
-
});
|
149 |
-
if (immediate) {
|
150 |
-
startSearch(cm, state, q);
|
151 |
-
findNext(cm, rev);
|
152 |
-
}
|
153 |
-
} else {
|
154 |
-
dialog(cm, queryDialog, "Search for:", q, function(query) {
|
155 |
-
if (query && !state.query) cm.operation(function() {
|
156 |
-
startSearch(cm, state, query);
|
157 |
-
state.posFrom = state.posTo = cm.getCursor();
|
158 |
-
findNext(cm, rev);
|
159 |
-
});
|
160 |
-
});
|
161 |
-
}
|
162 |
-
}
|
163 |
-
|
164 |
-
function findNext(cm, rev, callback) {cm.operation(function() {
|
165 |
-
var state = getSearchState(cm);
|
166 |
-
var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);
|
167 |
-
if (!cursor.find(rev)) {
|
168 |
-
cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0));
|
169 |
-
if (!cursor.find(rev)) return;
|
170 |
-
}
|
171 |
-
cm.setSelection(cursor.from(), cursor.to());
|
172 |
-
cm.scrollIntoView({from: cursor.from(), to: cursor.to()}, 20);
|
173 |
-
state.posFrom = cursor.from(); state.posTo = cursor.to();
|
174 |
-
if (callback) callback(cursor.from(), cursor.to())
|
175 |
-
});}
|
176 |
-
|
177 |
-
function clearSearch(cm) {cm.operation(function() {
|
178 |
-
var state = getSearchState(cm);
|
179 |
-
state.lastQuery = state.query;
|
180 |
-
if (!state.query) return;
|
181 |
-
state.query = state.queryText = null;
|
182 |
-
cm.removeOverlay(state.overlay);
|
183 |
-
if (state.annotate) { state.annotate.clear(); state.annotate = null; }
|
184 |
-
});}
|
185 |
-
|
186 |
-
var replaceQueryDialog =
|
187 |
-
' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>';
|
188 |
-
var replacementQueryDialog = 'With: <input type="text" style="width: 10em" class="CodeMirror-search-field"/>';
|
189 |
-
var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>All</button> <button>Stop</button>";
|
190 |
-
|
191 |
-
function replaceAll(cm, query, text) {
|
192 |
-
cm.operation(function() {
|
193 |
-
for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
|
194 |
-
if (typeof query != "string") {
|
195 |
-
var match = cm.getRange(cursor.from(), cursor.to()).match(query);
|
196 |
-
cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];}));
|
197 |
-
} else cursor.replace(text);
|
198 |
-
}
|
199 |
-
});
|
200 |
-
}
|
201 |
-
|
202 |
-
function replace(cm, all) {
|
203 |
-
if (cm.getOption("readOnly")) return;
|
204 |
-
var query = cm.getSelection() || getSearchState(cm).lastQuery;
|
205 |
-
var dialogText = all ? "Replace all:" : "Replace:"
|
206 |
-
dialog(cm, dialogText + replaceQueryDialog, dialogText, query, function(query) {
|
207 |
-
if (!query) return;
|
208 |
-
query = parseQuery(query);
|
209 |
-
dialog(cm, replacementQueryDialog, "Replace with:", "", function(text) {
|
210 |
-
text = parseString(text)
|
211 |
-
if (all) {
|
212 |
-
replaceAll(cm, query, text)
|
213 |
-
} else {
|
214 |
-
clearSearch(cm);
|
215 |
-
var cursor = getSearchCursor(cm, query, cm.getCursor("from"));
|
216 |
-
var advance = function() {
|
217 |
-
var start = cursor.from(), match;
|
218 |
-
if (!(match = cursor.findNext())) {
|
219 |
-
cursor = getSearchCursor(cm, query);
|
220 |
-
if (!(match = cursor.findNext()) ||
|
221 |
-
(start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return;
|
222 |
-
}
|
223 |
-
cm.setSelection(cursor.from(), cursor.to());
|
224 |
-
cm.scrollIntoView({from: cursor.from(), to: cursor.to()});
|
225 |
-
confirmDialog(cm, doReplaceConfirm, "Replace?",
|
226 |
-
[function() {doReplace(match);}, advance,
|
227 |
-
function() {replaceAll(cm, query, text)}]);
|
228 |
-
};
|
229 |
-
var doReplace = function(match) {
|
230 |
-
cursor.replace(typeof query == "string" ? text :
|
231 |
-
text.replace(/\$(\d)/g, function(_, i) {return match[i];}));
|
232 |
-
advance();
|
233 |
-
};
|
234 |
-
advance();
|
235 |
-
}
|
236 |
-
});
|
237 |
-
});
|
238 |
-
}
|
239 |
-
|
240 |
-
CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);};
|
241 |
-
CodeMirror.commands.findPersistent = function(cm) {clearSearch(cm); doSearch(cm, false, true);};
|
242 |
-
CodeMirror.commands.findPersistentNext = function(cm) {doSearch(cm, false, true, true);};
|
243 |
-
CodeMirror.commands.findPersistentPrev = function(cm) {doSearch(cm, true, true, true);};
|
244 |
-
CodeMirror.commands.findNext = doSearch;
|
245 |
-
CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);};
|
246 |
-
CodeMirror.commands.clearSearch = clearSearch;
|
247 |
-
CodeMirror.commands.replace = replace;
|
248 |
-
CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);};
|
249 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/codemirror/addon/searchcursor.js
DELETED
@@ -1,189 +0,0 @@
|
|
1 |
-
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
2 |
-
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
3 |
-
|
4 |
-
(function(mod) {
|
5 |
-
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
6 |
-
mod(require("../../lib/codemirror"));
|
7 |
-
else if (typeof define == "function" && define.amd) // AMD
|
8 |
-
define(["../../lib/codemirror"], mod);
|
9 |
-
else // Plain browser env
|
10 |
-
mod(CodeMirror);
|
11 |
-
})(function(CodeMirror) {
|
12 |
-
"use strict";
|
13 |
-
var Pos = CodeMirror.Pos;
|
14 |
-
|
15 |
-
function SearchCursor(doc, query, pos, caseFold) {
|
16 |
-
this.atOccurrence = false; this.doc = doc;
|
17 |
-
if (caseFold == null && typeof query == "string") caseFold = false;
|
18 |
-
|
19 |
-
pos = pos ? doc.clipPos(pos) : Pos(0, 0);
|
20 |
-
this.pos = {from: pos, to: pos};
|
21 |
-
|
22 |
-
// The matches method is filled in based on the type of query.
|
23 |
-
// It takes a position and a direction, and returns an object
|
24 |
-
// describing the next occurrence of the query, or null if no
|
25 |
-
// more matches were found.
|
26 |
-
if (typeof query != "string") { // Regexp match
|
27 |
-
if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g");
|
28 |
-
this.matches = function(reverse, pos) {
|
29 |
-
if (reverse) {
|
30 |
-
query.lastIndex = 0;
|
31 |
-
var line = doc.getLine(pos.line).slice(0, pos.ch), cutOff = 0, match, start;
|
32 |
-
for (;;) {
|
33 |
-
query.lastIndex = cutOff;
|
34 |
-
var newMatch = query.exec(line);
|
35 |
-
if (!newMatch) break;
|
36 |
-
match = newMatch;
|
37 |
-
start = match.index;
|
38 |
-
cutOff = match.index + (match[0].length || 1);
|
39 |
-
if (cutOff == line.length) break;
|
40 |
-
}
|
41 |
-
var matchLen = (match && match[0].length) || 0;
|
42 |
-
if (!matchLen) {
|
43 |
-
if (start == 0 && line.length == 0) {match = undefined;}
|
44 |
-
else if (start != doc.getLine(pos.line).length) {
|
45 |
-
matchLen++;
|
46 |
-
}
|
47 |
-
}
|
48 |
-
} else {
|
49 |
-
query.lastIndex = pos.ch;
|
50 |
-
var line = doc.getLine(pos.line), match = query.exec(line);
|
51 |
-
var matchLen = (match && match[0].length) || 0;
|
52 |
-
var start = match && match.index;
|
53 |
-
if (start + matchLen != line.length && !matchLen) matchLen = 1;
|
54 |
-
}
|
55 |
-
if (match && matchLen)
|
56 |
-
return {from: Pos(pos.line, start),
|
57 |
-
to: Pos(pos.line, start + matchLen),
|
58 |
-
match: match};
|
59 |
-
};
|
60 |
-
} else { // String query
|
61 |
-
var origQuery = query;
|
62 |
-
if (caseFold) query = query.toLowerCase();
|
63 |
-
var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};
|
64 |
-
var target = query.split("\n");
|
65 |
-
// Different methods for single-line and multi-line queries
|
66 |
-
if (target.length == 1) {
|
67 |
-
if (!query.length) {
|
68 |
-
// Empty string would match anything and never progress, so
|
69 |
-
// we define it to match nothing instead.
|
70 |
-
this.matches = function() {};
|
71 |
-
} else {
|
72 |
-
this.matches = function(reverse, pos) {
|
73 |
-
if (reverse) {
|
74 |
-
var orig = doc.getLine(pos.line).slice(0, pos.ch), line = fold(orig);
|
75 |
-
var match = line.lastIndexOf(query);
|
76 |
-
if (match > -1) {
|
77 |
-
match = adjustPos(orig, line, match);
|
78 |
-
return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)};
|
79 |
-
}
|
80 |
-
} else {
|
81 |
-
var orig = doc.getLine(pos.line).slice(pos.ch), line = fold(orig);
|
82 |
-
var match = line.indexOf(query);
|
83 |
-
if (match > -1) {
|
84 |
-
match = adjustPos(orig, line, match) + pos.ch;
|
85 |
-
return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)};
|
86 |
-
}
|
87 |
-
}
|
88 |
-
};
|
89 |
-
}
|
90 |
-
} else {
|
91 |
-
var origTarget = origQuery.split("\n");
|
92 |
-
this.matches = function(reverse, pos) {
|
93 |
-
var last = target.length - 1;
|
94 |
-
if (reverse) {
|
95 |
-
if (pos.line - (target.length - 1) < doc.firstLine()) return;
|
96 |
-
if (fold(doc.getLine(pos.line).slice(0, origTarget[last].length)) != target[target.length - 1]) return;
|
97 |
-
var to = Pos(pos.line, origTarget[last].length);
|
98 |
-
for (var ln = pos.line - 1, i = last - 1; i >= 1; --i, --ln)
|
99 |
-
if (target[i] != fold(doc.getLine(ln))) return;
|
100 |
-
var line = doc.getLine(ln), cut = line.length - origTarget[0].length;
|
101 |
-
if (fold(line.slice(cut)) != target[0]) return;
|
102 |
-
return {from: Pos(ln, cut), to: to};
|
103 |
-
} else {
|
104 |
-
if (pos.line + (target.length - 1) > doc.lastLine()) return;
|
105 |
-
var line = doc.getLine(pos.line), cut = line.length - origTarget[0].length;
|
106 |
-
if (fold(line.slice(cut)) != target[0]) return;
|
107 |
-
var from = Pos(pos.line, cut);
|
108 |
-
for (var ln = pos.line + 1, i = 1; i < last; ++i, ++ln)
|
109 |
-
if (target[i] != fold(doc.getLine(ln))) return;
|
110 |
-
if (fold(doc.getLine(ln).slice(0, origTarget[last].length)) != target[last]) return;
|
111 |
-
return {from: from, to: Pos(ln, origTarget[last].length)};
|
112 |
-
}
|
113 |
-
};
|
114 |
-
}
|
115 |
-
}
|
116 |
-
}
|
117 |
-
|
118 |
-
SearchCursor.prototype = {
|
119 |
-
findNext: function() {return this.find(false);},
|
120 |
-
findPrevious: function() {return this.find(true);},
|
121 |
-
|
122 |
-
find: function(reverse) {
|
123 |
-
var self = this, pos = this.doc.clipPos(reverse ? this.pos.from : this.pos.to);
|
124 |
-
function savePosAndFail(line) {
|
125 |
-
var pos = Pos(line, 0);
|
126 |
-
self.pos = {from: pos, to: pos};
|
127 |
-
self.atOccurrence = false;
|
128 |
-
return false;
|
129 |
-
}
|
130 |
-
|
131 |
-
for (;;) {
|
132 |
-
if (this.pos = this.matches(reverse, pos)) {
|
133 |
-
this.atOccurrence = true;
|
134 |
-
return this.pos.match || true;
|
135 |
-
}
|
136 |
-
if (reverse) {
|
137 |
-
if (!pos.line) return savePosAndFail(0);
|
138 |
-
pos = Pos(pos.line-1, this.doc.getLine(pos.line-1).length);
|
139 |
-
}
|
140 |
-
else {
|
141 |
-
var maxLine = this.doc.lineCount();
|
142 |
-
if (pos.line == maxLine - 1) return savePosAndFail(maxLine);
|
143 |
-
pos = Pos(pos.line + 1, 0);
|
144 |
-
}
|
145 |
-
}
|
146 |
-
},
|
147 |
-
|
148 |
-
from: function() {if (this.atOccurrence) return this.pos.from;},
|
149 |
-
to: function() {if (this.atOccurrence) return this.pos.to;},
|
150 |
-
|
151 |
-
replace: function(newText, origin) {
|
152 |
-
if (!this.atOccurrence) return;
|
153 |
-
var lines = CodeMirror.splitLines(newText);
|
154 |
-
this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin);
|
155 |
-
this.pos.to = Pos(this.pos.from.line + lines.length - 1,
|
156 |
-
lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0));
|
157 |
-
}
|
158 |
-
};
|
159 |
-
|
160 |
-
// Maps a position in a case-folded line back to a position in the original line
|
161 |
-
// (compensating for codepoints increasing in number during folding)
|
162 |
-
function adjustPos(orig, folded, pos) {
|
163 |
-
if (orig.length == folded.length) return pos;
|
164 |
-
for (var pos1 = Math.min(pos, orig.length);;) {
|
165 |
-
var len1 = orig.slice(0, pos1).toLowerCase().length;
|
166 |
-
if (len1 < pos) ++pos1;
|
167 |
-
else if (len1 > pos) --pos1;
|
168 |
-
else return pos1;
|
169 |
-
}
|
170 |
-
}
|
171 |
-
|
172 |
-
CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) {
|
173 |
-
return new SearchCursor(this.doc, query, pos, caseFold);
|
174 |
-
});
|
175 |
-
CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) {
|
176 |
-
return new SearchCursor(this, query, pos, caseFold);
|
177 |
-
});
|
178 |
-
|
179 |
-
CodeMirror.defineExtension("selectMatches", function(query, caseFold) {
|
180 |
-
var ranges = [];
|
181 |
-
var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold);
|
182 |
-
while (cur.findNext()) {
|
183 |
-
if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break;
|
184 |
-
ranges.push({anchor: cur.from(), head: cur.to()});
|
185 |
-
}
|
186 |
-
if (ranges.length)
|
187 |
-
this.setSelections(ranges, 0);
|
188 |
-
});
|
189 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/codemirror/mode/xml/xml.js
DELETED
@@ -1,394 +0,0 @@
|
|
1 |
-
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
2 |
-
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
3 |
-
|
4 |
-
(function(mod) {
|
5 |
-
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
6 |
-
mod(require("../../lib/codemirror"));
|
7 |
-
else if (typeof define == "function" && define.amd) // AMD
|
8 |
-
define(["../../lib/codemirror"], mod);
|
9 |
-
else // Plain browser env
|
10 |
-
mod(CodeMirror);
|
11 |
-
})(function(CodeMirror) {
|
12 |
-
"use strict";
|
13 |
-
|
14 |
-
var htmlConfig = {
|
15 |
-
autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,
|
16 |
-
'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,
|
17 |
-
'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,
|
18 |
-
'track': true, 'wbr': true, 'menuitem': true},
|
19 |
-
implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,
|
20 |
-
'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,
|
21 |
-
'th': true, 'tr': true},
|
22 |
-
contextGrabbers: {
|
23 |
-
'dd': {'dd': true, 'dt': true},
|
24 |
-
'dt': {'dd': true, 'dt': true},
|
25 |
-
'li': {'li': true},
|
26 |
-
'option': {'option': true, 'optgroup': true},
|
27 |
-
'optgroup': {'optgroup': true},
|
28 |
-
'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,
|
29 |
-
'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,
|
30 |
-
'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,
|
31 |
-
'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,
|
32 |
-
'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},
|
33 |
-
'rp': {'rp': true, 'rt': true},
|
34 |
-
'rt': {'rp': true, 'rt': true},
|
35 |
-
'tbody': {'tbody': true, 'tfoot': true},
|
36 |
-
'td': {'td': true, 'th': true},
|
37 |
-
'tfoot': {'tbody': true},
|
38 |
-
'th': {'td': true, 'th': true},
|
39 |
-
'thead': {'tbody': true, 'tfoot': true},
|
40 |
-
'tr': {'tr': true}
|
41 |
-
},
|
42 |
-
doNotIndent: {"pre": true},
|
43 |
-
allowUnquoted: true,
|
44 |
-
allowMissing: true,
|
45 |
-
caseFold: true
|
46 |
-
}
|
47 |
-
|
48 |
-
var xmlConfig = {
|
49 |
-
autoSelfClosers: {},
|
50 |
-
implicitlyClosed: {},
|
51 |
-
contextGrabbers: {},
|
52 |
-
doNotIndent: {},
|
53 |
-
allowUnquoted: false,
|
54 |
-
allowMissing: false,
|
55 |
-
caseFold: false
|
56 |
-
}
|
57 |
-
|
58 |
-
CodeMirror.defineMode("xml", function(editorConf, config_) {
|
59 |
-
var indentUnit = editorConf.indentUnit
|
60 |
-
var config = {}
|
61 |
-
var defaults = config_.htmlMode ? htmlConfig : xmlConfig
|
62 |
-
for (var prop in defaults) config[prop] = defaults[prop]
|
63 |
-
for (var prop in config_) config[prop] = config_[prop]
|
64 |
-
|
65 |
-
// Return variables for tokenizers
|
66 |
-
var type, setStyle;
|
67 |
-
|
68 |
-
function inText(stream, state) {
|
69 |
-
function chain(parser) {
|
70 |
-
state.tokenize = parser;
|
71 |
-
return parser(stream, state);
|
72 |
-
}
|
73 |
-
|
74 |
-
var ch = stream.next();
|
75 |
-
if (ch == "<") {
|
76 |
-
if (stream.eat("!")) {
|
77 |
-
if (stream.eat("[")) {
|
78 |
-
if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));
|
79 |
-
else return null;
|
80 |
-
} else if (stream.match("--")) {
|
81 |
-
return chain(inBlock("comment", "-->"));
|
82 |
-
} else if (stream.match("DOCTYPE", true, true)) {
|
83 |
-
stream.eatWhile(/[\w\._\-]/);
|
84 |
-
return chain(doctype(1));
|
85 |
-
} else {
|
86 |
-
return null;
|
87 |
-
}
|
88 |
-
} else if (stream.eat("?")) {
|
89 |
-
stream.eatWhile(/[\w\._\-]/);
|
90 |
-
state.tokenize = inBlock("meta", "?>");
|
91 |
-
return "meta";
|
92 |
-
} else {
|
93 |
-
type = stream.eat("/") ? "closeTag" : "openTag";
|
94 |
-
state.tokenize = inTag;
|
95 |
-
return "tag bracket";
|
96 |
-
}
|
97 |
-
} else if (ch == "&") {
|
98 |
-
var ok;
|
99 |
-
if (stream.eat("#")) {
|
100 |
-
if (stream.eat("x")) {
|
101 |
-
ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";");
|
102 |
-
} else {
|
103 |
-
ok = stream.eatWhile(/[\d]/) && stream.eat(";");
|
104 |
-
}
|
105 |
-
} else {
|
106 |
-
ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";");
|
107 |
-
}
|
108 |
-
return ok ? "atom" : "error";
|
109 |
-
} else {
|
110 |
-
stream.eatWhile(/[^&<]/);
|
111 |
-
return null;
|
112 |
-
}
|
113 |
-
}
|
114 |
-
inText.isInText = true;
|
115 |
-
|
116 |
-
function inTag(stream, state) {
|
117 |
-
var ch = stream.next();
|
118 |
-
if (ch == ">" || (ch == "/" && stream.eat(">"))) {
|
119 |
-
state.tokenize = inText;
|
120 |
-
type = ch == ">" ? "endTag" : "selfcloseTag";
|
121 |
-
return "tag bracket";
|
122 |
-
} else if (ch == "=") {
|
123 |
-
type = "equals";
|
124 |
-
return null;
|
125 |
-
} else if (ch == "<") {
|
126 |
-
state.tokenize = inText;
|
127 |
-
state.state = baseState;
|
128 |
-
state.tagName = state.tagStart = null;
|
129 |
-
var next = state.tokenize(stream, state);
|
130 |
-
return next ? next + " tag error" : "tag error";
|
131 |
-
} else if (/[\'\"]/.test(ch)) {
|
132 |
-
state.tokenize = inAttribute(ch);
|
133 |
-
state.stringStartCol = stream.column();
|
134 |
-
return state.tokenize(stream, state);
|
135 |
-
} else {
|
136 |
-
stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/);
|
137 |
-
return "word";
|
138 |
-
}
|
139 |
-
}
|
140 |
-
|
141 |
-
function inAttribute(quote) {
|
142 |
-
var closure = function(stream, state) {
|
143 |
-
while (!stream.eol()) {
|
144 |
-
if (stream.next() == quote) {
|
145 |
-
state.tokenize = inTag;
|
146 |
-
break;
|
147 |
-
}
|
148 |
-
}
|
149 |
-
return "string";
|
150 |
-
};
|
151 |
-
closure.isInAttribute = true;
|
152 |
-
return closure;
|
153 |
-
}
|
154 |
-
|
155 |
-
function inBlock(style, terminator) {
|
156 |
-
return function(stream, state) {
|
157 |
-
while (!stream.eol()) {
|
158 |
-
if (stream.match(terminator)) {
|
159 |
-
state.tokenize = inText;
|
160 |
-
break;
|
161 |
-
}
|
162 |
-
stream.next();
|
163 |
-
}
|
164 |
-
return style;
|
165 |
-
};
|
166 |
-
}
|
167 |
-
function doctype(depth) {
|
168 |
-
return function(stream, state) {
|
169 |
-
var ch;
|
170 |
-
while ((ch = stream.next()) != null) {
|
171 |
-
if (ch == "<") {
|
172 |
-
state.tokenize = doctype(depth + 1);
|
173 |
-
return state.tokenize(stream, state);
|
174 |
-
} else if (ch == ">") {
|
175 |
-
if (depth == 1) {
|
176 |
-
state.tokenize = inText;
|
177 |
-
break;
|
178 |
-
} else {
|
179 |
-
state.tokenize = doctype(depth - 1);
|
180 |
-
return state.tokenize(stream, state);
|
181 |
-
}
|
182 |
-
}
|
183 |
-
}
|
184 |
-
return "meta";
|
185 |
-
};
|
186 |
-
}
|
187 |
-
|
188 |
-
function Context(state, tagName, startOfLine) {
|
189 |
-
this.prev = state.context;
|
190 |
-
this.tagName = tagName;
|
191 |
-
this.indent = state.indented;
|
192 |
-
this.startOfLine = startOfLine;
|
193 |
-
if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))
|
194 |
-
this.noIndent = true;
|
195 |
-
}
|
196 |
-
function popContext(state) {
|
197 |
-
if (state.context) state.context = state.context.prev;
|
198 |
-
}
|
199 |
-
function maybePopContext(state, nextTagName) {
|
200 |
-
var parentTagName;
|
201 |
-
while (true) {
|
202 |
-
if (!state.context) {
|
203 |
-
return;
|
204 |
-
}
|
205 |
-
parentTagName = state.context.tagName;
|
206 |
-
if (!config.contextGrabbers.hasOwnProperty(parentTagName) ||
|
207 |
-
!config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {
|
208 |
-
return;
|
209 |
-
}
|
210 |
-
popContext(state);
|
211 |
-
}
|
212 |
-
}
|
213 |
-
|
214 |
-
function baseState(type, stream, state) {
|
215 |
-
if (type == "openTag") {
|
216 |
-
state.tagStart = stream.column();
|
217 |
-
return tagNameState;
|
218 |
-
} else if (type == "closeTag") {
|
219 |
-
return closeTagNameState;
|
220 |
-
} else {
|
221 |
-
return baseState;
|
222 |
-
}
|
223 |
-
}
|
224 |
-
function tagNameState(type, stream, state) {
|
225 |
-
if (type == "word") {
|
226 |
-
state.tagName = stream.current();
|
227 |
-
setStyle = "tag";
|
228 |
-
return attrState;
|
229 |
-
} else {
|
230 |
-
setStyle = "error";
|
231 |
-
return tagNameState;
|
232 |
-
}
|
233 |
-
}
|
234 |
-
function closeTagNameState(type, stream, state) {
|
235 |
-
if (type == "word") {
|
236 |
-
var tagName = stream.current();
|
237 |
-
if (state.context && state.context.tagName != tagName &&
|
238 |
-
config.implicitlyClosed.hasOwnProperty(state.context.tagName))
|
239 |
-
popContext(state);
|
240 |
-
if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {
|
241 |
-
setStyle = "tag";
|
242 |
-
return closeState;
|
243 |
-
} else {
|
244 |
-
setStyle = "tag error";
|
245 |
-
return closeStateErr;
|
246 |
-
}
|
247 |
-
} else {
|
248 |
-
setStyle = "error";
|
249 |
-
return closeStateErr;
|
250 |
-
}
|
251 |
-
}
|
252 |
-
|
253 |
-
function closeState(type, _stream, state) {
|
254 |
-
if (type != "endTag") {
|
255 |
-
setStyle = "error";
|
256 |
-
return closeState;
|
257 |
-
}
|
258 |
-
popContext(state);
|
259 |
-
return baseState;
|
260 |
-
}
|
261 |
-
function closeStateErr(type, stream, state) {
|
262 |
-
setStyle = "error";
|
263 |
-
return closeState(type, stream, state);
|
264 |
-
}
|
265 |
-
|
266 |
-
function attrState(type, _stream, state) {
|
267 |
-
if (type == "word") {
|
268 |
-
setStyle = "attribute";
|
269 |
-
return attrEqState;
|
270 |
-
} else if (type == "endTag" || type == "selfcloseTag") {
|
271 |
-
var tagName = state.tagName, tagStart = state.tagStart;
|
272 |
-
state.tagName = state.tagStart = null;
|
273 |
-
if (type == "selfcloseTag" ||
|
274 |
-
config.autoSelfClosers.hasOwnProperty(tagName)) {
|
275 |
-
maybePopContext(state, tagName);
|
276 |
-
} else {
|
277 |
-
maybePopContext(state, tagName);
|
278 |
-
state.context = new Context(state, tagName, tagStart == state.indented);
|
279 |
-
}
|
280 |
-
return baseState;
|
281 |
-
}
|
282 |
-
setStyle = "error";
|
283 |
-
return attrState;
|
284 |
-
}
|
285 |
-
function attrEqState(type, stream, state) {
|
286 |
-
if (type == "equals") return attrValueState;
|
287 |
-
if (!config.allowMissing) setStyle = "error";
|
288 |
-
return attrState(type, stream, state);
|
289 |
-
}
|
290 |
-
function attrValueState(type, stream, state) {
|
291 |
-
if (type == "string") return attrContinuedState;
|
292 |
-
if (type == "word" && config.allowUnquoted) {setStyle = "string"; return attrState;}
|
293 |
-
setStyle = "error";
|
294 |
-
return attrState(type, stream, state);
|
295 |
-
}
|
296 |
-
function attrContinuedState(type, stream, state) {
|
297 |
-
if (type == "string") return attrContinuedState;
|
298 |
-
return attrState(type, stream, state);
|
299 |
-
}
|
300 |
-
|
301 |
-
return {
|
302 |
-
startState: function(baseIndent) {
|
303 |
-
var state = {tokenize: inText,
|
304 |
-
state: baseState,
|
305 |
-
indented: baseIndent || 0,
|
306 |
-
tagName: null, tagStart: null,
|
307 |
-
context: null}
|
308 |
-
if (baseIndent != null) state.baseIndent = baseIndent
|
309 |
-
return state
|
310 |
-
},
|
311 |
-
|
312 |
-
token: function(stream, state) {
|
313 |
-
if (!state.tagName && stream.sol())
|
314 |
-
state.indented = stream.indentation();
|
315 |
-
|
316 |
-
if (stream.eatSpace()) return null;
|
317 |
-
type = null;
|
318 |
-
var style = state.tokenize(stream, state);
|
319 |
-
if ((style || type) && style != "comment") {
|
320 |
-
setStyle = null;
|
321 |
-
state.state = state.state(type || style, stream, state);
|
322 |
-
if (setStyle)
|
323 |
-
style = setStyle == "error" ? style + " error" : setStyle;
|
324 |
-
}
|
325 |
-
return style;
|
326 |
-
},
|
327 |
-
|
328 |
-
indent: function(state, textAfter, fullLine) {
|
329 |
-
var context = state.context;
|
330 |
-
// Indent multi-line strings (e.g. css).
|
331 |
-
if (state.tokenize.isInAttribute) {
|
332 |
-
if (state.tagStart == state.indented)
|
333 |
-
return state.stringStartCol + 1;
|
334 |
-
else
|
335 |
-
return state.indented + indentUnit;
|
336 |
-
}
|
337 |
-
if (context && context.noIndent) return CodeMirror.Pass;
|
338 |
-
if (state.tokenize != inTag && state.tokenize != inText)
|
339 |
-
return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;
|
340 |
-
// Indent the starts of attribute names.
|
341 |
-
if (state.tagName) {
|
342 |
-
if (config.multilineTagIndentPastTag !== false)
|
343 |
-
return state.tagStart + state.tagName.length + 2;
|
344 |
-
else
|
345 |
-
return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);
|
346 |
-
}
|
347 |
-
if (config.alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0;
|
348 |
-
var tagAfter = textAfter && /^<(\/)?([\w_:\.-]*)/.exec(textAfter);
|
349 |
-
if (tagAfter && tagAfter[1]) { // Closing tag spotted
|
350 |
-
while (context) {
|
351 |
-
if (context.tagName == tagAfter[2]) {
|
352 |
-
context = context.prev;
|
353 |
-
break;
|
354 |
-
} else if (config.implicitlyClosed.hasOwnProperty(context.tagName)) {
|
355 |
-
context = context.prev;
|
356 |
-
} else {
|
357 |
-
break;
|
358 |
-
}
|
359 |
-
}
|
360 |
-
} else if (tagAfter) { // Opening tag spotted
|
361 |
-
while (context) {
|
362 |
-
var grabbers = config.contextGrabbers[context.tagName];
|
363 |
-
if (grabbers && grabbers.hasOwnProperty(tagAfter[2]))
|
364 |
-
context = context.prev;
|
365 |
-
else
|
366 |
-
break;
|
367 |
-
}
|
368 |
-
}
|
369 |
-
while (context && context.prev && !context.startOfLine)
|
370 |
-
context = context.prev;
|
371 |
-
if (context) return context.indent + indentUnit;
|
372 |
-
else return state.baseIndent || 0;
|
373 |
-
},
|
374 |
-
|
375 |
-
electricInput: /<\/[\s\w:]+>$/,
|
376 |
-
blockCommentStart: "<!--",
|
377 |
-
blockCommentEnd: "-->",
|
378 |
-
|
379 |
-
configuration: config.htmlMode ? "html" : "xml",
|
380 |
-
helperType: config.htmlMode ? "html" : "xml",
|
381 |
-
|
382 |
-
skipAttribute: function(state) {
|
383 |
-
if (state.state == attrValueState)
|
384 |
-
state.state = attrState
|
385 |
-
}
|
386 |
-
};
|
387 |
-
});
|
388 |
-
|
389 |
-
CodeMirror.defineMIME("text/xml", "xml");
|
390 |
-
CodeMirror.defineMIME("application/xml", "xml");
|
391 |
-
if (!CodeMirror.mimeModes.hasOwnProperty("text/html"))
|
392 |
-
CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});
|
393 |
-
|
394 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/images/button-close-hover.png
DELETED
Binary file
|
assets/images/button-close.png
DELETED
Binary file
|
custom-css-js.php
CHANGED
@@ -3,9 +3,9 @@
|
|
3 |
* Plugin Name: Simple Custom CSS and JS
|
4 |
* Plugin URI: https://wordpress.org/plugins/custom-css-js/
|
5 |
* Description: Easily add Custom CSS or JS to your website with an awesome editor.
|
6 |
-
* Version:
|
7 |
* Author: Diana Burduja
|
8 |
-
* Author URI:
|
9 |
* License: GPL2
|
10 |
*
|
11 |
*/
|
@@ -15,13 +15,13 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
15 |
}
|
16 |
|
17 |
if ( ! class_exists( 'CustomCSSandJS' ) ) :
|
18 |
-
define( 'CCJ_VERSION', '2.10' );
|
19 |
/**
|
20 |
* Main CustomCSSandJS Class
|
21 |
*
|
22 |
* @class CustomCSSandJS
|
23 |
*/
|
24 |
final class CustomCSSandJS {
|
|
|
25 |
public $plugins_url = '';
|
26 |
public $plugin_dir_path = '';
|
27 |
public $plugin_file = __FILE__;
|
@@ -73,9 +73,6 @@ final class CustomCSSandJS {
|
|
73 |
$this->upload_url = $wp_upload_dir['baseurl'] . '/custom-css-js';
|
74 |
if ( is_admin() ) {
|
75 |
include_once( 'includes/admin-screens.php' );
|
76 |
-
include_once( 'includes/admin-addons.php' );
|
77 |
-
include_once( 'includes/admin-warnings.php' );
|
78 |
-
include_once( 'includes/admin-notices.php' );
|
79 |
}
|
80 |
|
81 |
$this->search_tree = get_option( 'custom-css-js-tree' );
|
@@ -84,9 +81,8 @@ final class CustomCSSandJS {
|
|
84 |
return false;
|
85 |
}
|
86 |
|
87 |
-
|
88 |
-
|
89 |
-
}
|
90 |
}
|
91 |
|
92 |
/**
|
@@ -94,15 +90,40 @@ final class CustomCSSandJS {
|
|
94 |
*/
|
95 |
function print_code_actions() {
|
96 |
foreach( $this->search_tree as $_key => $_value ) {
|
97 |
-
$action = '
|
98 |
-
|
99 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
}
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
$action .= 'footer';
|
105 |
}
|
|
|
106 |
add_action( $action, array( $this, 'print_' . $_key ) );
|
107 |
}
|
108 |
}
|
@@ -112,7 +133,7 @@ final class CustomCSSandJS {
|
|
112 |
*/
|
113 |
public function __call( $function, $args ) {
|
114 |
|
115 |
-
if (
|
116 |
return false;
|
117 |
}
|
118 |
|
@@ -129,15 +150,15 @@ final class CustomCSSandJS {
|
|
129 |
}
|
130 |
|
131 |
// print the `internal` code
|
132 |
-
if (
|
133 |
|
134 |
$before = '<!-- start Simple Custom CSS and JS -->' . PHP_EOL;
|
135 |
$after = '<!-- end Simple Custom CSS and JS -->' . PHP_EOL;
|
136 |
-
if (
|
137 |
$before .= '<style type="text/css">' . PHP_EOL;
|
138 |
$after = '</style>' . PHP_EOL . $after;
|
139 |
}
|
140 |
-
if (
|
141 |
$before .= '<script type="text/javascript">' . PHP_EOL;
|
142 |
$after = '</script>' . PHP_EOL . $after;
|
143 |
}
|
@@ -154,35 +175,24 @@ final class CustomCSSandJS {
|
|
154 |
}
|
155 |
|
156 |
// link the `external` code
|
157 |
-
if (
|
158 |
$in_footer = false;
|
159 |
-
if (
|
160 |
$in_footer = true;
|
161 |
}
|
162 |
|
163 |
-
if (
|
164 |
foreach( $args as $_filename ) {
|
165 |
echo PHP_EOL . "<script type='text/javascript' src='".$this->upload_url . '/' . $_filename."'></script>" . PHP_EOL;
|
166 |
}
|
167 |
}
|
168 |
|
169 |
-
if (
|
170 |
foreach( $args as $_filename ) {
|
171 |
-
|
172 |
-
echo PHP_EOL . "<link rel='stylesheet' id='".$shortfilename ."-css' href='".$this->upload_url . '/' . $_filename ."' type='text/css' media='all' />" . PHP_EOL;
|
173 |
}
|
174 |
}
|
175 |
}
|
176 |
-
|
177 |
-
// link the HTML code
|
178 |
-
if ( strpos( $function, 'html' ) !== false ) {
|
179 |
-
foreach( $args as $_post_id ) {
|
180 |
-
$_post_id = str_replace('.html', '', $_post_id);
|
181 |
-
$post = get_post( $_post_id );
|
182 |
-
echo $post->post_content . PHP_EOL;
|
183 |
-
}
|
184 |
-
|
185 |
-
}
|
186 |
}
|
187 |
|
188 |
/**
|
@@ -246,6 +256,48 @@ function CustomCSSandJS() {
|
|
246 |
CustomCSSandJS();
|
247 |
|
248 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
249 |
/**
|
250 |
* Plugin action link to Settings page
|
251 |
*/
|
3 |
* Plugin Name: Simple Custom CSS and JS
|
4 |
* Plugin URI: https://wordpress.org/plugins/custom-css-js/
|
5 |
* Description: Easily add Custom CSS or JS to your website with an awesome editor.
|
6 |
+
* Version: 1.5
|
7 |
* Author: Diana Burduja
|
8 |
+
* Author URI: http://www.silkypress.com/
|
9 |
* License: GPL2
|
10 |
*
|
11 |
*/
|
15 |
}
|
16 |
|
17 |
if ( ! class_exists( 'CustomCSSandJS' ) ) :
|
|
|
18 |
/**
|
19 |
* Main CustomCSSandJS Class
|
20 |
*
|
21 |
* @class CustomCSSandJS
|
22 |
*/
|
23 |
final class CustomCSSandJS {
|
24 |
+
public $version = '1.4';
|
25 |
public $plugins_url = '';
|
26 |
public $plugin_dir_path = '';
|
27 |
public $plugin_file = __FILE__;
|
73 |
$this->upload_url = $wp_upload_dir['baseurl'] . '/custom-css-js';
|
74 |
if ( is_admin() ) {
|
75 |
include_once( 'includes/admin-screens.php' );
|
|
|
|
|
|
|
76 |
}
|
77 |
|
78 |
$this->search_tree = get_option( 'custom-css-js-tree' );
|
81 |
return false;
|
82 |
}
|
83 |
|
84 |
+
$this->print_code_actions();
|
85 |
+
|
|
|
86 |
}
|
87 |
|
88 |
/**
|
90 |
*/
|
91 |
function print_code_actions() {
|
92 |
foreach( $this->search_tree as $_key => $_value ) {
|
93 |
+
$action = '';
|
94 |
+
switch( $_key ) {
|
95 |
+
case 'admin-css-header-external' :
|
96 |
+
case 'admin-js-header-external' :
|
97 |
+
case 'admin-css-header-internal' :
|
98 |
+
case 'admin-js-header-internal' :
|
99 |
+
$action = 'admin_head';
|
100 |
+
break;
|
101 |
+
|
102 |
+
case 'admin-css-footer-external' :
|
103 |
+
case 'admin-js-footer-external' :
|
104 |
+
case 'admin-css-footer-internal' :
|
105 |
+
case 'admin-js-footer-internal' :
|
106 |
+
$action = 'admin_footer';
|
107 |
+
break;
|
108 |
+
|
109 |
+
case 'frontend-css-header-external' :
|
110 |
+
case 'frontend-css-footer-external' :
|
111 |
+
case 'frontend-css-header-internal' :
|
112 |
+
case 'frontend-js-header-internal' :
|
113 |
+
case 'frontend-js-header-external' :
|
114 |
+
$action = 'wp_head';
|
115 |
+
break;
|
116 |
+
case 'frontend-css-footer-internal' :
|
117 |
+
case 'frontend-js-footer-internal' :
|
118 |
+
case 'frontend-js-footer-external' :
|
119 |
+
$action = 'wp_footer';
|
120 |
+
break;
|
121 |
}
|
122 |
+
|
123 |
+
if ( $action == '' ) {
|
124 |
+
continue;
|
|
|
125 |
}
|
126 |
+
|
127 |
add_action( $action, array( $this, 'print_' . $_key ) );
|
128 |
}
|
129 |
}
|
133 |
*/
|
134 |
public function __call( $function, $args ) {
|
135 |
|
136 |
+
if ( strstr( $function, 'print_' ) == false ) {
|
137 |
return false;
|
138 |
}
|
139 |
|
150 |
}
|
151 |
|
152 |
// print the `internal` code
|
153 |
+
if ( strstr( $function, 'internal' ) ) {
|
154 |
|
155 |
$before = '<!-- start Simple Custom CSS and JS -->' . PHP_EOL;
|
156 |
$after = '<!-- end Simple Custom CSS and JS -->' . PHP_EOL;
|
157 |
+
if ( strstr( $function, 'css' ) ) {
|
158 |
$before .= '<style type="text/css">' . PHP_EOL;
|
159 |
$after = '</style>' . PHP_EOL . $after;
|
160 |
}
|
161 |
+
if ( strstr( $function, 'js' ) ) {
|
162 |
$before .= '<script type="text/javascript">' . PHP_EOL;
|
163 |
$after = '</script>' . PHP_EOL . $after;
|
164 |
}
|
175 |
}
|
176 |
|
177 |
// link the `external` code
|
178 |
+
if ( strstr( $function, 'external' ) ) {
|
179 |
$in_footer = false;
|
180 |
+
if ( strstr( $function, 'footer' ) ) {
|
181 |
$in_footer = true;
|
182 |
}
|
183 |
|
184 |
+
if ( strstr( $function, 'js' ) ) {
|
185 |
foreach( $args as $_filename ) {
|
186 |
echo PHP_EOL . "<script type='text/javascript' src='".$this->upload_url . '/' . $_filename."'></script>" . PHP_EOL;
|
187 |
}
|
188 |
}
|
189 |
|
190 |
+
if ( strstr( $function, 'css' ) ) {
|
191 |
foreach( $args as $_filename ) {
|
192 |
+
echo PHP_EOL . "<link rel='stylesheet' id='".$_filename."-css' href='".$this->upload_url . '/' . $_filename ."' type='text/css' media='all' />" . PHP_EOL;
|
|
|
193 |
}
|
194 |
}
|
195 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
196 |
}
|
197 |
|
198 |
/**
|
256 |
CustomCSSandJS();
|
257 |
|
258 |
|
259 |
+
/**
|
260 |
+
* Delete options, posts and files on uninstall
|
261 |
+
*/
|
262 |
+
function custom_css_js_uninstall() {
|
263 |
+
|
264 |
+
delete_option( 'custom-css-js-tree' );
|
265 |
+
|
266 |
+
$wp_upload_dir = wp_upload_dir();
|
267 |
+
$upload_dir = $wp_upload_dir['basedir'] . '/custom-css-js';
|
268 |
+
@array_map( 'unlink', $upload_dir . '/*' );
|
269 |
+
@unlink( $upload_dir );
|
270 |
+
|
271 |
+
$posts = query_posts( 'post_type=custom-css-js' );
|
272 |
+
|
273 |
+
if ( ! is_array( $posts ) || count( $posts ) == 0 ) {
|
274 |
+
return false;
|
275 |
+
}
|
276 |
+
|
277 |
+
foreach ( $posts as $_post ) {
|
278 |
+
wp_delete_post( $_post, true );
|
279 |
+
}
|
280 |
+
|
281 |
+
}
|
282 |
+
register_uninstall_hook( __FILE__, 'custom_css_js_uninstall' );
|
283 |
+
|
284 |
+
|
285 |
+
/**
|
286 |
+
* Create the upload directory on install
|
287 |
+
*/
|
288 |
+
function custom_css_js_install() {
|
289 |
+
$wp_upload_dir = wp_upload_dir();
|
290 |
+
$upload_dir = $wp_upload_dir['basedir'] . '/custom-css-js';
|
291 |
+
wp_mkdir_p( $upload_dir );
|
292 |
+
|
293 |
+
// Top level blank index.php
|
294 |
+
if ( ! file_exists( $upload_dir . '/index.php' ) && wp_is_writable( $upload_dir ) ) {
|
295 |
+
$content = '<?php' . PHP_EOL . '// Silence is golden.';
|
296 |
+
@file_put_contents( $upload_dir . '/index.php', $content );
|
297 |
+
}
|
298 |
+
}
|
299 |
+
register_activation_hook( __FILE__, 'custom_css_js_install' );
|
300 |
+
|
301 |
/**
|
302 |
* Plugin action link to Settings page
|
303 |
*/
|
includes/admin-addons.php
DELETED
@@ -1,186 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Custom CSS and JS
|
4 |
-
*
|
5 |
-
*/
|
6 |
-
|
7 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
8 |
-
exit; // Exit if accessed directly
|
9 |
-
}
|
10 |
-
|
11 |
-
/**
|
12 |
-
* CustomCSSandJS_Addons
|
13 |
-
*/
|
14 |
-
class CustomCSSandJS_Addons {
|
15 |
-
|
16 |
-
/**
|
17 |
-
* Constructor
|
18 |
-
*/
|
19 |
-
public function __construct() {
|
20 |
-
|
21 |
-
// Add actions
|
22 |
-
$actions = array(
|
23 |
-
'add_meta_boxes' => 'add_meta_boxes',
|
24 |
-
'edit_form_advanced' => 'only_premium',
|
25 |
-
);
|
26 |
-
foreach( $actions as $_key => $_value ) {
|
27 |
-
add_action( $_key, array( $this, $_value ) );
|
28 |
-
}
|
29 |
-
|
30 |
-
}
|
31 |
-
|
32 |
-
function only_premium() {
|
33 |
-
$current_screen = get_current_screen();
|
34 |
-
|
35 |
-
if ( $current_screen->post_type != 'custom-css-js' ) {
|
36 |
-
return false;
|
37 |
-
}
|
38 |
-
|
39 |
-
?>
|
40 |
-
<div class="ccj_only_premium ccj_only_premium-first">
|
41 |
-
<div>
|
42 |
-
<a href="https://www.silkypress.com/simple-custom-css-js-pro/?utm_source=wordpress&utm_campaign=ccj_free&utm_medium=banner" target="_blank">Available only in <br />Simple Custom CSS and JS Pro</a>
|
43 |
-
</div>
|
44 |
-
</div>
|
45 |
-
<?php
|
46 |
-
}
|
47 |
-
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Add the URL Preview meta box
|
51 |
-
*/
|
52 |
-
function add_meta_boxes() {
|
53 |
-
|
54 |
-
add_meta_box( 'previewdiv', __('Preview'), array( $this, 'previews_meta_box_callback' ), 'custom-css-js', 'normal' );
|
55 |
-
add_meta_box( 'url-rules', __('Apply only on these URLs'), array( $this, 'url_rules_meta_box_callback' ), 'custom-css-js', 'normal' );
|
56 |
-
add_meta_box( 'revisionsdiv', __('Code Revisions'), array( $this, 'revisions_meta_box_callback' ), 'custom-css-js', 'normal' );
|
57 |
-
}
|
58 |
-
|
59 |
-
|
60 |
-
/**
|
61 |
-
* The Preview meta box content
|
62 |
-
*/
|
63 |
-
function previews_meta_box_callback( $post ) {
|
64 |
-
?>
|
65 |
-
<div id="preview-action">
|
66 |
-
<div>
|
67 |
-
<input type="text" name="preview_url" id="ccj-preview_url" placeholder="Full URL on which to preview the changes ..." disabled="disabled" />
|
68 |
-
<a class="preview button button-primary button-large" id="ccj-preview">Preview Changes</a>
|
69 |
-
</div>
|
70 |
-
</div>
|
71 |
-
<?php
|
72 |
-
|
73 |
-
}
|
74 |
-
|
75 |
-
|
76 |
-
/**
|
77 |
-
* Show the URL Rules metabox
|
78 |
-
*/
|
79 |
-
function url_rules_meta_box_callback( $post ) {
|
80 |
-
|
81 |
-
$filters = array(
|
82 |
-
'all' => __('All Website'),
|
83 |
-
'first-page' => __('First page'),
|
84 |
-
'contains' => __('Contains'),
|
85 |
-
'not-contains' => __('Not contains'),
|
86 |
-
'equal-to' => __('Is equal to'),
|
87 |
-
'not-equal-to' => __('Not equal to'),
|
88 |
-
'begins-with' => __('Starts with'),
|
89 |
-
'ends-by' => __('Ends by'),
|
90 |
-
);
|
91 |
-
$filters_html = '';
|
92 |
-
foreach( $filters as $_key => $_value ) {
|
93 |
-
$filters_html .= '<option value="'.$_key.'">' . $_value . '</option>';
|
94 |
-
}
|
95 |
-
|
96 |
-
$applied_filters = '[{"value":"","type":"all","index":1}]';
|
97 |
-
|
98 |
-
?>
|
99 |
-
<input type="hidden" name="scan_anchor_filters" id="wplnst-scan-anchor-filters" value='<?php echo $applied_filters; ?>' />
|
100 |
-
<table id="wplnst-elist-anchor-filters" class="wplnst-elist" cellspacing="0" cellpadding="0" border="0" data-editable="true" data-label="<?php _e('URL'); ?>"></table>
|
101 |
-
<?php _e('URL'); ?> <select id="wplnst-af-new-type"><?php echo $filters_html ?></select>
|
102 |
-
<input id="wplnst-af-new" type="text" class="regular-text" value="" placeholder="<?php _e('Text filter'); ?>" />
|
103 |
-
<input class="button button-primary" type="button" id="wplnst-af-new-add" value="<?php _e('Add'); ?>" /></td>
|
104 |
-
|
105 |
-
<?php
|
106 |
-
}
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
/**
|
111 |
-
* Output the revisions
|
112 |
-
*/
|
113 |
-
function revisions_meta_box_callback( $post ) {
|
114 |
-
$datef = _x( 'F j, Y @ H:i:s', 'revision date format' );
|
115 |
-
$users = get_users(array('number' => 3));
|
116 |
-
$revisions = array(
|
117 |
-
array(
|
118 |
-
'ID' => 1,
|
119 |
-
'post_author' => $users[0]->display_name,
|
120 |
-
'title' => date_i18n( $datef, time() - 86400 ),
|
121 |
-
),
|
122 |
-
array(
|
123 |
-
'ID' => 2,
|
124 |
-
'post_author' => isset($users[1]) ? $users[1]->display_name : $users[0]->display_name,
|
125 |
-
'title' => date_i18n( $datef, time() - 87639),
|
126 |
-
),
|
127 |
-
array(
|
128 |
-
'ID' => 3,
|
129 |
-
'post_author' => isset($users[2]) ? $users[2]->display_name : $users[0]->display_name,
|
130 |
-
'title' => date_i18n( $datef, time() - 97639),
|
131 |
-
),
|
132 |
-
);
|
133 |
-
?>
|
134 |
-
<table class="revisions">
|
135 |
-
<thead><tr>
|
136 |
-
<th class="revisions-compare">Compare</th>
|
137 |
-
<th>Revision</th>
|
138 |
-
<th>Author</th>
|
139 |
-
<th><input type="checkbox" name="delete[]" value="all" id="ccj-delete-checkbox" /> Delete</th>
|
140 |
-
<th>Restore</th>
|
141 |
-
</tr></thead>
|
142 |
-
<tbody>
|
143 |
-
<?php foreach( $revisions as $revision ) : ?>
|
144 |
-
<?php
|
145 |
-
|
146 |
-
$restore_url = '#';
|
147 |
-
|
148 |
-
$delete_disabled = '';
|
149 |
-
$delete_tooltip = '';
|
150 |
-
$class = '';
|
151 |
-
?>
|
152 |
-
<tr class="<?php echo $class; ?>" id="<?php echo 'revision-row-' . $revision['ID']; ?>">
|
153 |
-
<td class="revisions-compare">
|
154 |
-
<input type="radio" name="compare_left" value="<?php echo $revision['ID']; ?>" />
|
155 |
-
<input type="radio" name="compare_right" value="<?php echo $revision['ID']; ?>" />
|
156 |
-
</td>
|
157 |
-
<td><?php echo $revision['title']; ?></td>
|
158 |
-
<td><?php echo $revision['post_author']; ?></td>
|
159 |
-
<td class="revisions-delete">
|
160 |
-
<input type="checkbox" name="delete[]" value="<?php echo $revision['ID']; ?>" <?php echo $delete_disabled . $delete_tooltip; ?>/>
|
161 |
-
</td>
|
162 |
-
<td class="revisions-restore">
|
163 |
-
<a href="<?php echo $restore_url; ?>"><?php _e('Restore'); ?></a>
|
164 |
-
</td>
|
165 |
-
</tr>
|
166 |
-
<?php endforeach; ?>
|
167 |
-
<tr>
|
168 |
-
<td>
|
169 |
-
<input type="button" class="button-secondary" value="<?php esc_attr_e('Compare'); ?>" id="revisions-compare-button" />
|
170 |
-
</td>
|
171 |
-
<td colspan="2"> </td>
|
172 |
-
<td>
|
173 |
-
<input type="button" class="button-secondary" value="<?php esc_attr_e('Delete'); ?>" id="revisions-delete-button" />
|
174 |
-
</td>
|
175 |
-
<td> </td>
|
176 |
-
</tr>
|
177 |
-
</tbody>
|
178 |
-
</table>
|
179 |
-
<?php
|
180 |
-
}
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
}
|
185 |
-
|
186 |
-
return new CustomCSSandJS_Addons();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
includes/admin-notices.php
DELETED
@@ -1,221 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Custom CSS and JS
|
4 |
-
*
|
5 |
-
*/
|
6 |
-
|
7 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
8 |
-
exit; // Exit if accessed directly
|
9 |
-
}
|
10 |
-
|
11 |
-
/**
|
12 |
-
* CustomCSSandJS_Notices
|
13 |
-
*/
|
14 |
-
class CustomCSSandJS_Notices {
|
15 |
-
|
16 |
-
var $prefix = 'ccj_';
|
17 |
-
var $activation_time = '';
|
18 |
-
var $version = '';
|
19 |
-
var $dismiss_notice = '';
|
20 |
-
var $expiration_days = 2;
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Constructor
|
24 |
-
*/
|
25 |
-
public function __construct() {
|
26 |
-
|
27 |
-
$this->set_variables();
|
28 |
-
|
29 |
-
if ( $this->dismiss_notice == 1 ) {
|
30 |
-
return;
|
31 |
-
}
|
32 |
-
|
33 |
-
$p = $this->prefix;
|
34 |
-
|
35 |
-
add_action( 'admin_notices', array( $this, 'admin_notices' ) );
|
36 |
-
add_action( 'wp_ajax_'.$p.'_notice_dismiss', array( $this, 'notice_dismiss' ) );
|
37 |
-
}
|
38 |
-
|
39 |
-
/**
|
40 |
-
* Hooked from 'admin_notices'
|
41 |
-
*/
|
42 |
-
public function admin_notices() {
|
43 |
-
$screen = get_current_screen();
|
44 |
-
|
45 |
-
if ( !isset($screen->post_type) || $screen->post_type !== 'custom-css-js' )
|
46 |
-
return;
|
47 |
-
|
48 |
-
if ( ! $notice = $this->choose_notice() )
|
49 |
-
return;
|
50 |
-
|
51 |
-
if ( time() - $this->activation_time <= 3600 )
|
52 |
-
return;
|
53 |
-
|
54 |
-
$message = $this->get_message( $notice );
|
55 |
-
|
56 |
-
$this->print_message( $notice, $message );
|
57 |
-
|
58 |
-
}
|
59 |
-
|
60 |
-
/**
|
61 |
-
* Get the options from the database or set them on install or upgrade
|
62 |
-
*/
|
63 |
-
public function set_variables() {
|
64 |
-
$now = time();
|
65 |
-
$p = $this->prefix;
|
66 |
-
|
67 |
-
$this->activation_time = get_option( $p . '_activation_time', '' );
|
68 |
-
$this->version = get_option( $p.'_version', '' );
|
69 |
-
$this->dismiss_notice = get_option( $p.'_dismiss_notice', false );
|
70 |
-
|
71 |
-
if ( empty( $this->activation_time ) || version_compare( $this->version, CCJ_VERSION, '<' ) ) {
|
72 |
-
$this->activation_time = $now;
|
73 |
-
update_option( $p.'_activation_time', $now );
|
74 |
-
update_option( $p.'_version', CCJ_VERSION );
|
75 |
-
update_option( $p.'_dismiss_notice', false );
|
76 |
-
}
|
77 |
-
|
78 |
-
}
|
79 |
-
|
80 |
-
/**
|
81 |
-
* Choose which notice to be shown
|
82 |
-
*/
|
83 |
-
public function choose_notice() {
|
84 |
-
$now = time();
|
85 |
-
|
86 |
-
$days_passed = ceil( ( $now - $this->activation_time ) / 86400 );
|
87 |
-
|
88 |
-
switch ( $days_passed ) {
|
89 |
-
case 1 : return '1_day';
|
90 |
-
case 2 : return '2_day';
|
91 |
-
case 3 : break; //return '3_day';
|
92 |
-
case 4 : break;
|
93 |
-
case 5 : break;
|
94 |
-
case 6 : break;
|
95 |
-
case 7 : break; // return '7_day';
|
96 |
-
case 8 : break;
|
97 |
-
case 9 : break;
|
98 |
-
case 10 : break;
|
99 |
-
case 11 : break;
|
100 |
-
case 12 : break; //return '12_day';
|
101 |
-
}
|
102 |
-
}
|
103 |
-
|
104 |
-
/**
|
105 |
-
* Get the text of the message
|
106 |
-
*/
|
107 |
-
public function get_message( $notice ) {
|
108 |
-
|
109 |
-
$message = '';
|
110 |
-
$percentage = '30';
|
111 |
-
$product_name = 'Simple Custom CSS and JS PRO';
|
112 |
-
|
113 |
-
$expiration_date = $this->activation_time + ( $this->expiration_days * 86400 );
|
114 |
-
$expiration_date = date( get_option( 'date_format') , $expiration_date );
|
115 |
-
|
116 |
-
$expiration_period = date('j M', $this->activation_time - 3*86400 ) . ' - ' . date('j M', $this->activation_time + 2*86400 );
|
117 |
-
|
118 |
-
|
119 |
-
if ( $notice == '12_days' ) {
|
120 |
-
$link = 'https://www.silkypress.com/simple-custom-css-js-pro/?utm_source=wordpress&utm_campaign=ccj_free&utm_medium=banner';
|
121 |
-
} else {
|
122 |
-
$link = 'https://www.silkypress.com/simple-custom-css-js-pro/?a=' . $this->convert_numbers_letters( $this->activation_time ) . '&utm_source=wordpress&utm_campaign=ccj_free&utm_medium=banner';
|
123 |
-
}
|
124 |
-
|
125 |
-
$lower_part = sprintf( '<div style="margin-top: 7px;"><a href="%s" target="_blank">%s</a> | <a href="#" class="dismiss_notice" target="_parent">%s</a></div>', $link, 'Get your discount now', 'Dismiss this notice' );
|
126 |
-
|
127 |
-
switch ( $notice ) {
|
128 |
-
case '1_day' :
|
129 |
-
$message = '<div>Only between '. $expiration_period .': <b>'.$percentage.'% Off from <a href="'.$link.'" target="_blank">'.$product_name.'</a></b> for our WordPress.org users.</div>' . $lower_part;
|
130 |
-
break;
|
131 |
-
|
132 |
-
case '2_day' :
|
133 |
-
$message = '<div><b>Limited offer ending today</b>. '.$percentage.'% Off from <a href="'.$link.'" target="_blank">'.$product_name.'</a> for our WordPress.org users. </div>' . $lower_part;
|
134 |
-
break;
|
135 |
-
|
136 |
-
case '3_day' :
|
137 |
-
$message = '<div><b>Limited offer ending today</b>. '.$percentage.'% Off from '.$product_name.' for our WordPress.org users. </div>' . $lower_part;
|
138 |
-
break;
|
139 |
-
|
140 |
-
case '7_day' :
|
141 |
-
$message = '';
|
142 |
-
break;
|
143 |
-
|
144 |
-
case '12_day' :
|
145 |
-
$message = '<div><b>Special Offer</b>: 30% Off from '.$product_name.' for our WordPress.org users.</div>' . $lower_part;
|
146 |
-
break;
|
147 |
-
}
|
148 |
-
|
149 |
-
return $message;
|
150 |
-
}
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
/**
|
155 |
-
* Print the message
|
156 |
-
*/
|
157 |
-
public function print_message( $option_name = '', $message = '' ) {
|
158 |
-
if ( empty( $message ) || empty( $option_name ) )
|
159 |
-
return;
|
160 |
-
|
161 |
-
$p = $this->prefix;
|
162 |
-
|
163 |
-
?>
|
164 |
-
<style type="text/css">
|
165 |
-
.<?php echo $p; ?>_note{ color: #bc1117; }
|
166 |
-
#<?php echo $p; ?>_notice { display: block; padding: }
|
167 |
-
#<?php echo $p; ?>_notice b { color: #bc1117; }
|
168 |
-
#<?php echo $p; ?>_notice a { text-decoration: none; font-weight: bold; }
|
169 |
-
#<?php echo $p; ?>_notice a.dismiss_notice { font-weight: normal; }
|
170 |
-
</style>
|
171 |
-
|
172 |
-
<script type='text/javascript'>
|
173 |
-
jQuery(function($){
|
174 |
-
$(document).on( 'click', '.<?php echo $p; ?>_notice .dismiss_notice', function() {
|
175 |
-
|
176 |
-
var data = {
|
177 |
-
action: '<?php echo $p; ?>_notice_dismiss',
|
178 |
-
option: '<?php echo $option_name; ?>'
|
179 |
-
};
|
180 |
-
$.post(ajaxurl, data, function(response ) {
|
181 |
-
$('#<?php echo $p; ?>_notice').fadeOut('slow');
|
182 |
-
});
|
183 |
-
});
|
184 |
-
});
|
185 |
-
</script>
|
186 |
-
|
187 |
-
<div id="<?php echo $p; ?>_notice" class="updated notice <?php echo $p; ?>_notice is-dismissible">
|
188 |
-
<p><?php echo $message ?></p>
|
189 |
-
<button type="button" class="notice-dismiss">
|
190 |
-
<span class="screen-reader-text"><?php _e('Dismiss this notice'); ?></span>
|
191 |
-
</button>
|
192 |
-
</div>
|
193 |
-
<?php
|
194 |
-
|
195 |
-
}
|
196 |
-
|
197 |
-
function convert_numbers_letters( $text, $from = 'numbers' ) {
|
198 |
-
$alphabet = str_split('abcdefghij');
|
199 |
-
$numbers = str_split('0123456789');
|
200 |
-
|
201 |
-
if ( $from == 'numbers' ) {
|
202 |
-
return str_replace( $numbers, $alphabet, $text );
|
203 |
-
} else {
|
204 |
-
return str_replace( $alphabet, $numbers, $text );
|
205 |
-
}
|
206 |
-
}
|
207 |
-
|
208 |
-
/**
|
209 |
-
* Ajax response for `notice_dismiss` action
|
210 |
-
*/
|
211 |
-
function notice_dismiss() {
|
212 |
-
$p = $this->prefix;
|
213 |
-
|
214 |
-
update_option( $p.'_dismiss_notice', 1 );
|
215 |
-
|
216 |
-
wp_die();
|
217 |
-
}
|
218 |
-
}
|
219 |
-
|
220 |
-
|
221 |
-
return new CustomCSSandJS_Notices();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
includes/admin-screens.php
CHANGED
@@ -38,50 +38,22 @@ class CustomCSSandJS_Admin {
|
|
38 |
* Constructor
|
39 |
*/
|
40 |
public function __construct() {
|
41 |
-
|
42 |
-
$this
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
|
44 |
$this->main = CustomCSSandJS();
|
45 |
}
|
46 |
|
47 |
-
/**
|
48 |
-
* Add actions and filters
|
49 |
-
*/
|
50 |
-
function add_functions() {
|
51 |
-
|
52 |
-
// Add filters
|
53 |
-
$filters = array(
|
54 |
-
'manage_custom-css-js_posts_columns' => 'manage_custom_posts_columns',
|
55 |
-
);
|
56 |
-
foreach( $filters as $_key => $_value ) {
|
57 |
-
add_filter( $_key, array( $this, $_value ) );
|
58 |
-
}
|
59 |
-
|
60 |
-
// Add actions
|
61 |
-
$actions = array(
|
62 |
-
'admin_menu' => 'admin_menu',
|
63 |
-
'admin_enqueue_scripts' => 'admin_enqueue_scripts',
|
64 |
-
'current_screen' => 'current_screen',
|
65 |
-
'admin_notices' => 'create_uploads_directory',
|
66 |
-
'edit_form_after_title' => 'codemirror_editor',
|
67 |
-
'add_meta_boxes' => 'add_meta_boxes',
|
68 |
-
'save_post' => 'options_save_meta_box_data',
|
69 |
-
'trashed_post' => 'trash_post',
|
70 |
-
'untrashed_post' => 'trash_post',
|
71 |
-
'admin_post_ccj-autosave' => 'ajax_autosave',
|
72 |
-
'wp_loaded' => 'compatibility_shortcoder',
|
73 |
-
'wp_ajax_ccj_active_code' => 'wp_ajax_ccj_active_code',
|
74 |
-
);
|
75 |
-
foreach( $actions as $_key => $_value ) {
|
76 |
-
add_action( $_key, array( $this, $_value ) );
|
77 |
-
}
|
78 |
-
|
79 |
-
|
80 |
-
// Add some custom actions
|
81 |
-
add_action( 'manage_custom-css-js_posts_custom_column', array( $this, 'manage_posts_columns' ), 10, 2 );
|
82 |
-
}
|
83 |
-
|
84 |
-
|
85 |
/**
|
86 |
* Add submenu pages
|
87 |
*/
|
@@ -89,14 +61,9 @@ class CustomCSSandJS_Admin {
|
|
89 |
$menu_slug = 'edit.php?post_type=custom-css-js';
|
90 |
$submenu_slug = 'post-new.php?post_type=custom-css-js';
|
91 |
|
92 |
-
$
|
93 |
-
add_submenu_page( $menu_slug, $title, $title, 'manage_options', $submenu_slug .'&language=css');
|
94 |
|
95 |
-
$
|
96 |
-
add_submenu_page( $menu_slug, $title, $title, 'manage_options', $submenu_slug . '&language=js');
|
97 |
-
|
98 |
-
$title = __('Add Custom HTML');
|
99 |
-
add_submenu_page( $menu_slug, $title, $title, 'manage_options', $submenu_slug . '&language=html');
|
100 |
|
101 |
remove_submenu_page( $menu_slug, $submenu_slug);
|
102 |
}
|
@@ -106,82 +73,24 @@ class CustomCSSandJS_Admin {
|
|
106 |
* Enqueue the scripts and styles
|
107 |
*/
|
108 |
public function admin_enqueue_scripts( $hook ) {
|
|
|
|
|
109 |
|
110 |
$screen = get_current_screen();
|
111 |
|
112 |
-
|
113 |
-
if ( $screen->post_type != 'custom-css-js' )
|
114 |
return false;
|
115 |
|
116 |
-
|
117 |
-
$
|
118 |
-
$cm = $a . '/codemirror';
|
119 |
-
$v = CCJ_VERSION;
|
120 |
-
|
121 |
-
wp_register_script( 'ccj_admin', $a . '/ccj_admin.js', array('jquery', 'jquery-ui-resizable'), $v, false );
|
122 |
-
wp_localize_script( 'ccj_admin', 'CCJ', $this->cm_localize() );
|
123 |
-
wp_enqueue_script( 'ccj_admin' );
|
124 |
-
wp_enqueue_style( 'ccj_admin', $a . '/ccj_admin.css', array(), $v );
|
125 |
-
|
126 |
-
|
127 |
-
// Only for the new/edit Code's page
|
128 |
-
if ( $hook == 'post-new.php' || $hook == 'post.php' ) {
|
129 |
-
wp_enqueue_style( 'jquery-ui', 'https://code.jquery.com/ui/1.12.0/themes/base/jquery-ui.css', array(), $v );
|
130 |
-
wp_enqueue_script( 'ccj_codemirror', $cm . '/codemirror-compressed.js', array( 'jquery' ), $v, false);
|
131 |
-
wp_enqueue_style( 'ccj_codemirror', $cm . '/codemirror-compressed.css', array(), $v );
|
132 |
-
wp_enqueue_script( 'ccj_admin_url_rules', $a . '/ccj_admin-url_rules.js', array('jquery'), $v, false );
|
133 |
-
wp_enqueue_script( 'ccj_scrollbars', $cm . '/addon/scroll/simplescrollbars.js', array('ccj_codemirror'), $v, false );
|
134 |
-
wp_enqueue_style( 'ccj_scrollbars', $cm . '/addon/scroll/simplescrollbars.css', array(), $v );
|
135 |
-
|
136 |
-
// Add the language modes
|
137 |
-
$cmm = $cm . '/mode/';
|
138 |
-
wp_enqueue_script('cm-xml', $cmm . 'xml/xml.js', array('ccj_codemirror'), $v, false);
|
139 |
-
wp_enqueue_script('cm-js', $cmm . 'javascript/javascript.js', array('ccj_codemirror'), $v, false);
|
140 |
-
wp_enqueue_script('cm-css', $cmm . 'css/css.js', array('ccj_codemirror'), $v, false);
|
141 |
-
wp_enqueue_script('cm-htmlmixed', $cmm . 'htmlmixed/htmlmixed.js', array('ccj_codemirror'), $v, false);
|
142 |
-
|
143 |
-
$cma = $cm . '/addon/';
|
144 |
-
wp_enqueue_script('cm-dialog', $cma . 'dialog.js', array('ccj_codemirror'), $v, false);
|
145 |
-
wp_enqueue_script('cm-search', $cma . 'search.js', array('ccj_codemirror'), $v, false);
|
146 |
-
wp_enqueue_script('cm-searchcursor', $cma . 'searchcursor.js',array('ccj_codemirror'), $v, false);
|
147 |
-
wp_enqueue_script('cm-jump-to-line', $cma . 'jump-to-line.js', array('ccj_codemirror'), $v, false);
|
148 |
-
wp_enqueue_style('cm-matchesonscrollbar', $cma . 'matchesonscrollbar.css', array(), $v );
|
149 |
-
wp_enqueue_style('cm-dialog', $cma . 'dialog.css', array(), $v );
|
150 |
-
wp_enqueue_style('cm-matchesonscrollbar', $cma . 'matchesonscrollbar.css', array(), $v );
|
151 |
-
|
152 |
-
|
153 |
-
}
|
154 |
-
}
|
155 |
-
|
156 |
|
157 |
-
|
158 |
-
* Send variables to the ccj_admin.js script
|
159 |
-
*/
|
160 |
-
public function cm_localize() {
|
161 |
|
162 |
-
$vars = array(
|
163 |
-
'scroll' => '1'
|
164 |
-
);
|
165 |
-
|
166 |
-
if ( ! function_exists( 'is_plugin_active' ) ) {
|
167 |
-
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
|
168 |
-
}
|
169 |
|
170 |
-
|
171 |
-
$
|
172 |
-
'types/wpcf.php',
|
173 |
-
'advanced-ads-code-highlighter/advanced-ads-code-highlighter.php',
|
174 |
-
'wp-custom-backend-css/wp-custom-backend-css.php',
|
175 |
-
'custom-css-whole-site-and-per-post/h5ab-custom-styling.php',
|
176 |
-
);
|
177 |
|
178 |
-
foreach( $conflicting_plugins as $_plugin ) {
|
179 |
-
if ( is_plugin_active( $_plugin ) ) {
|
180 |
-
$vars['scroll'] = '0';
|
181 |
-
}
|
182 |
-
}
|
183 |
|
184 |
-
return $vars;
|
185 |
}
|
186 |
|
187 |
public function add_meta_boxes() {
|
@@ -221,15 +130,15 @@ class CustomCSSandJS_Admin {
|
|
221 |
return false;
|
222 |
}
|
223 |
|
224 |
-
|
225 |
-
add_action( 'admin_head', array( $this, 'current_screen_post' ) );
|
226 |
-
}
|
227 |
|
228 |
-
if ( $current_screen->base == 'edit' ) {
|
229 |
add_action( 'admin_head', array( $this, 'current_screen_edit' ) );
|
230 |
}
|
231 |
|
232 |
-
|
|
|
|
|
233 |
}
|
234 |
|
235 |
|
@@ -240,20 +149,73 @@ class CustomCSSandJS_Admin {
|
|
240 |
function add_new_buttons() {
|
241 |
$current_screen = get_current_screen();
|
242 |
|
243 |
-
if (
|
244 |
return false;
|
245 |
}
|
246 |
?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
247 |
<div class="updated buttons">
|
248 |
<a href="post-new.php?post_type=custom-css-js&language=css" class="custom-btn custom-css-btn">Add CSS code</a>
|
249 |
<a href="post-new.php?post_type=custom-css-js&language=js" class="custom-btn custom-js-btn">Add JS code</a>
|
250 |
-
<a href="post-new.php?post_type=custom-css-js&language=html" class="custom-btn custom-js-btn">Add HTML code</a>
|
251 |
<!-- a href="post-new.php?post_type=custom-css-js&language=php" class="custom-btn custom-php-btn">Add PHP code</a -->
|
252 |
</div>
|
253 |
<?php
|
254 |
}
|
255 |
|
256 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
257 |
|
258 |
/**
|
259 |
* Add new columns in the `edit` screen
|
@@ -261,7 +223,6 @@ class CustomCSSandJS_Admin {
|
|
261 |
function manage_custom_posts_columns( $columns ) {
|
262 |
return array(
|
263 |
'cb' => '<input type="checkbox" />',
|
264 |
-
'active' => '<span class="ccj-dashicons dashicons dashicons-star-empty" title="Active"></span>',
|
265 |
'type' => 'Type',
|
266 |
'title' => 'Title',
|
267 |
'author' => 'Author',
|
@@ -282,16 +243,7 @@ class CustomCSSandJS_Admin {
|
|
282 |
}
|
283 |
|
284 |
if ( $column == 'modified' ) {
|
285 |
-
|
286 |
-
include( ABSPATH . WPINC . '/version.php' );
|
287 |
-
}
|
288 |
-
|
289 |
-
if ( version_compare( $wp_version, '4.6', '>=' ) ) {
|
290 |
-
$m_time = get_the_modified_time( 'G', $post_id );
|
291 |
-
} else {
|
292 |
-
$m_time = get_the_modified_time( 'G', false, $post_id );
|
293 |
-
}
|
294 |
-
|
295 |
$time_diff = time() - $m_time;
|
296 |
|
297 |
if ( $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) {
|
@@ -302,72 +254,6 @@ class CustomCSSandJS_Admin {
|
|
302 |
|
303 |
echo $h_time;
|
304 |
}
|
305 |
-
|
306 |
-
if ( $column == 'active' ) {
|
307 |
-
$url = wp_nonce_url( admin_url( 'admin-ajax.php?action=ccj_active_code&code_id=' . $post_id ), 'ccj-active-code' );
|
308 |
-
echo '<a href="' . esc_url( $url ) . '" title="'. __( 'Toggle active' ) . '">';
|
309 |
-
if ( $this->is_active( $post_id ) ) {
|
310 |
-
echo '<span class="dashicons dashicons-star-filled" title="The code is active. Click to inactivate it"></span>';
|
311 |
-
} else {
|
312 |
-
echo '<span class="dashicons dashicons-star-empty ccj_row" title="The code is inactive. Click to activate it"></span>';
|
313 |
-
}
|
314 |
-
echo '</a>';
|
315 |
-
|
316 |
-
}
|
317 |
-
}
|
318 |
-
|
319 |
-
/**
|
320 |
-
* Activate/deactivate a code
|
321 |
-
*
|
322 |
-
* @return void
|
323 |
-
*/
|
324 |
-
function wp_ajax_ccj_active_code() {
|
325 |
-
if ( ! isset( $_GET['code_id'] ) ) die();
|
326 |
-
|
327 |
-
if ( check_admin_referer( 'ccj-active-code' ) ) {
|
328 |
-
$code_id = absint( $_GET['code_id'] );
|
329 |
-
|
330 |
-
if ( 'custom-css-js' === get_post_type( $code_id ) ) {
|
331 |
-
$active = get_post_meta($code_id, '_active', true );
|
332 |
-
if ( $active === false || $active === '' ) {
|
333 |
-
$active = 'yes';
|
334 |
-
}
|
335 |
-
update_post_meta( $code_id, '_active', $active === 'yes' ? 'no' : 'yes' );
|
336 |
-
|
337 |
-
$this->build_search_tree();
|
338 |
-
}
|
339 |
-
}
|
340 |
-
|
341 |
-
wp_safe_redirect( wp_get_referer() ? remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'ids' ), wp_get_referer() ) : admin_url( 'edit.php?post_type=custom-css-js' ) );
|
342 |
-
die();
|
343 |
-
}
|
344 |
-
|
345 |
-
/**
|
346 |
-
* Check if a code is active
|
347 |
-
*
|
348 |
-
* @return bool
|
349 |
-
*/
|
350 |
-
function is_active( $post_id ) {
|
351 |
-
return get_post_meta( $post_id, '_active', true ) !== 'no';
|
352 |
-
}
|
353 |
-
|
354 |
-
/**
|
355 |
-
* Reformat the `edit` screen
|
356 |
-
*/
|
357 |
-
function current_screen_edit() {
|
358 |
-
?>
|
359 |
-
<script type="text/javascript">
|
360 |
-
/* <![CDATA[ */
|
361 |
-
jQuery(window).ready(function($){
|
362 |
-
var h1 = 'Custom Code ';
|
363 |
-
h1 += '<a href="post-new.php?post_type=custom-css-js&language=css" class="page-title-action">Add CSS Code</a>';
|
364 |
-
h1 += '<a href="post-new.php?post_type=custom-css-js&language=js" class="page-title-action">Add JS Code</a>';
|
365 |
-
h1 += '<a href="post-new.php?post_type=custom-css-js&language=html" class="page-title-action">Add HTML Code</a>';
|
366 |
-
$("#wpbody-content h1").html(h1);
|
367 |
-
});
|
368 |
-
|
369 |
-
</script>
|
370 |
-
<?php
|
371 |
}
|
372 |
|
373 |
|
@@ -376,8 +262,6 @@ class CustomCSSandJS_Admin {
|
|
376 |
* Reformat the `post` screen
|
377 |
*/
|
378 |
function current_screen_post() {
|
379 |
-
|
380 |
-
$this->remove_unallowed_metaboxes();
|
381 |
|
382 |
if ( isset( $_GET['post'] ) ) {
|
383 |
$action = 'Edit';
|
@@ -390,62 +274,22 @@ class CustomCSSandJS_Admin {
|
|
390 |
|
391 |
$title = $action . ' ' . strtoupper( $language ) . ' code';
|
392 |
|
393 |
-
if ( $action == 'Edit' ) {
|
394 |
-
$title .= ' <a href="post-new.php?post_type=custom-css-js&language=css" class="page-title-action">Add CSS Code</a> ';
|
395 |
-
$title .= '<a href="post-new.php?post_type=custom-css-js&language=js" class="page-title-action">Add JS Code</a>';
|
396 |
-
$title .= '<a href="post-new.php?post_type=custom-css-js&language=html" class="page-title-action">Add HTML Code</a>';
|
397 |
-
}
|
398 |
-
|
399 |
?>
|
400 |
<script type="text/javascript">
|
401 |
/* <![CDATA[ */
|
402 |
jQuery(window).ready(function($){
|
403 |
-
$("#wpbody-content h1").
|
404 |
$("#message.updated.notice").html('<p>Code updated</p>');
|
405 |
-
|
406 |
-
var from_top = -$("#normal-sortables").height();
|
407 |
-
if ( from_top != 0 ) {
|
408 |
-
$(".ccj_only_premium-first").css('margin-top', from_top.toString() + 'px' );
|
409 |
-
} else {
|
410 |
-
$(".ccj_only_premium-first").hide();
|
411 |
-
}
|
412 |
-
|
413 |
-
/*
|
414 |
-
$("#normal-sortables").mouseenter(function() {
|
415 |
-
$(".ccj_only_premium-first div").css('display', 'block');
|
416 |
-
}).mouseleave(function() {
|
417 |
-
$(".ccj_only_premium-first div").css('display', 'none');
|
418 |
-
});
|
419 |
-
*/
|
420 |
});
|
421 |
/* ]]> */
|
422 |
</script>
|
|
|
|
|
|
|
423 |
<?php
|
424 |
}
|
425 |
|
426 |
|
427 |
-
/**
|
428 |
-
* Remove unallowed metaboxes from custom-css-js edit page
|
429 |
-
*
|
430 |
-
* Use the custom-css-js-meta-boxes filter to add/remove allowed metaboxdes on the page
|
431 |
-
*/
|
432 |
-
function remove_unallowed_metaboxes() {
|
433 |
-
global $wp_meta_boxes;
|
434 |
-
|
435 |
-
$allowed = array( 'submitdiv', 'custom-code-options' );
|
436 |
-
|
437 |
-
$allowed = apply_filters( 'custom-css-js-meta-boxes', $allowed );
|
438 |
-
|
439 |
-
foreach( $wp_meta_boxes['custom-css-js']['side'] as $_priority => $_boxes ) {
|
440 |
-
foreach( $_boxes as $_key => $_value ) {
|
441 |
-
if ( ! in_array( $_key, $allowed ) ) {
|
442 |
-
unset( $wp_meta_boxes['custom-css-js']['side'][$_priority][$_key] );
|
443 |
-
}
|
444 |
-
}
|
445 |
-
}
|
446 |
-
}
|
447 |
-
|
448 |
-
|
449 |
|
450 |
/**
|
451 |
* Add the codemirror editor in the `post` screen
|
@@ -470,59 +314,26 @@ class CustomCSSandJS_Admin {
|
|
470 |
switch ( $language ) {
|
471 |
case 'js' :
|
472 |
if ( $new_post ) {
|
473 |
-
$post->post_content = '/*
|
474 |
-
|
475 |
-
If you are using the jQuery library, then don\'t forget to wrap your code inside jQuery.ready() as follows:
|
476 |
-
|
477 |
-
jQuery(document).ready(function( $ ){
|
478 |
-
// Your code in here
|
479 |
-
});
|
480 |
-
|
481 |
-
End of comment */ ' . PHP_EOL . PHP_EOL;
|
482 |
}
|
483 |
$code_mirror_mode = 'text/javascript';
|
484 |
$code_mirror_before = '<script type="text/javascript">';
|
485 |
$code_mirror_after = '</script>';
|
486 |
break;
|
487 |
-
case 'html' :
|
488 |
-
if ( $new_post ) {
|
489 |
-
$post->post_content = '<!-- Add HTML code to the header or the footer.
|
490 |
-
|
491 |
-
For example, you can use the following code for loading the jQuery library from Google CDN:
|
492 |
-
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
|
493 |
-
|
494 |
-
or the following one for loading the Bootstrap library from MaxCDN:
|
495 |
-
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
496 |
-
|
497 |
-
-- End of the comment --> ' . PHP_EOL . PHP_EOL;
|
498 |
-
}
|
499 |
-
$code_mirror_mode = 'html';
|
500 |
-
$code_mirror_before = '';
|
501 |
-
$code_mirror_after = '';
|
502 |
-
break;
|
503 |
-
|
504 |
case 'php' :
|
505 |
if ( $new_post ) {
|
506 |
$post->post_content = '/* The following will be executed as if it were written in functions.php. */' . PHP_EOL . PHP_EOL;
|
507 |
}
|
508 |
-
$code_mirror_mode = 'php';
|
509 |
$code_mirror_before = '<?php';
|
510 |
$code_mirror_after = '?>';
|
511 |
|
512 |
break;
|
513 |
default :
|
514 |
if ( $new_post ) {
|
515 |
-
$post->post_content
|
516 |
-
|
517 |
-
|
518 |
-
.example {
|
519 |
-
color: red;
|
520 |
-
}
|
521 |
-
|
522 |
-
For brushing up on your CSS knowledge, check out http://www.w3schools.com/css/css_syntax.asp
|
523 |
-
|
524 |
-
End of comment */ ' . PHP_EOL . PHP_EOL;
|
525 |
-
|
526 |
}
|
527 |
$code_mirror_mode = 'text/css';
|
528 |
$code_mirror_before = '<style type="text/css">';
|
@@ -531,15 +342,65 @@ End of comment */ ' . PHP_EOL . PHP_EOL;
|
|
531 |
}
|
532 |
|
533 |
?>
|
534 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
535 |
|
536 |
-
|
537 |
-
|
538 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
539 |
|
540 |
-
<
|
|
|
|
|
541 |
</form>
|
542 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
543 |
|
544 |
}
|
545 |
|
@@ -551,253 +412,99 @@ End of comment */ ' . PHP_EOL . PHP_EOL;
|
|
551 |
function custom_code_options_meta_box_callback( $post ) {
|
552 |
|
553 |
$options = $this->get_options( $post->ID );
|
554 |
-
if ( ! isset($options['preprocessor'] ) )
|
555 |
-
$options['preprocessor'] = 'none';
|
556 |
-
|
557 |
|
558 |
if ( isset( $_GET['language'] ) ) {
|
559 |
$options['language'] = $_GET['language'];
|
560 |
}
|
561 |
|
562 |
-
$
|
563 |
-
|
564 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
565 |
}
|
566 |
|
|
|
|
|
|
|
567 |
|
568 |
-
|
|
|
|
|
569 |
|
|
|
570 |
?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
571 |
<div class="options_meta_box">
|
572 |
-
|
|
|
|
|
|
|
|
|
573 |
|
574 |
-
$output = '';
|
575 |
-
|
576 |
-
foreach( $meta as $_key => $a ) {
|
577 |
-
$close_div = false;
|
578 |
-
|
579 |
-
if ( ($_key == 'preprocessor' && $options['language'] == 'css') ||
|
580 |
-
($_key == 'linking' && $options['language'] == 'html') ||
|
581 |
-
$_key == 'priority' ||
|
582 |
-
$_key == 'minify' ) {
|
583 |
-
$close_div = true;
|
584 |
-
$output .= '<div class="ccj_opaque">';
|
585 |
-
}
|
586 |
|
587 |
-
|
588 |
-
|
589 |
-
|
590 |
-
|
|
|
591 |
|
592 |
-
$output .= '<h3>' . $a['title'] . '</h3>' . PHP_EOL;
|
593 |
|
594 |
-
|
|
|
|
|
|
|
595 |
|
596 |
-
|
597 |
-
|
|
|
|
|
|
|
|
|
598 |
}
|
599 |
|
|
|
600 |
}
|
601 |
|
602 |
-
echo $output;
|
603 |
-
|
604 |
?>
|
|
|
|
|
|
|
605 |
|
606 |
-
<input type="hidden" name="custom_code_language" value="<?php echo $options['language']; ?>" />
|
607 |
-
|
608 |
-
<div style="clear: both;"></div>
|
609 |
|
610 |
-
</div>
|
611 |
|
612 |
-
<
|
613 |
-
|
614 |
-
|
615 |
-
|
616 |
</div>
|
617 |
|
|
|
618 |
|
619 |
-
|
620 |
-
}
|
621 |
-
|
622 |
-
|
623 |
-
/**
|
624 |
-
* Get an array with all the information for building the code's options
|
625 |
-
*/
|
626 |
-
function get_options_meta() {
|
627 |
-
$options = array(
|
628 |
-
'linking' => array(
|
629 |
-
'title' => 'Linking type',
|
630 |
-
'type' => 'radio',
|
631 |
-
'default' => 'internal',
|
632 |
-
'values' => array(
|
633 |
-
'external' => array(
|
634 |
-
'title' => 'External File',
|
635 |
-
'dashicon' => 'media-code',
|
636 |
-
),
|
637 |
-
'internal' => array(
|
638 |
-
'title' => 'Internal',
|
639 |
-
'dashicon' => 'editor-alignleft',
|
640 |
-
),
|
641 |
-
),
|
642 |
-
),
|
643 |
-
'type' => array(
|
644 |
-
'title' => 'Where on page',
|
645 |
-
'type' => 'radio',
|
646 |
-
'default' => 'header',
|
647 |
-
'values' => array(
|
648 |
-
'header' => array(
|
649 |
-
'title' => 'Header',
|
650 |
-
'dashicon' => 'arrow-up-alt2',
|
651 |
-
),
|
652 |
-
'footer' => array(
|
653 |
-
'title' => 'Footer',
|
654 |
-
'dashicon' => 'arrow-down-alt2',
|
655 |
-
),
|
656 |
-
),
|
657 |
-
),
|
658 |
-
'side' => array(
|
659 |
-
'title' => 'Where in site',
|
660 |
-
'type' => 'radio',
|
661 |
-
'default' => 'frontend',
|
662 |
-
'values' => array(
|
663 |
-
'frontend' => array(
|
664 |
-
'title' => 'In Frontend',
|
665 |
-
'dashicon' => 'tagcloud',
|
666 |
-
),
|
667 |
-
'admin' => array(
|
668 |
-
'title' => 'In Admin',
|
669 |
-
'dashicon' => 'id',
|
670 |
-
),
|
671 |
-
),
|
672 |
-
),
|
673 |
-
'preprocessor' => array(
|
674 |
-
'title' => 'CSS Preprocessor',
|
675 |
-
'type' => 'radio',
|
676 |
-
'default' => 'none',
|
677 |
-
'values' => array(
|
678 |
-
'none' => array(
|
679 |
-
'title' => 'None',
|
680 |
-
),
|
681 |
-
'less' => array(
|
682 |
-
'title' => 'Less',
|
683 |
-
),
|
684 |
-
'sass' => array(
|
685 |
-
'title' => 'SASS (only SCSS syntax)',
|
686 |
-
),
|
687 |
-
),
|
688 |
-
'disabled' => true,
|
689 |
-
),
|
690 |
-
'minify' => array(
|
691 |
-
'title' => 'Minify the code',
|
692 |
-
'type' => 'checkbox',
|
693 |
-
'default' => false,
|
694 |
-
'dashicon' => 'editor-contract',
|
695 |
-
'disabled' => true,
|
696 |
-
),
|
697 |
-
'priority' => array(
|
698 |
-
'title' => 'Priority',
|
699 |
-
'type' => 'select',
|
700 |
-
'default' => 5,
|
701 |
-
'dashicon' => 'sort',
|
702 |
-
'values' => array(
|
703 |
-
1 => '1 (highest)',
|
704 |
-
2 => '2',
|
705 |
-
3 => '3',
|
706 |
-
4 => '4',
|
707 |
-
5 => '5',
|
708 |
-
6 => '6',
|
709 |
-
7 => '7',
|
710 |
-
8 => '8',
|
711 |
-
9 => '9',
|
712 |
-
10 => '10 (lowest)',
|
713 |
-
),
|
714 |
-
'disabled' => true,
|
715 |
-
),
|
716 |
-
);
|
717 |
-
|
718 |
-
return $options;
|
719 |
-
}
|
720 |
-
|
721 |
-
|
722 |
-
/**
|
723 |
-
* Get an array with all the information for building the code's options
|
724 |
-
*/
|
725 |
-
function get_options_meta_html() {
|
726 |
-
$options = array(
|
727 |
-
'type' => array(
|
728 |
-
'title' => 'Where on page',
|
729 |
-
'type' => 'radio',
|
730 |
-
'default' => 'header',
|
731 |
-
'values' => array(
|
732 |
-
'header' => array(
|
733 |
-
'title' => 'Header',
|
734 |
-
'dashicon' => 'arrow-up-alt2',
|
735 |
-
),
|
736 |
-
'footer' => array(
|
737 |
-
'title' => 'Footer',
|
738 |
-
'dashicon' => 'arrow-down-alt2',
|
739 |
-
),
|
740 |
-
),
|
741 |
-
),
|
742 |
-
'side' => array(
|
743 |
-
'title' => 'Where in site',
|
744 |
-
'type' => 'radio',
|
745 |
-
'default' => 'frontend',
|
746 |
-
'values' => array(
|
747 |
-
'frontend' => array(
|
748 |
-
'title' => 'In Frontend',
|
749 |
-
'dashicon' => 'tagcloud',
|
750 |
-
),
|
751 |
-
'admin' => array(
|
752 |
-
'title' => 'In Admin',
|
753 |
-
'dashicon' => 'id',
|
754 |
-
),
|
755 |
-
),
|
756 |
-
),
|
757 |
-
'linking' => array(
|
758 |
-
'title' => 'On which device',
|
759 |
-
'type' => 'radio',
|
760 |
-
'default' => 'both',
|
761 |
-
'dashicon' => '',
|
762 |
-
'values' => array(
|
763 |
-
'desktop' => array(
|
764 |
-
'title' => 'Desktop',
|
765 |
-
'dashicon' => 'desktop',
|
766 |
-
),
|
767 |
-
'mobile' => array(
|
768 |
-
'title' => 'Mobile',
|
769 |
-
'dashicon' => 'smartphone',
|
770 |
-
),
|
771 |
-
'both' => array(
|
772 |
-
'title' => 'Both',
|
773 |
-
'dashicon' => 'tablet',
|
774 |
-
),
|
775 |
-
),
|
776 |
-
'disabled' => true,
|
777 |
-
),
|
778 |
-
'priority' => array(
|
779 |
-
'title' => 'Priority',
|
780 |
-
'type' => 'select',
|
781 |
-
'default' => 5,
|
782 |
-
'dashicon' => 'sort',
|
783 |
-
'values' => array(
|
784 |
-
1 => '1 (highest)',
|
785 |
-
2 => '2',
|
786 |
-
3 => '3',
|
787 |
-
4 => '4',
|
788 |
-
5 => '5',
|
789 |
-
6 => '6',
|
790 |
-
7 => '7',
|
791 |
-
8 => '8',
|
792 |
-
9 => '9',
|
793 |
-
10 => '10 (lowest)',
|
794 |
-
),
|
795 |
-
'disabled' => true,
|
796 |
-
),
|
797 |
|
798 |
-
);
|
799 |
|
800 |
-
|
801 |
}
|
802 |
|
803 |
|
@@ -806,6 +513,7 @@ End of comment */ ' . PHP_EOL . PHP_EOL;
|
|
806 |
*/
|
807 |
function options_save_meta_box_data( $post_id ) {
|
808 |
|
|
|
809 |
// The usual checks
|
810 |
if ( ! isset( $_POST['custom-css-js_meta_box_nonce'] ) ) {
|
811 |
return;
|
@@ -832,27 +540,12 @@ End of comment */ ' . PHP_EOL . PHP_EOL;
|
|
832 |
'language' => 'css',
|
833 |
);
|
834 |
|
835 |
-
if ( $_POST['custom_code_language'] == 'html' ) {
|
836 |
-
$defaults = array(
|
837 |
-
'type' => 'header',
|
838 |
-
'linking' => 'both',
|
839 |
-
'side' => 'frontend',
|
840 |
-
'language' => 'html',
|
841 |
-
'priority' => 5,
|
842 |
-
);
|
843 |
-
}
|
844 |
-
|
845 |
foreach( $defaults as $_field => $_default ) {
|
846 |
$options[ $_field ] = isset( $_POST['custom_code_'.$_field] ) ? $_POST['custom_code_'.$_field] : $_default;
|
847 |
}
|
848 |
|
849 |
update_post_meta( $post_id, 'options', $options );
|
850 |
|
851 |
-
if ( $options['language'] == 'html' ) {
|
852 |
-
$this->build_search_tree();
|
853 |
-
return;
|
854 |
-
}
|
855 |
-
|
856 |
|
857 |
// Save the Custom Code in a file in `wp-content/uploads/custom-css-js`
|
858 |
if ( $options['linking'] == 'internal' ) {
|
@@ -864,10 +557,8 @@ End of comment */ ' . PHP_EOL . PHP_EOL;
|
|
864 |
$after = '</style>' . PHP_EOL . $after;
|
865 |
}
|
866 |
if ( $options['language'] == 'js' ) {
|
867 |
-
if ( ! preg_match( '/<script\b[^>]*>([\s\S]*?)<\/script>/im', $_POST['content'] ) ) {
|
868 |
$before .= '<script type="text/javascript">' . PHP_EOL;
|
869 |
$after = '</script>' . PHP_EOL . $after;
|
870 |
-
}
|
871 |
}
|
872 |
}
|
873 |
|
@@ -881,93 +572,34 @@ End of comment */ ' . PHP_EOL . PHP_EOL;
|
|
881 |
$file_name = $post_id . '.' . $options['language'];
|
882 |
$file_content = $before . stripslashes($_POST['content']) . $after;
|
883 |
@file_put_contents( $this->main->upload_dir . '/' . $file_name , $file_content );
|
884 |
-
}
|
885 |
-
|
886 |
-
|
887 |
-
$this->build_search_tree();
|
888 |
-
}
|
889 |
-
|
890 |
-
/**
|
891 |
-
* Create the custom-css-js dir in uploads directory
|
892 |
-
*
|
893 |
-
* Show a message if the directory is not writable
|
894 |
-
*
|
895 |
-
* Create an empty index.php file inside
|
896 |
-
*/
|
897 |
-
function create_uploads_directory() {
|
898 |
-
$current_screen = get_current_screen();
|
899 |
-
|
900 |
-
// Check if we are editing a custom-css-js post
|
901 |
-
if ( $current_screen->base != 'post' || $current_screen->post_type != 'custom-css-js' ) {
|
902 |
-
return false;
|
903 |
-
}
|
904 |
-
|
905 |
-
$dir = $this->main->upload_dir;
|
906 |
-
|
907 |
-
// Create the dir if it doesn't exist
|
908 |
-
if ( ! file_exists( $dir ) ) {
|
909 |
-
wp_mkdir_p( $dir );
|
910 |
}
|
911 |
|
912 |
-
// Show a message if it couldn't create the dir
|
913 |
-
if ( ! file_exists( $dir ) ) : ?>
|
914 |
-
<div class="notice notice-error is-dismissible">
|
915 |
-
<p>The <b>custom-css-js</b> directory could not be created</p>
|
916 |
-
<p>Please run the following commands in order to make the directory: <br /><strong>mkdir <?php echo $dir; ?>; </strong><br /><strong>chmod 777 <?php echo $dir; ?>;</strong></p>
|
917 |
-
</div>
|
918 |
-
<?php return; endif;
|
919 |
-
|
920 |
-
|
921 |
-
// Show a message if the dir is not writable
|
922 |
-
if ( ! wp_is_writable( $dir ) ) : ?>
|
923 |
-
<div class="notice notice-error is-dismissible">
|
924 |
-
<p>The <b><?php echo $dir; ?></b> directory is not writable, therefore the CSS and JS files cannot be saved.</p>
|
925 |
-
<p>Please run the following command to make the directory writable:<br /><strong>chmod 777 <?php echo $dir; ?> </strong></p>
|
926 |
-
</div>
|
927 |
-
<?php return; endif;
|
928 |
-
|
929 |
|
930 |
-
|
931 |
-
if ( ! file_exists( $dir. '/index.php' ) ) {
|
932 |
-
$content = '<?php' . PHP_EOL . '// Silence is golden.';
|
933 |
-
@file_put_contents( $dir. '/index.php', $content );
|
934 |
-
}
|
935 |
}
|
936 |
|
937 |
|
938 |
/**
|
939 |
* Build a tree where you can quickly find the needed custom-css-js posts
|
940 |
-
*
|
941 |
-
* @return void
|
942 |
*/
|
943 |
private function build_search_tree() {
|
944 |
|
945 |
-
|
946 |
-
|
|
|
|
|
|
|
947 |
|
948 |
$tree = array();
|
949 |
foreach ( $posts as $_post ) {
|
950 |
-
if ( ! $this->is_active( $_post->ID ) ) {
|
951 |
-
continue;
|
952 |
-
}
|
953 |
-
|
954 |
$options = $this->get_options( $_post->ID );
|
955 |
|
956 |
-
// Get the branch name, example: frontend-css-header-external
|
957 |
$tree_branch = $options['side'] . '-' .$options['language'] . '-' . $options['type'] . '-' . $options['linking'];
|
958 |
|
959 |
-
$
|
960 |
-
|
961 |
-
if ( $options['linking'] == 'external' ) {
|
962 |
-
$filename .= '?v=' . rand(1, 10000);
|
963 |
-
}
|
964 |
-
|
965 |
-
// Add the code file to the tree branch
|
966 |
-
$tree[ $tree_branch ][] = $filename;
|
967 |
|
968 |
}
|
969 |
|
970 |
-
// Save the tree in the database
|
971 |
update_option( 'custom-css-js-tree', $tree );
|
972 |
}
|
973 |
|
@@ -992,61 +624,6 @@ End of comment */ ' . PHP_EOL . PHP_EOL;
|
|
992 |
return str_replace( 'QTags.addButton', '// QTags.addButton', $html );
|
993 |
}
|
994 |
|
995 |
-
/**
|
996 |
-
* Render the checkboxes, radios, selects and inputs
|
997 |
-
*/
|
998 |
-
function render_input( $_key, $a, $options ) {
|
999 |
-
$name = 'custom_code_' . $_key;
|
1000 |
-
$output = '';
|
1001 |
-
|
1002 |
-
// Show radio type options
|
1003 |
-
if ( $a['type'] === 'radio' ) {
|
1004 |
-
$output .= '<div class="radio-group">' . PHP_EOL;
|
1005 |
-
foreach( $a['values'] as $__key => $__value ) {
|
1006 |
-
$selected = '';
|
1007 |
-
$id = $name . '-' . $__key;
|
1008 |
-
$dashicons = isset($__value['dashicon'] ) ? 'dashicons-before dashicons-' . $__value['dashicon'] : '';
|
1009 |
-
if ( isset( $a['disabled'] ) && $a['disabled'] ) {
|
1010 |
-
$selected = ' disabled="disabled"';
|
1011 |
-
}
|
1012 |
-
$selected .= ( $__key == $options[$_key] ) ? ' checked="checked" ' : '';
|
1013 |
-
$output .= '<input type="radio" '. $selected.'value="'.$__key.'" name="'.$name.'" id="'.$id.'">' . PHP_EOL;
|
1014 |
-
$output .= '<label class="'.$dashicons.'" for="'.$id.'"> '.$__value['title'].'</label><br />' . PHP_EOL;
|
1015 |
-
}
|
1016 |
-
$output .= '</div>' . PHP_EOL;
|
1017 |
-
}
|
1018 |
-
|
1019 |
-
// Show checkbox type options
|
1020 |
-
if ( $a['type'] == 'checkbox' ) {
|
1021 |
-
$dashicons = isset($a['dashicon'] ) ? 'dashicons-before dashicons-' . $a['dashicon'] : '';
|
1022 |
-
$selected = ( isset($options[$_key]) && $options[$_key] == '1') ? ' checked="checked" ' : '';
|
1023 |
-
if ( isset( $a['disabled'] ) && $a['disabled'] ) {
|
1024 |
-
$selected .= ' disabled="disabled"';
|
1025 |
-
}
|
1026 |
-
$output .= '<div class="radio-group">' . PHP_EOL;
|
1027 |
-
$output .= '<input type="checkbox" '.$selected.' value="1" name="'.$name.'" id="'.$name.'">' . PHP_EOL;
|
1028 |
-
$output .= '<label class="'.$dashicons.'" for="'.$name.'"> '.$a['title'].'</label>';
|
1029 |
-
$output .= '</div>' . PHP_EOL;
|
1030 |
-
}
|
1031 |
-
|
1032 |
-
|
1033 |
-
// Show select type options
|
1034 |
-
if ( $a['type'] == 'select' ) {
|
1035 |
-
$output .= '<div class="radio-group">' . PHP_EOL;
|
1036 |
-
$output .= '<select name="'.$name.'" id="'.$name.'">' . PHP_EOL;
|
1037 |
-
foreach( $a['values'] as $__key => $__value ) {
|
1038 |
-
$selected = ( isset($options[$_key]) && $options[$_key] == $__key) ? ' selected="selected"' : '';
|
1039 |
-
$output .= '<option value="'.$__key.'"'.$selected.'>' . $__value . '</option>' . PHP_EOL;
|
1040 |
-
}
|
1041 |
-
$output .= '</select>' . PHP_EOL;
|
1042 |
-
$output .= '</div>' . PHP_EOL;
|
1043 |
-
}
|
1044 |
-
|
1045 |
-
|
1046 |
-
return $output;
|
1047 |
-
|
1048 |
-
}
|
1049 |
-
|
1050 |
|
1051 |
}
|
1052 |
|
38 |
* Constructor
|
39 |
*/
|
40 |
public function __construct() {
|
41 |
+
add_action( 'admin_menu', array( $this, 'admin_menu' ) );
|
42 |
+
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
|
43 |
+
add_action( 'current_screen', array( $this, 'current_screen' ) );
|
44 |
+
add_action( 'admin_notices', array( $this, 'add_new_buttons' ) );
|
45 |
+
add_filter( 'manage_custom-css-js_posts_columns', array( $this, 'manage_custom_posts_columns' ) );
|
46 |
+
add_action( 'manage_custom-css-js_posts_custom_column', array( $this, 'manage_posts_columns' ), 10, 2 );
|
47 |
+
add_action( 'edit_form_after_title', array( $this, 'codemirror_editor' ) );
|
48 |
+
add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
|
49 |
+
add_action( 'save_post', array( $this, 'options_save_meta_box_data' ) );
|
50 |
+
add_action( 'trashed_post', array( $this, 'trash_post') );
|
51 |
+
add_action( 'untrashed_post', array( $this, 'trash_post') );
|
52 |
+
add_action( 'wp_loaded', array( $this, 'compatibility_shortcoder' ) );
|
53 |
|
54 |
$this->main = CustomCSSandJS();
|
55 |
}
|
56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
/**
|
58 |
* Add submenu pages
|
59 |
*/
|
61 |
$menu_slug = 'edit.php?post_type=custom-css-js';
|
62 |
$submenu_slug = 'post-new.php?post_type=custom-css-js';
|
63 |
|
64 |
+
add_submenu_page( $menu_slug, __('Add Custom CSS'), __('Add Custom CSS'), 'manage_options', $submenu_slug .'&language=css');
|
|
|
65 |
|
66 |
+
add_submenu_page( $menu_slug, __('Add Custom JS'), __('Add Custom JS'), 'manage_options', $submenu_slug . '&language=js');
|
|
|
|
|
|
|
|
|
67 |
|
68 |
remove_submenu_page( $menu_slug, $submenu_slug);
|
69 |
}
|
73 |
* Enqueue the scripts and styles
|
74 |
*/
|
75 |
public function admin_enqueue_scripts( $hook ) {
|
76 |
+
if ( $hook != 'post-new.php' && $hook != 'post.php' )
|
77 |
+
return false;
|
78 |
|
79 |
$screen = get_current_screen();
|
80 |
|
81 |
+
if ( $screen->post_type != 'custom-css-js' )
|
|
|
82 |
return false;
|
83 |
|
84 |
+
$cm = plugins_url( '/', $this->main->plugin_file ). 'assets/codemirror/';
|
85 |
+
$version = $this->main->version;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
|
87 |
+
wp_enqueue_script( 'codemirror', $cm . 'codemirror-compressed.js', array('jquery'), $version, false );
|
|
|
|
|
|
|
88 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
|
90 |
+
wp_enqueue_style( 'codemirror', $cm . 'codemirror-compressed.css' , array(), $version );
|
91 |
+
//wp_enqueue_style( 'codemirror_theme', $cm . 'theme/3024-night.css' , array(), $version );
|
|
|
|
|
|
|
|
|
|
|
92 |
|
|
|
|
|
|
|
|
|
|
|
93 |
|
|
|
94 |
}
|
95 |
|
96 |
public function add_meta_boxes() {
|
130 |
return false;
|
131 |
}
|
132 |
|
133 |
+
wp_deregister_script( 'autosave' );
|
|
|
|
|
134 |
|
135 |
+
if ( $current_screen->base == 'edit' ) {
|
136 |
add_action( 'admin_head', array( $this, 'current_screen_edit' ) );
|
137 |
}
|
138 |
|
139 |
+
if ( $current_screen->base == 'post' ) {
|
140 |
+
add_action( 'admin_head', array( $this, 'current_screen_post' ) );
|
141 |
+
}
|
142 |
}
|
143 |
|
144 |
|
149 |
function add_new_buttons() {
|
150 |
$current_screen = get_current_screen();
|
151 |
|
152 |
+
if ( $current_screen->base != 'edit' || $current_screen->post_type != 'custom-css-js' ) {
|
153 |
return false;
|
154 |
}
|
155 |
?>
|
156 |
+
<style type="text/css">
|
157 |
+
.updated.buttons {
|
158 |
+
border: none;
|
159 |
+
background-color: transparent;
|
160 |
+
box-shadow: none;
|
161 |
+
padding: 0;
|
162 |
+
margin: 15px 0 15px !important;
|
163 |
+
}
|
164 |
+
.custom-btn {
|
165 |
+
background: #0c73b8;
|
166 |
+
border-radius: 2px;
|
167 |
+
color: #ffffff;
|
168 |
+
font-size: 17px;
|
169 |
+
padding: 10px 20px 10px 20px !important;
|
170 |
+
text-decoration: none;
|
171 |
+
}
|
172 |
+
.custom-btn:hover {
|
173 |
+
color: #fff;
|
174 |
+
background: #2eaadd;
|
175 |
+
text-decoration: none;
|
176 |
+
}
|
177 |
+
.custom-js-btn { background: #e4a228; }
|
178 |
+
.custom-js-btn:hover { background: #eebf31; }
|
179 |
+
.custom-php-btn { background: #e45126; }
|
180 |
+
.custom-php-btn:hover { background: #f6652c; }
|
181 |
+
</style>
|
182 |
<div class="updated buttons">
|
183 |
<a href="post-new.php?post_type=custom-css-js&language=css" class="custom-btn custom-css-btn">Add CSS code</a>
|
184 |
<a href="post-new.php?post_type=custom-css-js&language=js" class="custom-btn custom-js-btn">Add JS code</a>
|
|
|
185 |
<!-- a href="post-new.php?post_type=custom-css-js&language=php" class="custom-btn custom-php-btn">Add PHP code</a -->
|
186 |
</div>
|
187 |
<?php
|
188 |
}
|
189 |
|
190 |
|
191 |
+
/**
|
192 |
+
* Reformat the `edit` screen
|
193 |
+
*/
|
194 |
+
function current_screen_edit() {
|
195 |
+
?>
|
196 |
+
<style type="text/css">
|
197 |
+
h1 .page-title-action { display: none; }
|
198 |
+
.inline.hide-if-no-js{ display: none; }
|
199 |
+
.view-switch { display: none; }
|
200 |
+
#modified { width: 140px; }
|
201 |
+
#type.manage-column { width: 50px; }
|
202 |
+
.language {
|
203 |
+
background: #0c73b8;
|
204 |
+
border-radius: 2px;
|
205 |
+
color: #ffffff;
|
206 |
+
font-size: 12px;
|
207 |
+
padding: 5px 10px !important;
|
208 |
+
text-decoration: none;
|
209 |
+
}
|
210 |
+
.language-js { background: #e4a228; }
|
211 |
+
.language-php { background: #e45126; }
|
212 |
+
.type.column-type, .check-column { vertical-align: middle !important; }
|
213 |
+
|
214 |
+
</style>
|
215 |
+
<?php
|
216 |
+
}
|
217 |
+
|
218 |
+
|
219 |
|
220 |
/**
|
221 |
* Add new columns in the `edit` screen
|
223 |
function manage_custom_posts_columns( $columns ) {
|
224 |
return array(
|
225 |
'cb' => '<input type="checkbox" />',
|
|
|
226 |
'type' => 'Type',
|
227 |
'title' => 'Title',
|
228 |
'author' => 'Author',
|
243 |
}
|
244 |
|
245 |
if ( $column == 'modified' ) {
|
246 |
+
$m_time = get_the_modified_time( 'G', true, get_post( $post_id ) );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
247 |
$time_diff = time() - $m_time;
|
248 |
|
249 |
if ( $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) {
|
254 |
|
255 |
echo $h_time;
|
256 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
257 |
}
|
258 |
|
259 |
|
262 |
* Reformat the `post` screen
|
263 |
*/
|
264 |
function current_screen_post() {
|
|
|
|
|
265 |
|
266 |
if ( isset( $_GET['post'] ) ) {
|
267 |
$action = 'Edit';
|
274 |
|
275 |
$title = $action . ' ' . strtoupper( $language ) . ' code';
|
276 |
|
|
|
|
|
|
|
|
|
|
|
|
|
277 |
?>
|
278 |
<script type="text/javascript">
|
279 |
/* <![CDATA[ */
|
280 |
jQuery(window).ready(function($){
|
281 |
+
$("#wpbody-content h1").text('<?php echo $title; ?>');
|
282 |
$("#message.updated.notice").html('<p>Code updated</p>');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
283 |
});
|
284 |
/* ]]> */
|
285 |
</script>
|
286 |
+
<style type="text/css">
|
287 |
+
.update.notice a { display: none; }
|
288 |
+
</style>
|
289 |
<?php
|
290 |
}
|
291 |
|
292 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
293 |
|
294 |
/**
|
295 |
* Add the codemirror editor in the `post` screen
|
314 |
switch ( $language ) {
|
315 |
case 'js' :
|
316 |
if ( $new_post ) {
|
317 |
+
$post->post_content = '/* Your code goes here */ ' . PHP_EOL . PHP_EOL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
318 |
}
|
319 |
$code_mirror_mode = 'text/javascript';
|
320 |
$code_mirror_before = '<script type="text/javascript">';
|
321 |
$code_mirror_after = '</script>';
|
322 |
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
323 |
case 'php' :
|
324 |
if ( $new_post ) {
|
325 |
$post->post_content = '/* The following will be executed as if it were written in functions.php. */' . PHP_EOL . PHP_EOL;
|
326 |
}
|
327 |
+
$code_mirror_mode = 'text/php';
|
328 |
$code_mirror_before = '<?php';
|
329 |
$code_mirror_after = '?>';
|
330 |
|
331 |
break;
|
332 |
default :
|
333 |
if ( $new_post ) {
|
334 |
+
$post->post_content .= '.example {' . PHP_EOL;
|
335 |
+
$post->post_content .= "\t" . 'color: #eee;' . PHP_EOL;
|
336 |
+
$post->post_content .= '}' . PHP_EOL . PHP_EOL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
337 |
}
|
338 |
$code_mirror_mode = 'text/css';
|
339 |
$code_mirror_before = '<style type="text/css">';
|
342 |
}
|
343 |
|
344 |
?>
|
345 |
+
<style type="text/css">
|
346 |
+
.page-title-action { display: none; }
|
347 |
+
#minor-publishing { display: none; }
|
348 |
+
#post-body #normal-sortables { min-height: 0px; }
|
349 |
+
.CodeMirror {
|
350 |
+
height: 384px;
|
351 |
+
margin-top: 0px;
|
352 |
+
border: 1px solid #ddd;
|
353 |
+
border-bottom: none;
|
354 |
+
border-top: none;
|
355 |
+
}
|
356 |
+
.CodeMirror pre { padding-left: 7px; line-height: 1.25; }
|
357 |
+
|
358 |
+
.CodeMirrorBefore {
|
359 |
+
margin-top: 15px;
|
360 |
+
border: 1px solid #ddd;
|
361 |
+
border-bottom: none;
|
362 |
+
background-color: #f7f7f7;
|
363 |
+
}
|
364 |
+
.CodeMirrorBefore div {
|
365 |
+
color: #8F8F8F;
|
366 |
+
margin-left: 29px;
|
367 |
+
border-left: 1px solid #ddd;
|
368 |
+
padding: 3px 8px;
|
369 |
+
background-color: #fff;
|
370 |
+
}
|
371 |
|
372 |
+
.CodeMirrorAfter {
|
373 |
+
border: 1px solid #ddd;
|
374 |
+
border-top: none;
|
375 |
+
background-color: #f7f7f7;
|
376 |
+
}
|
377 |
+
.CodeMirrorAfter div {
|
378 |
+
color: #8F8F8F;
|
379 |
+
margin-left: 29px;
|
380 |
+
border-left: 1px solid #ddd;
|
381 |
+
padding: 3px 8px;
|
382 |
+
background-color: #fff;
|
383 |
+
}
|
384 |
+
.cm-s-default .cm-atom { color: #549d18; }
|
385 |
+
.cm-s-default .cm-property { color: #b62625; }
|
386 |
+
.cm-s-default .cm-qualifier, .cm-s-default .cm-tag { color: #4731E4; }
|
387 |
+
</style>
|
388 |
+
<form style="position: relative; margin-top: .5em;">
|
389 |
|
390 |
+
<div class="CodeMirrorBefore"><div><?php echo htmlentities( $code_mirror_before );?></div></div>
|
391 |
+
<textarea id="custom-code" name="content"><?php echo $post->post_content; ?></textarea>
|
392 |
+
<div class="CodeMirrorAfter"><div><?php echo htmlentities( $code_mirror_after );?></div></div>
|
393 |
</form>
|
394 |
+
<script>
|
395 |
+
window.onload = function() {
|
396 |
+
var editor = CodeMirror.fromTextArea(document.getElementById("custom-code"), {
|
397 |
+
lineNumbers: true,
|
398 |
+
mode: "<?php echo $code_mirror_mode; ?>",
|
399 |
+
matchBrackets: true
|
400 |
+
});
|
401 |
+
}
|
402 |
+
</script>
|
403 |
+
<?php
|
404 |
|
405 |
}
|
406 |
|
412 |
function custom_code_options_meta_box_callback( $post ) {
|
413 |
|
414 |
$options = $this->get_options( $post->ID );
|
|
|
|
|
|
|
415 |
|
416 |
if ( isset( $_GET['language'] ) ) {
|
417 |
$options['language'] = $_GET['language'];
|
418 |
}
|
419 |
|
420 |
+
$selected = array(
|
421 |
+
'header' => '',
|
422 |
+
'footer' => '',
|
423 |
+
'internal' => '',
|
424 |
+
'external' => '',
|
425 |
+
'priority' => 5,
|
426 |
+
'frontend' => '',
|
427 |
+
'admin' => '',
|
428 |
+
);
|
429 |
+
|
430 |
+
if ( isset( $options['priority'] ) ) {
|
431 |
+
$selected['priority'] = $options['priority'];
|
432 |
+
}
|
433 |
+
|
434 |
+
if ( isset( $options['type'] ) ) {
|
435 |
+
$selected[ $options['type'] ] = ' checked="checked"';
|
436 |
}
|
437 |
|
438 |
+
if ( isset( $options['linking'] ) ) {
|
439 |
+
$selected[ $options['linking'] ] = ' checked="checked"';
|
440 |
+
}
|
441 |
|
442 |
+
if ( isset( $options['side'] ) ) {
|
443 |
+
$selected[ $options['side'] ] = ' checked="checked"';
|
444 |
+
}
|
445 |
|
446 |
+
wp_nonce_field( 'options_save_meta_box_data', 'custom-css-js_meta_box_nonce' );
|
447 |
?>
|
448 |
+
<style type="text/css">
|
449 |
+
.radio-group input { margin-top: 1px; }
|
450 |
+
.radio-group label { padding: 2px 0; }
|
451 |
+
.options_meta_box h3 { margin-top: 10px !important; }
|
452 |
+
.radio-group { line-height: 30px; padding-left: 10px; }
|
453 |
+
.radio-group .dashicons-before:before { margin: 7px 3px 0 3px; }
|
454 |
+
.options_meta_box select { margin-left: 10px; }
|
455 |
+
</style>
|
456 |
+
|
457 |
+
|
458 |
<div class="options_meta_box">
|
459 |
+
<h3>Linking type</h3>
|
460 |
+
<div class="radio-group">
|
461 |
+
<input type="radio" <?php echo $selected['internal']; ?>value="internal" name="custom_code_linking" id="custom_code_linking-internal"><label class="dashicons-before dashicons-editor-alignleft" for="custom_code_linking-internal"> In the HTML Document</label><br />
|
462 |
+
<input type="radio" <?php echo $selected['external']; ?>value="external" name="custom_code_linking" id="custom_code_linking-external"><label class="dashicons-before dashicons-media-code" for="custom_code_linking-external"> External File</label><br />
|
463 |
+
</div>
|
464 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
465 |
|
466 |
+
<h3>Where on page</h3>
|
467 |
+
<div class="radio-group">
|
468 |
+
<input type="radio" <?php echo $selected['header']; ?>value="header" name="custom_code_type" id="custom_code_type-header"><label class="dashicons-before dashicons-arrow-up-alt2" for="custom_code_type-header"> Header</label><br />
|
469 |
+
<input type="radio" <?php echo $selected['footer']; ?>value="footer" name="custom_code_type" id="custom_code_type-footer"><label class="dashicons-before dashicons-arrow-down-alt2" for="custom_code_type-footer"> Footer</label><br />
|
470 |
+
</div>
|
471 |
|
|
|
472 |
|
473 |
+
<?php /*
|
474 |
+
<h3>Priority</h3>
|
475 |
+
<select name="custom_code_priority">
|
476 |
+
<?php
|
477 |
|
478 |
+
$priorities = array( 1 => '1 highest', '2', '3', '4', '5 default', '6', '7', '8', '9', '10 lowest');
|
479 |
+
|
480 |
+
foreach( $priorities as $_key => $_value ) {
|
481 |
+
$checked = '';
|
482 |
+
if ( $_key == $selected['priority'] ) {
|
483 |
+
$checked = 'selected="selected" ';
|
484 |
}
|
485 |
|
486 |
+
echo "\t" . '<option value="'.$_key.'"'.$checked .'>'.$_value.'</option>' . PHP_EOL;
|
487 |
}
|
488 |
|
|
|
|
|
489 |
?>
|
490 |
+
</select>
|
491 |
+
*/ ?>
|
492 |
+
<input type="hidden" name="custom_code_priority" value="5" />
|
493 |
|
|
|
|
|
|
|
494 |
|
|
|
495 |
|
496 |
+
<h3>Where in site</h3>
|
497 |
+
<div class="radio-group">
|
498 |
+
<input type="radio" <?php echo $selected['frontend']; ?>value="frontend" name="custom_code_side" id="custom_code_side-frontend"><label class="dashicons-before dashicons-tagcloud" for="custom_code_side-frontend"> In Frontend</label><br />
|
499 |
+
<input type="radio" <?php echo $selected['admin']; ?>value="admin" name="custom_code_side" id="custom_code_side-admin"><label class="dashicons-before dashicons-id" for="custom_code_side-admin"> In Admin</label><br />
|
500 |
</div>
|
501 |
|
502 |
+
<input type="hidden" name="custom_code_language" value="<?php echo $options['language']; ?>" />
|
503 |
|
504 |
+
<div style="clear: both;"></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
505 |
|
|
|
506 |
|
507 |
+
<?php
|
508 |
}
|
509 |
|
510 |
|
513 |
*/
|
514 |
function options_save_meta_box_data( $post_id ) {
|
515 |
|
516 |
+
|
517 |
// The usual checks
|
518 |
if ( ! isset( $_POST['custom-css-js_meta_box_nonce'] ) ) {
|
519 |
return;
|
540 |
'language' => 'css',
|
541 |
);
|
542 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
543 |
foreach( $defaults as $_field => $_default ) {
|
544 |
$options[ $_field ] = isset( $_POST['custom_code_'.$_field] ) ? $_POST['custom_code_'.$_field] : $_default;
|
545 |
}
|
546 |
|
547 |
update_post_meta( $post_id, 'options', $options );
|
548 |
|
|
|
|
|
|
|
|
|
|
|
549 |
|
550 |
// Save the Custom Code in a file in `wp-content/uploads/custom-css-js`
|
551 |
if ( $options['linking'] == 'internal' ) {
|
557 |
$after = '</style>' . PHP_EOL . $after;
|
558 |
}
|
559 |
if ( $options['language'] == 'js' ) {
|
|
|
560 |
$before .= '<script type="text/javascript">' . PHP_EOL;
|
561 |
$after = '</script>' . PHP_EOL . $after;
|
|
|
562 |
}
|
563 |
}
|
564 |
|
572 |
$file_name = $post_id . '.' . $options['language'];
|
573 |
$file_content = $before . stripslashes($_POST['content']) . $after;
|
574 |
@file_put_contents( $this->main->upload_dir . '/' . $file_name , $file_content );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
575 |
}
|
576 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
577 |
|
578 |
+
$this->build_search_tree();
|
|
|
|
|
|
|
|
|
579 |
}
|
580 |
|
581 |
|
582 |
/**
|
583 |
* Build a tree where you can quickly find the needed custom-css-js posts
|
|
|
|
|
584 |
*/
|
585 |
private function build_search_tree() {
|
586 |
|
587 |
+
$posts = query_posts( 'post_type=custom-css-js&post_status=publish' );
|
588 |
+
|
589 |
+
if ( ! is_array( $posts ) || count( $posts ) == 0 ) {
|
590 |
+
return false;
|
591 |
+
}
|
592 |
|
593 |
$tree = array();
|
594 |
foreach ( $posts as $_post ) {
|
|
|
|
|
|
|
|
|
595 |
$options = $this->get_options( $_post->ID );
|
596 |
|
|
|
597 |
$tree_branch = $options['side'] . '-' .$options['language'] . '-' . $options['type'] . '-' . $options['linking'];
|
598 |
|
599 |
+
$tree[ $tree_branch ][] = $_post->ID . '.' . $options['language'] ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
600 |
|
601 |
}
|
602 |
|
|
|
603 |
update_option( 'custom-css-js-tree', $tree );
|
604 |
}
|
605 |
|
624 |
return str_replace( 'QTags.addButton', '// QTags.addButton', $html );
|
625 |
}
|
626 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
627 |
|
628 |
}
|
629 |
|
includes/admin-warnings.php
DELETED
@@ -1,100 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Custom CSS and JS
|
4 |
-
*
|
5 |
-
*/
|
6 |
-
|
7 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
8 |
-
exit; // Exit if accessed directly
|
9 |
-
}
|
10 |
-
|
11 |
-
/**
|
12 |
-
* CustomCSSandJS_Warnings
|
13 |
-
*/
|
14 |
-
class CustomCSSandJS_Warnings {
|
15 |
-
|
16 |
-
/**
|
17 |
-
* Constructor
|
18 |
-
*/
|
19 |
-
public function __construct() {
|
20 |
-
|
21 |
-
if ( ! function_exists( 'is_plugin_active' ) ) {
|
22 |
-
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
|
23 |
-
}
|
24 |
-
|
25 |
-
$this->check_qtranslatex();
|
26 |
-
add_action( 'wp_ajax_ccj_dismiss', array( $this, 'notice_dismiss' ) );
|
27 |
-
}
|
28 |
-
|
29 |
-
/**
|
30 |
-
* Check if qTranslate plugin is active and doesn't have the custom-css-js removed from the settings
|
31 |
-
*/
|
32 |
-
function check_qtranslatex() {
|
33 |
-
|
34 |
-
if ( ! is_plugin_active( 'qtranslate-x/qtranslate.php' ) ) return false;
|
35 |
-
|
36 |
-
if ( get_option('ccj_dismiss_qtranslate') !== false ) {
|
37 |
-
return;
|
38 |
-
}
|
39 |
-
|
40 |
-
$qtranslate_post_type_excluded = get_option('qtranslate_post_type_excluded');
|
41 |
-
|
42 |
-
if ( ! is_array( $qtranslate_post_type_excluded ) || array_search( 'custom-css-js', $qtranslate_post_type_excluded ) === false ) {
|
43 |
-
var_dump( $qtranslate_post_type_excluded );
|
44 |
-
add_action( 'admin_notices', array( $this, 'check_qtranslate_notice' ) );
|
45 |
-
return;
|
46 |
-
}
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Show a warning about qTranslate
|
51 |
-
*/
|
52 |
-
function check_qtranslate_notice() {
|
53 |
-
$id = 'ccj_dismiss_qtranslate';
|
54 |
-
$class = 'notice notice-warning is-dismissible';
|
55 |
-
$message = __( 'Please remove the <b>custom-css-js</b> post type from the <b>qTranslate settings</b> in order to avoid some malfunctions in the Simple Custom CSS & JS plugin. Check out <a href="https://www.silkypress.com/wp-content/uploads/2016/08/ccj_qtranslate_compatibility.png" target="_blank">this screenshot</a> for more details on how to do that.' );
|
56 |
-
|
57 |
-
printf( '<div class="%1$s" id="%2$s"><p>%3$s</p></div>', $class, $id, $message );
|
58 |
-
|
59 |
-
$this->dismiss_js( $id );
|
60 |
-
|
61 |
-
}
|
62 |
-
|
63 |
-
/**
|
64 |
-
* Allow the dismiss button to remove the notice
|
65 |
-
*/
|
66 |
-
function dismiss_js( $slug ) {
|
67 |
-
?>
|
68 |
-
<script type='text/javascript'>
|
69 |
-
jQuery(function($){
|
70 |
-
$(document).on( 'click', '#<?php echo $slug; ?> .notice-dismiss', function() {
|
71 |
-
var data = {
|
72 |
-
action: 'ccj_dismiss',
|
73 |
-
option: '<?php echo $slug; ?>',
|
74 |
-
};
|
75 |
-
$.post(ajaxurl, data, function(response ) {
|
76 |
-
$('#<?php echo $slug; ?>').fadeOut('slow');
|
77 |
-
});
|
78 |
-
});
|
79 |
-
});
|
80 |
-
</script>
|
81 |
-
<?php
|
82 |
-
}
|
83 |
-
|
84 |
-
|
85 |
-
/**
|
86 |
-
* Ajax response for `notice_dismiss` action
|
87 |
-
*/
|
88 |
-
function notice_dismiss() {
|
89 |
-
|
90 |
-
$option = $_POST['option'];
|
91 |
-
|
92 |
-
update_option( $option, 1 );
|
93 |
-
|
94 |
-
wp_die();
|
95 |
-
}
|
96 |
-
|
97 |
-
}
|
98 |
-
|
99 |
-
|
100 |
-
return new CustomCSSandJS_Warnings();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
readme.txt
CHANGED
@@ -5,8 +5,8 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=diana
|
|
5 |
Email: diana@burduja.eu
|
6 |
Tags: CSS, JS, javascript, custom CSS, custom JS, custom style, site css, add style, customize theme, custom code, external css, css3, style, styles, stylesheet, theme, editor, design, admin
|
7 |
Requires at least: 3.0.1
|
8 |
-
Tested up to: 4.
|
9 |
-
Stable tag:
|
10 |
License: GPLv3
|
11 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
12 |
|
@@ -25,6 +25,8 @@ Customize your WordPress site's appearance by easily adding custom CSS and JS co
|
|
25 |
* Keep your changes also when you change the theme
|
26 |
|
27 |
= Frequently Asked Questions =
|
|
|
|
|
28 |
|
29 |
* **What if I want to add multiple external CSS codes?**
|
30 |
If you write multiple codes of the same type (for example: two external CSS codes), then all of them will be printed one after another
|
@@ -48,7 +50,7 @@ Yes.
|
|
48 |
The CSS and JS are independent of the theme and they will persist through a theme change. This is particularly useful if you apply CSS and JS for modifying a plugin's output.
|
49 |
|
50 |
* **Can I use a CSS preprocesor like LESS or Sass?**
|
51 |
-
|
52 |
|
53 |
* **Can I upload images for use with my CSS?**
|
54 |
Yes. You can upload an image to your Media Library, then refer to it by its direct URL from within the CSS stylesheet. For example:
|
@@ -100,9 +102,6 @@ PHP >= 5.3
|
|
100 |
* Internet Explorer - version 8 and up
|
101 |
* Opera - version 9 and up
|
102 |
|
103 |
-
= Small incompatibilities =
|
104 |
-
* If the [qTranslate X](https://wordpress.org/plugins/qtranslate-x/) plugin is adding some `[:]` or `[:en]` characters to your code, then you need to remove the `custom-css-js` post type from the qTranslate settings. Check out [this screenshot](https://www.silkypress.com/wp-content/uploads/2016/08/ccj_qtranslate_compatibility.png) on how to do that.
|
105 |
-
|
106 |
== Screenshots ==
|
107 |
|
108 |
1. Manage Custom Codes
|
@@ -111,71 +110,8 @@ PHP >= 5.3
|
|
111 |
|
112 |
3. Add/Edit CSS
|
113 |
|
114 |
-
$. Add/Edit HTML
|
115 |
-
|
116 |
== Changelog ==
|
117 |
|
118 |
-
= 2.10 =
|
119 |
-
* 02/05/2016
|
120 |
-
* Feature: circumvent external file caching by adding a GET parameter
|
121 |
-
* Add special offer for Simple Custom CSS and JS pro
|
122 |
-
|
123 |
-
= 2.9 =
|
124 |
-
* 12/05/2016
|
125 |
-
* Compatibility with WP4.7. The "custom HTML code" was not showing up anymore
|
126 |
-
|
127 |
-
= 2.8 =
|
128 |
-
* 10/09/2016
|
129 |
-
* Feature: add search within the editor accessible with Ctrl+F
|
130 |
-
* Feature: make the inactive rows opaque
|
131 |
-
|
132 |
-
= 2.7 =
|
133 |
-
* 09/04/2016
|
134 |
-
* Fix: there was a space in the htmlmixed.%20js url
|
135 |
-
* Feature: make the editor resizable
|
136 |
-
|
137 |
-
= 2.6 =
|
138 |
-
* 08/31/2016
|
139 |
-
* Feature: add HTML code
|
140 |
-
* Fix: add htmlentities when showing them in the editor
|
141 |
-
* Feature: when adding a code, show more explanations as comments
|
142 |
-
|
143 |
-
= 2.5 =
|
144 |
-
* 08/25/2016
|
145 |
-
* Fix: compatibility with other plugins that interfere with the CodeMirror editor
|
146 |
-
|
147 |
-
= 2.4 =
|
148 |
-
* 08/01/2016
|
149 |
-
* Add the "Add CSS Code" and "Add JS Code" buttons next to the page title
|
150 |
-
* Compatibility with WP 4.6: the "Modified" column in the Codes listing was empty
|
151 |
-
|
152 |
-
= 2.3 =
|
153 |
-
* 06/22/2016
|
154 |
-
* Add the includes/admin-notices.php and includes/admin-addons.php
|
155 |
-
* Feature: change the editor's scrollbar so it can be caught with the mouse
|
156 |
-
|
157 |
-
= 2.2 =
|
158 |
-
* 06/22/2016
|
159 |
-
* Check compatibility WordPress 4.5.3
|
160 |
-
* Add special offer for Simple Custom CSS and JS pro
|
161 |
-
|
162 |
-
= 2.1 =
|
163 |
-
* 04/24/2016
|
164 |
-
* Fix: on multisite installs have to create the custom-css-js folder in the upload dir for each site
|
165 |
-
* Fix: the `deactivate code` star wasn't working when first time clicked
|
166 |
-
* Fix: In the add/edit Code page filter which meta boxes are allowed
|
167 |
-
* Fix: If the custom-css-js folder is not created of is not writable, issue an admin notice.
|
168 |
-
|
169 |
-
= 2.0 =
|
170 |
-
* 04/11/2016
|
171 |
-
* Feature: enable/disable codes
|
172 |
-
* Feature: add a GET parameter at the end of external files in order to over circumvent caching
|
173 |
-
* Fix: don't add the "<script>" tag from the code if already present.
|
174 |
-
|
175 |
-
= 1.6 =
|
176 |
-
* 03/26/2016
|
177 |
-
* Fix: the number of codes were limited because query_posts is automatically inserting a limit
|
178 |
-
|
179 |
= 1.5 =
|
180 |
* 10/03/2016
|
181 |
* Fix: solved a conflict with the `shortcoder` plugin.
|
5 |
Email: diana@burduja.eu
|
6 |
Tags: CSS, JS, javascript, custom CSS, custom JS, custom style, site css, add style, customize theme, custom code, external css, css3, style, styles, stylesheet, theme, editor, design, admin
|
7 |
Requires at least: 3.0.1
|
8 |
+
Tested up to: 4.4.2
|
9 |
+
Stable tag: 1.5
|
10 |
License: GPLv3
|
11 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
12 |
|
25 |
* Keep your changes also when you change the theme
|
26 |
|
27 |
= Frequently Asked Questions =
|
28 |
+
* **Can I recover the codes if I previous uninstalled the plugin?**
|
29 |
+
No, on the `Custom CSS and JS` plugin's uninstall all the added code will be removed. Before uninstalling make sure you don't need the codes anymore.
|
30 |
|
31 |
* **What if I want to add multiple external CSS codes?**
|
32 |
If you write multiple codes of the same type (for example: two external CSS codes), then all of them will be printed one after another
|
50 |
The CSS and JS are independent of the theme and they will persist through a theme change. This is particularly useful if you apply CSS and JS for modifying a plugin's output.
|
51 |
|
52 |
* **Can I use a CSS preprocesor like LESS or Sass?**
|
53 |
+
No, for the moment only plain CSS is supported.
|
54 |
|
55 |
* **Can I upload images for use with my CSS?**
|
56 |
Yes. You can upload an image to your Media Library, then refer to it by its direct URL from within the CSS stylesheet. For example:
|
102 |
* Internet Explorer - version 8 and up
|
103 |
* Opera - version 9 and up
|
104 |
|
|
|
|
|
|
|
105 |
== Screenshots ==
|
106 |
|
107 |
1. Manage Custom Codes
|
110 |
|
111 |
3. Add/Edit CSS
|
112 |
|
|
|
|
|
113 |
== Changelog ==
|
114 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
115 |
= 1.5 =
|
116 |
* 10/03/2016
|
117 |
* Fix: solved a conflict with the `shortcoder` plugin.
|
screenshot-1.jpg
DELETED
Binary file
|
screenshot-2.jpg
DELETED
Binary file
|
screenshot-3.jpg
DELETED
Binary file
|
screenshot-4.jpg
DELETED
Binary file
|