Version Description
- Fixed php notice/warning that would trigger if WP_DEBUG was enabled.
- Adding minified core JS.
- Adding global option to disable shortcode button in the content editor.
- Adding touchmove js event for faster scroll detection on mobile devices.
- Code clean up, removing unused functions.
Download this release
Release Info
Developer | dcooney |
Plugin | ![]() |
Version | 2.2.1 |
Comparing to | |
See all releases |
Code changes from version 2.1.3 to 2.2.1
- README.txt +55 -33
- admin/admin.php +206 -89
- admin/codemirror/addon/edit/closebrackets.js +158 -0
- admin/codemirror/addon/edit/closetag.js +141 -0
- admin/codemirror/addon/edit/continuelist.js +38 -0
- admin/codemirror/addon/edit/matchbrackets.js +120 -0
- admin/codemirror/addon/edit/matchtags.js +66 -0
- admin/codemirror/addon/edit/trailingspace.js +27 -0
- admin/codemirror/lib/codemirror.css +301 -0
- admin/codemirror/lib/codemirror.js +7801 -0
- admin/codemirror/mode/clike/clike.js +440 -0
- admin/codemirror/mode/clike/index.html +204 -0
- admin/codemirror/mode/clike/scala.html +767 -0
- admin/codemirror/mode/css/css.js +717 -0
- admin/codemirror/mode/css/index.html +70 -0
- admin/codemirror/mode/css/less.html +152 -0
- admin/codemirror/mode/css/less_test.js +51 -0
- admin/codemirror/mode/css/scss.html +157 -0
- admin/codemirror/mode/css/scss_test.js +110 -0
- admin/codemirror/mode/css/test.js +135 -0
- admin/codemirror/mode/htmlmixed/htmlmixed.js +120 -0
- admin/codemirror/mode/htmlmixed/index.html +85 -0
- admin/codemirror/mode/index.html +121 -0
- admin/codemirror/mode/javascript/index.html +109 -0
- admin/codemirror/mode/javascript/javascript.js +685 -0
- admin/codemirror/mode/javascript/json-ld.html +72 -0
- admin/codemirror/mode/javascript/test.js +187 -0
- admin/codemirror/mode/javascript/typescript.html +61 -0
- admin/codemirror/mode/php/index.html +64 -0
- admin/codemirror/mode/php/php.js +233 -0
- admin/codemirror/mode/php/test.js +148 -0
- admin/codemirror/mode/xml/index.html +57 -0
- admin/codemirror/mode/xml/test.js +51 -0
- admin/codemirror/mode/xml/xml.js +384 -0
- admin/css/admin.css +145 -32
- admin/editor-build.php +2 -2
- admin/editor.php +21 -6
- admin/img/add.png +0 -0
- admin/includes/cta/about.php +28 -11
- admin/includes/cta/extend.php +1 -1
- admin/includes/cta/resources.php +23 -7
- admin/js/editor-btn.js +1 -0
- admin/{js → shortcode-builder/js}/shortcode-builder.js +11 -2
- admin/{includes → shortcode-builder}/shortcode-builder.php +28 -3
- ajax-load-more.php +59 -30
- core/css/ajax-load-more.css +44 -34
- core/js/ajax-load-more.js +36 -24
- core/js/ajax-load-more.min.js +14 -0
- core/repeater/default.php +1 -1
- lang/ajax-load-more.pot +179 -138
- screenshot-1.png +0 -0
- screenshot-2.png +0 -0
- screenshot-3.png +0 -0
- screenshot-4.png +0 -0
- screenshot-5.png +0 -0
- screenshot-6.png +0 -0
- screenshot-7.png +0 -0
README.txt
CHANGED
@@ -3,8 +3,8 @@ Contributors: dcooney
|
|
3 |
Donate link: http://connekthq.com/donate/
|
4 |
Tags: ajax, query, loop, paging, filter, jquery, shortcode builder, shortcode, search, tags, category
|
5 |
Requires at least: 3.6
|
6 |
-
Tested up to:
|
7 |
-
Stable tag: 2.1
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
@@ -19,10 +19,10 @@ Build complex WordPress queries using our shortcode builder then add the shortco
|
|
19 |
|
20 |
= Features =
|
21 |
|
22 |
-
* **Multiple Instances** - you can now include multiple instances of Ajax Load More on a single page.
|
23 |
-
* **Shortcode Builder** - create your own Ajax Load More shortcode by adjusting the various WordPress query parameters (see Shortcode Parameters).
|
24 |
-
* **Query Parameters** -
|
25 |
-
* **Customizable Repeater Templates** -
|
26 |
* **Setting Panel** - Customize your version of Ajax Load More by updating various plugin settings (see screenshots).
|
27 |
|
28 |
Check out the **[demo site](http://connekthq.com/plugins/ajax-load-more/)** for more information!
|
@@ -33,24 +33,26 @@ Check out the **[demo site](http://connekthq.com/plugins/ajax-load-more/)** for
|
|
33 |
|
34 |
Ajax Load More accepts a number of paramaters to pass to the WordPress query. These parameters are passed via shortcode - don't worry, creating your shortcode is simple with our Shortcode Builder.
|
35 |
|
36 |
-
* **repeater** -
|
37 |
-
* **post_type** -
|
38 |
-
* **
|
39 |
-
* **
|
40 |
-
* **
|
41 |
-
* **
|
42 |
-
* **
|
43 |
-
* **
|
44 |
-
* **
|
45 |
-
* **
|
46 |
-
* **
|
47 |
-
* **
|
48 |
-
* **
|
49 |
-
* **
|
50 |
-
* **
|
51 |
-
* **
|
52 |
-
* **
|
53 |
-
* **
|
|
|
|
|
54 |
|
55 |
|
56 |
|
@@ -73,7 +75,7 @@ The following Add-ons are available to increase the functionality of Ajax Load M
|
|
73 |
|
74 |
**Custom Repeaters**
|
75 |
|
76 |
-
The **[Custom Repeaters](http://connekthq.com/plugins/ajax-load-more/custom-repeaters) add-on will add
|
77 |
[Get More Information](http://connekthq.com/plugins/ajax-load-more/custom-repeaters)
|
78 |
|
79 |
|
@@ -103,9 +105,15 @@ Your ratings make a big difference! If you like and use Ajax Load More, please c
|
|
103 |
== Frequently Asked Questions ==
|
104 |
|
105 |
|
|
|
|
|
|
|
|
|
|
|
|
|
106 |
= What are my server requirements? =
|
107 |
|
108 |
-
Your server must be able to read/write/create files. Ajax Load More creates the default repeater on plugin activation and in order to modify the output
|
109 |
|
110 |
= Is the ajax functionality secure? =
|
111 |
|
@@ -117,13 +125,12 @@ Sure, but please be aware that if modifications are made it may affect future up
|
|
117 |
|
118 |
= Can I modify the repeater template? =
|
119 |
|
120 |
-
Yes, visit the Repeater Template
|
121 |
|
122 |
-
=
|
|
|
|
|
123 |
|
124 |
-
1. Create your shortcode
|
125 |
-
2. Add the shortcode to your page, by adding it through the content editor or placing it directly within one of your template files.
|
126 |
-
3. Load a page with your shortcode in place and watch Ajax Load More fetch your posts.
|
127 |
|
128 |
== Installation ==
|
129 |
|
@@ -163,10 +170,25 @@ How to install Ajax Load More.
|
|
163 |
|
164 |
== Changelog ==
|
165 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
= 2.1.3 =
|
167 |
-
* Fixed issue
|
168 |
* Adding column 'alias' to wp_alm table to allow for repeater alias (Only for the custom repeater add-on).
|
169 |
-
* Remove
|
170 |
* Updating styles in admin.css.
|
171 |
|
172 |
= 2.1.2 =
|
3 |
Donate link: http://connekthq.com/donate/
|
4 |
Tags: ajax, query, loop, paging, filter, jquery, shortcode builder, shortcode, search, tags, category
|
5 |
Requires at least: 3.6
|
6 |
+
Tested up to: 4.0
|
7 |
+
Stable tag: 2.2.1
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
19 |
|
20 |
= Features =
|
21 |
|
22 |
+
* **Multiple Instances** - One, two, three or ten - you can now include multiple instances of Ajax Load More on a single page.
|
23 |
+
* **Shortcode Builder** - Easily create your own Ajax Load More shortcode by adjusting the various WordPress query parameters in our easy-to-use shortcode builder.(see Shortcode Parameters).
|
24 |
+
* **Query Parameters** - Ajax Load More allows you to query WordPress by many different content types. Query by Post Type, Post Format, Category, Tags, Custom Taxonomies, Search Term, Authors and more!!
|
25 |
+
* **Customizable Repeater Templates** - Edit and extend the functionality of Ajax Load More by creating your own repeater template to match the look and feel of your website.(see screenshots).
|
26 |
* **Setting Panel** - Customize your version of Ajax Load More by updating various plugin settings (see screenshots).
|
27 |
|
28 |
Check out the **[demo site](http://connekthq.com/plugins/ajax-load-more/)** for more information!
|
33 |
|
34 |
Ajax Load More accepts a number of paramaters to pass to the WordPress query. These parameters are passed via shortcode - don't worry, creating your shortcode is simple with our Shortcode Builder.
|
35 |
|
36 |
+
* **repeater** - Choose a repeater template (Add-on available). Default = ‘default‘
|
37 |
+
* **post_type** - Comma separated list of post types. Default = ‘post’
|
38 |
+
* **post_format** - Query by post format. Default = null
|
39 |
+
* **category** - Query by category slug. Default = null
|
40 |
+
* **tag** - Query by tag name. Default = null
|
41 |
+
* **taxonomy** - Query by custom taxonomy name. Default = null
|
42 |
+
* **taxonomy_terms** - Comma separated list of custom taxonomy terms(slug). Default = null
|
43 |
+
* **taxonomy_operator** - Operator to compare Taxonomy Terms against (IN/NOT IN). Default = ‘IN’
|
44 |
+
* **author** - Query by author id. Default = null
|
45 |
+
* **search** - Query search term (‘s’). Default = null
|
46 |
+
* **order** - Display posts in ASC(ascending) or DESC(descending) order. Default = ‘DESC’
|
47 |
+
* **orderby** - Order posts by date, title, name, menu order, random, author, post ID or comment count. Default = ‘date’
|
48 |
+
* **exclude** - Comma separated list of post ID’s to exclude from query. Default = null
|
49 |
+
* **offset** - Offset the initial query (number). Default = ’0′
|
50 |
+
* **posts_per_page** - Number of posts to load with each Ajax request. Default = ’5′
|
51 |
+
* **scroll** - Load more posts as the user scrolls the page (true/false). Default = ‘true’
|
52 |
+
* **max_pages** - Maximum number of pages to load while user is scrolling (activated on when scroll = true). Default = '5'
|
53 |
+
* **pause** - Do not load posts until user clicks the Load More button (true/false). Default = 'false'
|
54 |
+
* **transition** - Choose a posts reveal transition (slide/fade). Default = 'slide'
|
55 |
+
* **button_label** - The label text for Load More button. Default = 'Older Posts'
|
56 |
|
57 |
|
58 |
|
75 |
|
76 |
**Custom Repeaters**
|
77 |
|
78 |
+
The **[Custom Repeaters](http://connekthq.com/plugins/ajax-load-more/custom-repeaters)** add-on will add an additional five repeater templates allowing you to create unique templates for different content types throughout your theme.
|
79 |
[Get More Information](http://connekthq.com/plugins/ajax-load-more/custom-repeaters)
|
80 |
|
81 |
|
105 |
== Frequently Asked Questions ==
|
106 |
|
107 |
|
108 |
+
= What are the steps to getting Ajax Load More to display on my website =
|
109 |
+
|
110 |
+
1. Create your shortcode
|
111 |
+
2. Add the shortcode to your page, by adding it through the content editor or placing it directly within one of your template files.
|
112 |
+
3. Load a page with your shortcode in place and watch Ajax Load More fetch your posts.
|
113 |
+
|
114 |
= What are my server requirements? =
|
115 |
|
116 |
+
Your server must be able to read/write/create files. Ajax Load More creates the default repeater on plugin activation and in order to modify the output we are required to write to the file as well.
|
117 |
|
118 |
= Is the ajax functionality secure? =
|
119 |
|
125 |
|
126 |
= Can I modify the repeater template? =
|
127 |
|
128 |
+
Yes, visit the Repeater Template section in your WordPress admin.
|
129 |
|
130 |
+
= How are my repeater templates saved? =
|
131 |
+
|
132 |
+
Repeater template data is saved to the your WordPress database as well as written directly to a repeater template .php file in the ajax-load-more plugin directory.
|
133 |
|
|
|
|
|
|
|
134 |
|
135 |
== Installation ==
|
136 |
|
170 |
|
171 |
== Changelog ==
|
172 |
|
173 |
+
= 2.2.1 =
|
174 |
+
* Fixed php notice/warning that would trigger if WP_DEBUG was enabled.
|
175 |
+
* Adding minified core JS.
|
176 |
+
* Adding global option to disable shortcode button in the content editor.
|
177 |
+
* Adding touchmove js event for faster scroll detection on mobile devices.
|
178 |
+
* Code clean up, removing unused functions.
|
179 |
+
|
180 |
+
= 2.2.0 =
|
181 |
+
* Adding Post Format query.
|
182 |
+
* Adding syntax highlighting for Repeater Templates with CodeMirror (http://codemirror.net/).
|
183 |
+
* Adding custom alias integration for Repeater Templates (Only for the custom repeater add-on).
|
184 |
+
* Adding button preview on settings page.
|
185 |
+
* Adding 'White' button style.
|
186 |
+
* Updated .pot language file.
|
187 |
+
|
188 |
= 2.1.3 =
|
189 |
+
* Fixed issue causing the Ajax Load More menu to not show on some admin screen do to location conflict with another plugin.
|
190 |
* Adding column 'alias' to wp_alm table to allow for repeater alias (Only for the custom repeater add-on).
|
191 |
+
* Remove legacy column 'test' from wp_alm table.
|
192 |
* Updating styles in admin.css.
|
193 |
|
194 |
= 2.1.2 =
|
admin/admin.php
CHANGED
@@ -154,13 +154,33 @@ function alm_load_admin_js(){
|
|
154 |
|
155 |
function alm_enqueue_admin_scripts(){
|
156 |
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
}
|
165 |
|
166 |
|
@@ -177,26 +197,26 @@ function alm_settings_page(){ ?>
|
|
177 |
<div class="wrap">
|
178 |
<div class="header-wrap">
|
179 |
<h2><?php echo ALM_TITLE; ?> <span><?php echo ALM_VERSION; ?></span></h2>
|
180 |
-
<p>A
|
181 |
</div>
|
182 |
<div class="alm-main">
|
183 |
-
<
|
184 |
<form action="options.php" method="post">
|
185 |
<?php
|
186 |
settings_fields( 'alm-setting-group' );
|
187 |
do_settings_sections( 'ajax-load-more' );
|
188 |
//get the older values, wont work the first time
|
189 |
$options = get_option( '_alm_settings' ); ?>
|
190 |
-
<div class="row">
|
191 |
<?php submit_button('Save Settings'); ?>
|
192 |
</div>
|
193 |
</form>
|
194 |
-
</
|
195 |
</div>
|
196 |
-
<
|
197 |
<?php include( plugin_dir_path( __FILE__ ) . 'includes/cta/resources.php'); ?>
|
198 |
<?php include( plugin_dir_path( __FILE__ ) . 'includes/cta/about.php'); ?>
|
199 |
-
</
|
200 |
|
201 |
</div>
|
202 |
</div>
|
@@ -216,13 +236,19 @@ function alm_repeater_page(){ ?>
|
|
216 |
<div class="admin ajax-load-more" id="alm-repeaters">
|
217 |
<div class="wrap">
|
218 |
<div class="header-wrap">
|
219 |
-
<h2><?php _e('Ajax
|
220 |
<p><?php _e('The library of available templates to use throughout your theme', ALM_NAME); ?></p>
|
221 |
</div>
|
222 |
<div class="alm-main form-table repeaters">
|
|
|
223 |
<!-- Repeaters -->
|
224 |
-
<
|
225 |
-
|
|
|
|
|
|
|
|
|
|
|
226 |
<div class="row default-repeater">
|
227 |
<?php
|
228 |
$filename = ALM_PATH. 'core/repeater/default.php';
|
@@ -233,21 +259,32 @@ function alm_repeater_page(){ ?>
|
|
233 |
<h3 class="heading"><?php _e('Default Template', ALM_NAME); ?></h3>
|
234 |
<div class="expand-wrap">
|
235 |
<div class="wrap repeater-wrap" data-name="default">
|
236 |
-
<label class="template-title" for="
|
237 |
-
<textarea rows="10" id="
|
238 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
239 |
<div class="saved-response"> </div>
|
240 |
</div>
|
241 |
</div>
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
</div>
|
251 |
<!-- End Default -->
|
252 |
<?php
|
253 |
if (has_action('alm_custom_repeaters'))
|
@@ -265,15 +302,42 @@ function alm_repeater_page(){ ?>
|
|
265 |
* @since 2.0.0
|
266 |
*/
|
267 |
|
268 |
-
_alm_admin.saveRepeater = function(btn) {
|
269 |
var container = btn.parent('.repeater-wrap'),
|
270 |
el = $('textarea._alm_repeater', container),
|
271 |
-
value = el.val(),
|
272 |
btn = btn,
|
|
|
273 |
repeater = container.data('name'),
|
274 |
alias = ($('input._alm_repeater_alias', container).length) ? $('input._alm_repeater_alias', container).val() : '',
|
275 |
responseText = $(".saved-response", container);
|
276 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
277 |
//If submit button has changed class.
|
278 |
if (btn.hasClass('changed')) { // If repeater value has changed.
|
279 |
responseText.addClass('loading').html('<?php _e('Saving data...', ALM_NAME) ?>');
|
@@ -289,7 +353,7 @@ function alm_repeater_page(){ ?>
|
|
289 |
},
|
290 |
success: function(e) {
|
291 |
setTimeout(function(){
|
292 |
-
responseText.html('<?php _e('
|
293 |
setTimeout(function() {
|
294 |
responseText.html(' ').removeClass('saved');
|
295 |
}, 3000);
|
@@ -297,7 +361,7 @@ function alm_repeater_page(){ ?>
|
|
297 |
btn.removeClass('changed');
|
298 |
},
|
299 |
error: function(xhr, status, error) {
|
300 |
-
responseText.html('<?php _e('Something went wrong and the data could not be saved
|
301 |
btn.removeClass('changed');
|
302 |
}
|
303 |
});
|
@@ -305,17 +369,18 @@ function alm_repeater_page(){ ?>
|
|
305 |
}
|
306 |
$('input.save-repeater').each(function(){
|
307 |
$(this).click(function() {
|
308 |
-
var btn = $(this)
|
|
|
309 |
btn.addClass('changed');
|
310 |
-
_alm_admin.saveRepeater(btn);
|
311 |
});
|
312 |
});
|
313 |
});
|
314 |
</script>
|
315 |
-
</
|
316 |
<!-- End Repeaters -->
|
317 |
</div>
|
318 |
-
<
|
319 |
<div class="cta">
|
320 |
<h3><?php _e('Templating Help', ALM_NAME); ?></h3>
|
321 |
<div class="item">
|
@@ -334,7 +399,7 @@ function alm_repeater_page(){ ?>
|
|
334 |
</div>
|
335 |
</div>
|
336 |
<?php include( plugin_dir_path( __FILE__ ) . 'includes/cta/writeable.php'); ?>
|
337 |
-
</
|
338 |
</div>
|
339 |
</div>
|
340 |
|
@@ -400,18 +465,18 @@ function alm_shortcode_builder_page(){ ?>
|
|
400 |
<div class="admin ajax-load-more" id="alm-builder">
|
401 |
<div class="wrap">
|
402 |
<div class="header-wrap">
|
403 |
-
<h2><?php _e('Ajax
|
404 |
<p><?php _e('Create your own Ajax Load More <a href="http://en.support.wordpress.com/shortcodes/" target="_blank">shortcode</a> by adjusting the values below', ALM_NAME); ?></p>
|
405 |
</div>
|
406 |
<div class="alm-main">
|
407 |
-
<
|
408 |
-
<?php include( plugin_dir_path( __FILE__ ) . '
|
409 |
-
<div class="row">
|
410 |
<p class="back2top"><a href="#wpcontent"><i class="fa fa-chevron-up"></i> <?php _e('Back to Top', ALM_NAME); ?></a></p>
|
411 |
</div>
|
412 |
-
</
|
413 |
</div>
|
414 |
-
<
|
415 |
<div class="cta">
|
416 |
<h3><?php _e('Shortcode Output', ALM_NAME); ?></h3>
|
417 |
<p><?php _e('Copy and paste the following shortcode into the content editor or widget area of your theme.', ALM_NAME); ?></p>
|
@@ -423,9 +488,9 @@ function alm_shortcode_builder_page(){ ?>
|
|
423 |
<div class="cta">
|
424 |
<h3><?php _e('Did you know?', ALM_NAME); ?></h3>
|
425 |
<img src="<?php echo ALM_ADMIN_URL; ?>img/add-ons/shortcode-editor.jpg"><br/>
|
426 |
-
<?php _e('<p class="addon-intro">You can generate shortcodes while editing pages!</p><p>
|
427 |
</div>
|
428 |
-
</
|
429 |
</div>
|
430 |
</div>
|
431 |
<?php
|
@@ -480,11 +545,11 @@ function alm_example_page(){ ?>
|
|
480 |
<div class="admin ajax-load-more" id="alm-examples">
|
481 |
<div class="wrap">
|
482 |
<div class="header-wrap">
|
483 |
-
<h2><?php _e('Ajax
|
484 |
<p><?php _e('A collection of everyday shortcode usages and implementation examples', ALM_NAME); ?></p>
|
485 |
</div>
|
486 |
<div class="alm-main forceColors">
|
487 |
-
<
|
488 |
<div class="row gist">
|
489 |
<h3 class="heading"><?php _e('Author.php', ALM_NAME); ?></h3>
|
490 |
<div class="expand-wrap">
|
@@ -523,15 +588,15 @@ function alm_example_page(){ ?>
|
|
523 |
<div class="row">
|
524 |
<p class="back2top"><a href="#wpcontent"><i class="fa fa-chevron-up"></i> <?php _e('Back to Top', ALM_NAME); ?></a></p>
|
525 |
</div>
|
526 |
-
</
|
527 |
</div>
|
528 |
-
<
|
529 |
<div class="cta">
|
530 |
<h3><?php _e('Request Examples', ALM_NAME); ?></h3>
|
531 |
<p><?php _e('If you\'re having issue\'s with functionality, please submit example requests through the <a href="https://github.com/dcooney/wordpress-ajax-load-more" target="_blank">GitHub repository</a>. ', ALM_NAME); ?></p>
|
532 |
</div>
|
533 |
<?php include( plugin_dir_path( __FILE__ ) . 'includes/cta/about.php'); ?>
|
534 |
-
</
|
535 |
|
536 |
|
537 |
</div>
|
@@ -552,22 +617,21 @@ function alm_add_ons_page(){ ?>
|
|
552 |
<div class="admin ajax-load-more" id="alm-add-ons">
|
553 |
<div class="wrap">
|
554 |
<div class="header-wrap">
|
555 |
-
<h2><?php _e('Ajax
|
556 |
<p><?php _e('The following Add-ons are available to increase the functionality of Ajax Load More.', ALM_NAME); ?></p>
|
557 |
</div>
|
558 |
-
<div class="alm-main
|
559 |
<!-- Custom Repeater -->
|
560 |
-
<
|
561 |
-
<div class="row">
|
562 |
<h3 class="add-on-title"><?php _e('Custom Repeaters', ALM_NAME); ?></h3>
|
563 |
<div class="expand-wrap">
|
564 |
<div class="section-title">
|
565 |
<img src="<?php echo ALM_ADMIN_URL; ?>img/add-ons/repeater-add-ons.jpg">
|
566 |
</div>
|
567 |
<div class="wrap">
|
568 |
-
<p class="addon-intro"><?php _e('Unlock additional repeater templates and keep your
|
569 |
-
<p><?php _e('The Custom Repeaters add-on will add <strong>five</strong> additional <a href="?page=ajax-load-more-repeaters">repeaters</a> and allow you to select unique repeaters for different content types throughout your theme.</p>
|
570 |
-
<p>It\'s easy, seriously! Simply build each <a href="?page=ajax-load-more-repeaters">repeater</a> just the way you want them, then select a template from the list of available templates while building your <a href="?page=ajax-load-more-shortcode-builder">shortcode</a>.</p><p><strong>Read/Write Access is required!</strong></p>', ALM_NAME); ?>
|
571 |
</div>
|
572 |
</div>
|
573 |
</div>
|
@@ -578,17 +642,21 @@ function alm_add_ons_page(){ ?>
|
|
578 |
echo '<a class="btn" href="http://connekthq.com/plugins/ajax-load-more/custom-repeaters/" target="_blank"><i class="fa fa-download"></i> Purchase & Install</a>';
|
579 |
}
|
580 |
?>
|
581 |
-
</
|
582 |
<!-- End Custom Repeater -->
|
583 |
</div>
|
584 |
|
585 |
-
<
|
|
|
|
|
|
|
|
|
586 |
<div class="cta">
|
587 |
<h3><?php _e('About Add-ons', ALM_NAME); ?></h3>
|
588 |
<p><?php _e('Add-ons are installed as a separate plugin and will receive plug-in update notifications. ', ALM_NAME); ?></p>
|
589 |
</div>
|
590 |
<?php include( plugin_dir_path( __FILE__ ) . 'includes/cta/writeable.php'); ?>
|
591 |
-
</
|
592 |
|
593 |
</div>
|
594 |
</div>
|
@@ -616,20 +684,15 @@ function alm_admin_init(){
|
|
616 |
'alm_general_settings_callback',
|
617 |
'ajax-load-more'
|
618 |
);
|
619 |
-
|
620 |
-
|
621 |
-
__('Disable CSS', ALM_NAME ),
|
622 |
-
'alm_disable_css_callback',
|
623 |
-
'ajax-load-more',
|
624 |
-
'alm_general_settings'
|
625 |
-
);
|
626 |
-
add_settings_field(
|
627 |
'_alm_html5',
|
628 |
__('HTML5 Elements', ALM_NAME ),
|
629 |
'alm_html5_callback',
|
630 |
'ajax-load-more',
|
631 |
'alm_general_settings'
|
632 |
-
);
|
|
|
633 |
add_settings_field(
|
634 |
'_alm_container_type',
|
635 |
__('Container Type', ALM_NAME ),
|
@@ -637,20 +700,38 @@ function alm_admin_init(){
|
|
637 |
'ajax-load-more',
|
638 |
'alm_general_settings'
|
639 |
);
|
|
|
640 |
add_settings_field(
|
641 |
'_alm_classname',
|
642 |
-
__('Container
|
643 |
'alm_class_callback',
|
644 |
'ajax-load-more',
|
645 |
'alm_general_settings'
|
646 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
647 |
add_settings_field(
|
648 |
'_alm_btn_color',
|
649 |
__('Button Color', ALM_NAME ),
|
650 |
'alm_btn_color_callback',
|
651 |
'ajax-load-more',
|
652 |
'alm_general_settings'
|
653 |
-
);
|
654 |
}
|
655 |
|
656 |
|
@@ -663,7 +744,7 @@ function alm_admin_init(){
|
|
663 |
*/
|
664 |
|
665 |
function alm_general_settings_callback() {
|
666 |
-
echo '<p>' . __('Customize your version of Ajax Load More by updating the fields below.</p><p class="small">All changes will be applied globally
|
667 |
}
|
668 |
|
669 |
|
@@ -692,31 +773,33 @@ function alm_disable_css_callback(){
|
|
692 |
$options['_alm_disable_css'] = '0';
|
693 |
|
694 |
echo '<input type="hidden" name="alm_settings[_alm_disable_css]" value="0" />
|
695 |
-
<label><input type="checkbox" name="alm_settings[_alm_disable_css]" value="1"'. (($options['_alm_disable_css']) ? ' checked="checked"' : '') .' /> I want to use my own CSS styles</label>';
|
696 |
-
echo '<p class="desc"><i class="fa fa-file-text-o"></i> <a href="'.ALM_URL.'/core/css/ajax-load-more.css" target="blank">View Ajax Load More CSS</a></p>';
|
|
|
|
|
697 |
}
|
698 |
|
699 |
|
700 |
/*
|
701 |
-
*
|
702 |
-
*
|
703 |
*
|
704 |
-
* @since 2.
|
705 |
*/
|
706 |
|
707 |
-
function
|
708 |
$options = get_option( 'alm_settings' );
|
709 |
-
if(!isset($options['
|
710 |
-
$options['
|
711 |
|
712 |
-
echo '<input type="hidden" name="alm_settings[
|
713 |
-
<label><input type="checkbox" name="alm_settings[
|
714 |
}
|
715 |
|
716 |
|
717 |
/*
|
718 |
* alm_class_callback
|
719 |
-
*
|
720 |
*
|
721 |
* @since 2.0.0
|
722 |
*/
|
@@ -724,7 +807,7 @@ function alm_html5_callback(){
|
|
724 |
function alm_class_callback(){
|
725 |
$options = get_option( 'alm_settings' );
|
726 |
|
727 |
-
echo '<label for="alm_settings[_alm_classname]">Add classes to Ajax Load More container
|
728 |
}
|
729 |
|
730 |
|
@@ -743,10 +826,10 @@ function alm_container_type_callback() {
|
|
743 |
$options['_alm_container_type'] = '1';
|
744 |
|
745 |
$html = '<input type="radio" id="_alm_container_type_one" name="alm_settings[_alm_container_type]" value="1"' . checked( 1, $options['_alm_container_type'], false ) . '/>';
|
746 |
-
$html .= '<label for="_alm_container_type_one"><ul> <span><!-- Ajax Posts Here --></span> </ul></label><br/>';
|
747 |
|
748 |
$html .= '<input type="radio" id="_alm_container_type_two" name="alm_settings[_alm_container_type]" value="2"' . checked( 2, $options['_alm_container_type'], false ) . '/>';
|
749 |
-
$html .= '<label for="_alm_container_type_two"><div> <span><!-- Ajax Posts Here --></span> </div></label>';
|
750 |
|
751 |
echo $html;
|
752 |
|
@@ -793,18 +876,52 @@ function alm_btn_color_callback() {
|
|
793 |
if($color == 'grey')
|
794 |
$selected5 = 'selected="selected"';
|
795 |
|
796 |
-
|
797 |
-
|
|
|
|
|
|
|
|
|
798 |
$html .= '<option value="default" ' . $selected0 .'>Default (Orange)</option>';
|
799 |
$html .= '<option value="blue" ' . $selected1 .'>Blue</option>';
|
800 |
$html .= '<option value="green" ' . $selected2 .'>Green</option>';
|
801 |
$html .= '<option value="red" ' . $selected3 .'>Red</option>';
|
802 |
$html .= '<option value="purple" ' . $selected4 .'>Purple</option>';
|
803 |
$html .= '<option value="grey" ' . $selected5 .'>Grey</option>';
|
|
|
804 |
$html .= '</select>';
|
805 |
|
|
|
806 |
echo $html;
|
807 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
808 |
}
|
809 |
|
810 |
|
154 |
|
155 |
function alm_enqueue_admin_scripts(){
|
156 |
|
157 |
+
//Load Admin CSS
|
158 |
+
wp_enqueue_style( 'admin-css', ALM_ADMIN_URL. 'css/admin.css');
|
159 |
+
wp_enqueue_style( 'core-css', ALM_URL. '/core/css/ajax-load-more.css');
|
160 |
+
wp_enqueue_style( 'font-awesome', '//netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css');
|
161 |
+
|
162 |
+
//Load CodeMirror Syntax Highlighting if on Repater Template page
|
163 |
+
$screen = get_current_screen();
|
164 |
+
if ( in_array( $screen->id, array( 'ajax-load-more_page_ajax-load-more-repeaters') ) ){
|
165 |
+
|
166 |
+
//CodeMirror CSS
|
167 |
+
wp_enqueue_style( 'codemirror-css', ALM_ADMIN_URL. 'codemirror/lib/codemirror.css' );
|
168 |
+
|
169 |
+
//CodeMirror JS
|
170 |
+
wp_enqueue_script( 'codemirror', ALM_ADMIN_URL. 'codemirror/lib/codemirror.js');
|
171 |
+
wp_enqueue_script( 'codemirror-matchbrackets', ALM_ADMIN_URL. 'codemirror/addon/edit/matchbrackets.js' );
|
172 |
+
wp_enqueue_script( 'codemirror-htmlmixed', ALM_ADMIN_URL. 'codemirror/mode/htmlmixed/htmlmixed.js' );
|
173 |
+
wp_enqueue_script( 'codemirror-xml', ALM_ADMIN_URL. 'codemirror/mode/xml/xml.js' );
|
174 |
+
wp_enqueue_script( 'codemirror-javascript', ALM_ADMIN_URL. 'codemirror/mode/javascript/javascript.js' );
|
175 |
+
wp_enqueue_script( 'codemirror-mode-css', ALM_ADMIN_URL. 'codemirror/mode/css/css.js' );
|
176 |
+
wp_enqueue_script( 'codemirror-clike', ALM_ADMIN_URL. 'codemirror/mode/clike/clike.js' );
|
177 |
+
wp_enqueue_script( 'codemirror-php', ALM_ADMIN_URL. 'codemirror/mode/php/php.js' );
|
178 |
+
|
179 |
+
}
|
180 |
+
|
181 |
+
//Load JS
|
182 |
+
wp_enqueue_script( 'select2', ALM_ADMIN_URL. 'js/libs/select2.min.js', array( 'jquery' ));
|
183 |
+
wp_enqueue_script( 'shortcode-builder', ALM_ADMIN_URL. 'shortcode-builder/js/shortcode-builder.js', array( 'jquery' ));
|
184 |
}
|
185 |
|
186 |
|
197 |
<div class="wrap">
|
198 |
<div class="header-wrap">
|
199 |
<h2><?php echo ALM_TITLE; ?> <span><?php echo ALM_VERSION; ?></span></h2>
|
200 |
+
<p>A WordPress plugin for lazy loading posts with Ajax</p>
|
201 |
</div>
|
202 |
<div class="alm-main">
|
203 |
+
<div class="group">
|
204 |
<form action="options.php" method="post">
|
205 |
<?php
|
206 |
settings_fields( 'alm-setting-group' );
|
207 |
do_settings_sections( 'ajax-load-more' );
|
208 |
//get the older values, wont work the first time
|
209 |
$options = get_option( '_alm_settings' ); ?>
|
210 |
+
<div class="row no-brd">
|
211 |
<?php submit_button('Save Settings'); ?>
|
212 |
</div>
|
213 |
</form>
|
214 |
+
</div>
|
215 |
</div>
|
216 |
+
<div class="alm-sidebar">
|
217 |
<?php include( plugin_dir_path( __FILE__ ) . 'includes/cta/resources.php'); ?>
|
218 |
<?php include( plugin_dir_path( __FILE__ ) . 'includes/cta/about.php'); ?>
|
219 |
+
</div>
|
220 |
|
221 |
</div>
|
222 |
</div>
|
236 |
<div class="admin ajax-load-more" id="alm-repeaters">
|
237 |
<div class="wrap">
|
238 |
<div class="header-wrap">
|
239 |
+
<h2><?php _e('Ajax Load More: Repeater Templates', ALM_NAME); ?></h2>
|
240 |
<p><?php _e('The library of available templates to use throughout your theme', ALM_NAME); ?></p>
|
241 |
</div>
|
242 |
<div class="alm-main form-table repeaters">
|
243 |
+
|
244 |
<!-- Repeaters -->
|
245 |
+
<div class="group">
|
246 |
+
<?php
|
247 |
+
if (has_action('alm_custom_repeaters')){ ?>
|
248 |
+
<span class="toggle-all"><span class="inner-wrap"><em class="collapse"><?php _e('Collapse All', ALM_NAME); ?></em><em class="expand"><?php _e('Expand All', ALM_NAME); ?></em></span></span>
|
249 |
+
<?php } ?>
|
250 |
+
|
251 |
+
<!-- Default -->
|
252 |
<div class="row default-repeater">
|
253 |
<?php
|
254 |
$filename = ALM_PATH. 'core/repeater/default.php';
|
259 |
<h3 class="heading"><?php _e('Default Template', ALM_NAME); ?></h3>
|
260 |
<div class="expand-wrap">
|
261 |
<div class="wrap repeater-wrap" data-name="default">
|
262 |
+
<label class="template-title" for="template-default"><?php _e('Enter the HTML and PHP code for the default template', ALM_NAME); ?></label>
|
263 |
+
<textarea rows="10" id="template-default" class="_alm_repeater"><?php echo $contents; ?></textarea>
|
264 |
+
<script>
|
265 |
+
var editorDefault = CodeMirror.fromTextArea(document.getElementById("template-default"), {
|
266 |
+
mode: "application/x-httpd-php",
|
267 |
+
lineNumbers: true,
|
268 |
+
lineWrapping: true,
|
269 |
+
indentUnit: 0,
|
270 |
+
matchBrackets: true,
|
271 |
+
//theme: 'pastel-on-dark',
|
272 |
+
viewportMargin: Infinity,
|
273 |
+
extraKeys: {"Ctrl-Space": "autocomplete"},
|
274 |
+
});
|
275 |
+
</script>
|
276 |
+
<input type="submit" value="<?php _e('Save Template', ALM_NAME); ?>" class="button button-primary save-repeater" data-editor-id="template-default">
|
277 |
<div class="saved-response"> </div>
|
278 |
</div>
|
279 |
</div>
|
280 |
+
</div>
|
281 |
+
<?php
|
282 |
+
if (!has_action('alm_get_custom_repeaters')) {
|
283 |
+
echo '<div class="row no-brd">';
|
284 |
+
include( ALM_PATH. 'admin/includes/cta/extend.php');
|
285 |
+
echo '</div>';
|
286 |
+
}
|
287 |
+
?>
|
|
|
288 |
<!-- End Default -->
|
289 |
<?php
|
290 |
if (has_action('alm_custom_repeaters'))
|
302 |
* @since 2.0.0
|
303 |
*/
|
304 |
|
305 |
+
_alm_admin.saveRepeater = function(btn, editorId) {
|
306 |
var container = btn.parent('.repeater-wrap'),
|
307 |
el = $('textarea._alm_repeater', container),
|
|
|
308 |
btn = btn,
|
309 |
+
value = '',
|
310 |
repeater = container.data('name'),
|
311 |
alias = ($('input._alm_repeater_alias', container).length) ? $('input._alm_repeater_alias', container).val() : '',
|
312 |
responseText = $(".saved-response", container);
|
313 |
|
314 |
+
//Get value from CodeMirroweditor
|
315 |
+
|
316 |
+
// Default Template
|
317 |
+
if(editorId === 'template-default')
|
318 |
+
value = editorDefault.getValue();
|
319 |
+
|
320 |
+
//Custom Repeater template add-on
|
321 |
+
if(editorId === 'template-repeater2')
|
322 |
+
value = editor_repeater2.getValue();
|
323 |
+
|
324 |
+
if(editorId === 'template-repeater3')
|
325 |
+
value = editor_repeater3.getValue();
|
326 |
+
|
327 |
+
if(editorId === 'template-repeater4')
|
328 |
+
value = editor_repeater4.getValue();
|
329 |
+
|
330 |
+
if(editorId === 'template-repeater5')
|
331 |
+
value = editor_repeater5.getValue();
|
332 |
+
|
333 |
+
if(editorId === 'template-repeater6')
|
334 |
+
value = editor_repeater6.getValue();
|
335 |
+
|
336 |
+
if(value === '' || value === 'undefined'){
|
337 |
+
alert("Sorry, an error has occured");
|
338 |
+
return false;
|
339 |
+
}
|
340 |
+
|
341 |
//If submit button has changed class.
|
342 |
if (btn.hasClass('changed')) { // If repeater value has changed.
|
343 |
responseText.addClass('loading').html('<?php _e('Saving data...', ALM_NAME) ?>');
|
353 |
},
|
354 |
success: function(e) {
|
355 |
setTimeout(function(){
|
356 |
+
responseText.html('<?php _e('Template saved successfully', ALM_NAME) ?>').removeClass('loading').addClass('saved');
|
357 |
setTimeout(function() {
|
358 |
responseText.html(' ').removeClass('saved');
|
359 |
}, 3000);
|
361 |
btn.removeClass('changed');
|
362 |
},
|
363 |
error: function(xhr, status, error) {
|
364 |
+
responseText.html('<?php _e('Something went wrong and the data could not be saved', ALM_NAME) ?>').removeClass('loading').removeClass('saved');
|
365 |
btn.removeClass('changed');
|
366 |
}
|
367 |
});
|
369 |
}
|
370 |
$('input.save-repeater').each(function(){
|
371 |
$(this).click(function() {
|
372 |
+
var btn = $(this),
|
373 |
+
editorId = btn.data('editor-id');
|
374 |
btn.addClass('changed');
|
375 |
+
_alm_admin.saveRepeater(btn, editorId);
|
376 |
});
|
377 |
});
|
378 |
});
|
379 |
</script>
|
380 |
+
</div>
|
381 |
<!-- End Repeaters -->
|
382 |
</div>
|
383 |
+
<div class="alm-sidebar">
|
384 |
<div class="cta">
|
385 |
<h3><?php _e('Templating Help', ALM_NAME); ?></h3>
|
386 |
<div class="item">
|
399 |
</div>
|
400 |
</div>
|
401 |
<?php include( plugin_dir_path( __FILE__ ) . 'includes/cta/writeable.php'); ?>
|
402 |
+
</div>
|
403 |
</div>
|
404 |
</div>
|
405 |
|
465 |
<div class="admin ajax-load-more" id="alm-builder">
|
466 |
<div class="wrap">
|
467 |
<div class="header-wrap">
|
468 |
+
<h2><?php _e('Ajax Load More: Shortcode Builder', ALM_NAME); ?></h2>
|
469 |
<p><?php _e('Create your own Ajax Load More <a href="http://en.support.wordpress.com/shortcodes/" target="_blank">shortcode</a> by adjusting the values below', ALM_NAME); ?></p>
|
470 |
</div>
|
471 |
<div class="alm-main">
|
472 |
+
<div class="group">
|
473 |
+
<?php include( plugin_dir_path( __FILE__ ) . 'shortcode-builder/shortcode-builder.php'); ?>
|
474 |
+
<div class="row no-brd">
|
475 |
<p class="back2top"><a href="#wpcontent"><i class="fa fa-chevron-up"></i> <?php _e('Back to Top', ALM_NAME); ?></a></p>
|
476 |
</div>
|
477 |
+
</div>
|
478 |
</div>
|
479 |
+
<div class="alm-sidebar">
|
480 |
<div class="cta">
|
481 |
<h3><?php _e('Shortcode Output', ALM_NAME); ?></h3>
|
482 |
<p><?php _e('Copy and paste the following shortcode into the content editor or widget area of your theme.', ALM_NAME); ?></p>
|
488 |
<div class="cta">
|
489 |
<h3><?php _e('Did you know?', ALM_NAME); ?></h3>
|
490 |
<img src="<?php echo ALM_ADMIN_URL; ?>img/add-ons/shortcode-editor.jpg"><br/>
|
491 |
+
<?php _e('<p class="addon-intro">You can generate shortcodes while editing pages!</p><p>Click the Ajax Load More icon in the content editor toolbar and the <a href="?page=ajax-load-more-shortcode-builder">shortcode builder</a> will open in an overlay window.', ALM_NAME); ?></p>
|
492 |
</div>
|
493 |
+
</div>
|
494 |
</div>
|
495 |
</div>
|
496 |
<?php
|
545 |
<div class="admin ajax-load-more" id="alm-examples">
|
546 |
<div class="wrap">
|
547 |
<div class="header-wrap">
|
548 |
+
<h2><?php _e('Ajax Load More: Examples', ALM_NAME); ?></h2>
|
549 |
<p><?php _e('A collection of everyday shortcode usages and implementation examples', ALM_NAME); ?></p>
|
550 |
</div>
|
551 |
<div class="alm-main forceColors">
|
552 |
+
<div class="group">
|
553 |
<div class="row gist">
|
554 |
<h3 class="heading"><?php _e('Author.php', ALM_NAME); ?></h3>
|
555 |
<div class="expand-wrap">
|
588 |
<div class="row">
|
589 |
<p class="back2top"><a href="#wpcontent"><i class="fa fa-chevron-up"></i> <?php _e('Back to Top', ALM_NAME); ?></a></p>
|
590 |
</div>
|
591 |
+
</div>
|
592 |
</div>
|
593 |
+
<div class="alm-sidebar">
|
594 |
<div class="cta">
|
595 |
<h3><?php _e('Request Examples', ALM_NAME); ?></h3>
|
596 |
<p><?php _e('If you\'re having issue\'s with functionality, please submit example requests through the <a href="https://github.com/dcooney/wordpress-ajax-load-more" target="_blank">GitHub repository</a>. ', ALM_NAME); ?></p>
|
597 |
</div>
|
598 |
<?php include( plugin_dir_path( __FILE__ ) . 'includes/cta/about.php'); ?>
|
599 |
+
</div>
|
600 |
|
601 |
|
602 |
</div>
|
617 |
<div class="admin ajax-load-more" id="alm-add-ons">
|
618 |
<div class="wrap">
|
619 |
<div class="header-wrap">
|
620 |
+
<h2><?php _e('Ajax Load More: Add-ons', ALM_NAME); ?></h2>
|
621 |
<p><?php _e('The following Add-ons are available to increase the functionality of Ajax Load More.', ALM_NAME); ?></p>
|
622 |
</div>
|
623 |
+
<div class="alm-main">
|
624 |
<!-- Custom Repeater -->
|
625 |
+
<div class="group">
|
626 |
+
<div class="row no-brd">
|
627 |
<h3 class="add-on-title"><?php _e('Custom Repeaters', ALM_NAME); ?></h3>
|
628 |
<div class="expand-wrap">
|
629 |
<div class="section-title">
|
630 |
<img src="<?php echo ALM_ADMIN_URL; ?>img/add-ons/repeater-add-ons.jpg">
|
631 |
</div>
|
632 |
<div class="wrap">
|
633 |
+
<p class="addon-intro"><?php _e('Unlock additional repeater templates and keep your WordPress theme looking and feeling fresh.', ALM_NAME); ?></p>
|
634 |
+
<p><?php _e('The Custom Repeaters add-on will add <strong>five</strong> additional <a href="?page=ajax-load-more-repeaters">repeaters</a> and allow you to select unique repeaters for different content types throughout your theme.</p>', ALM_NAME); ?>
|
|
|
635 |
</div>
|
636 |
</div>
|
637 |
</div>
|
642 |
echo '<a class="btn" href="http://connekthq.com/plugins/ajax-load-more/custom-repeaters/" target="_blank"><i class="fa fa-download"></i> Purchase & Install</a>';
|
643 |
}
|
644 |
?>
|
645 |
+
</div>
|
646 |
<!-- End Custom Repeater -->
|
647 |
</div>
|
648 |
|
649 |
+
<div class="alm-sidebar">
|
650 |
+
<div class="cta">
|
651 |
+
<h3><?php _e('About Add-ons', ALM_NAME); ?></h3>
|
652 |
+
<p><?php _e('Add-ons are installed as a separate plugin and will receive plug-in update notifications. ', ALM_NAME); ?></p>
|
653 |
+
</div>
|
654 |
<div class="cta">
|
655 |
<h3><?php _e('About Add-ons', ALM_NAME); ?></h3>
|
656 |
<p><?php _e('Add-ons are installed as a separate plugin and will receive plug-in update notifications. ', ALM_NAME); ?></p>
|
657 |
</div>
|
658 |
<?php include( plugin_dir_path( __FILE__ ) . 'includes/cta/writeable.php'); ?>
|
659 |
+
</div>
|
660 |
|
661 |
</div>
|
662 |
</div>
|
684 |
'alm_general_settings_callback',
|
685 |
'ajax-load-more'
|
686 |
);
|
687 |
+
/*
|
688 |
+
add_settings_field(
|
|
|
|
|
|
|
|
|
|
|
|
|
689 |
'_alm_html5',
|
690 |
__('HTML5 Elements', ALM_NAME ),
|
691 |
'alm_html5_callback',
|
692 |
'ajax-load-more',
|
693 |
'alm_general_settings'
|
694 |
+
);
|
695 |
+
*/
|
696 |
add_settings_field(
|
697 |
'_alm_container_type',
|
698 |
__('Container Type', ALM_NAME ),
|
700 |
'ajax-load-more',
|
701 |
'alm_general_settings'
|
702 |
);
|
703 |
+
|
704 |
add_settings_field(
|
705 |
'_alm_classname',
|
706 |
+
__('Container Classes', ALM_NAME ),
|
707 |
'alm_class_callback',
|
708 |
'ajax-load-more',
|
709 |
'alm_general_settings'
|
710 |
);
|
711 |
+
|
712 |
+
add_settings_field(
|
713 |
+
'_alm_hide_btn',
|
714 |
+
__('Editor Shortcode Button', ALM_NAME ),
|
715 |
+
'alm_hide_btn_callback',
|
716 |
+
'ajax-load-more',
|
717 |
+
'alm_general_settings'
|
718 |
+
);
|
719 |
+
|
720 |
+
add_settings_field(
|
721 |
+
'_alm_disable_css',
|
722 |
+
__('Disable CSS', ALM_NAME ),
|
723 |
+
'alm_disable_css_callback',
|
724 |
+
'ajax-load-more',
|
725 |
+
'alm_general_settings'
|
726 |
+
);
|
727 |
+
|
728 |
add_settings_field(
|
729 |
'_alm_btn_color',
|
730 |
__('Button Color', ALM_NAME ),
|
731 |
'alm_btn_color_callback',
|
732 |
'ajax-load-more',
|
733 |
'alm_general_settings'
|
734 |
+
);
|
735 |
}
|
736 |
|
737 |
|
744 |
*/
|
745 |
|
746 |
function alm_general_settings_callback() {
|
747 |
+
echo '<p>' . __('Customize your version of Ajax Load More by updating the fields below.</p><p class="small">All changes will be applied globally throughout your theme.', ALM_NAME) . '</p>';
|
748 |
}
|
749 |
|
750 |
|
773 |
$options['_alm_disable_css'] = '0';
|
774 |
|
775 |
echo '<input type="hidden" name="alm_settings[_alm_disable_css]" value="0" />
|
776 |
+
<label><input type="checkbox" id="alm_disable_css_input" name="alm_settings[_alm_disable_css]" value="1"'. (($options['_alm_disable_css']) ? ' checked="checked"' : '') .' /> '.__('I want to use my own CSS styles', ALM_NAME).'</label>';
|
777 |
+
echo '<p class="desc"><i class="fa fa-file-text-o"></i> <a href="'.ALM_URL.'/core/css/ajax-load-more.css" target="blank">'.__('View Ajax Load More CSS', ALM_NAME).'</a></p>';
|
778 |
+
?>
|
779 |
+
<?php
|
780 |
}
|
781 |
|
782 |
|
783 |
/*
|
784 |
+
* alm_hide_btn_callback
|
785 |
+
* Disbale the ALM shortcode button in the WordPress content editor
|
786 |
*
|
787 |
+
* @since 2.2.1
|
788 |
*/
|
789 |
|
790 |
+
function alm_hide_btn_callback(){
|
791 |
$options = get_option( 'alm_settings' );
|
792 |
+
if(!isset($options['_alm_hide_btn']))
|
793 |
+
$options['_alm_hide_btn'] = '0';
|
794 |
|
795 |
+
echo '<input type="hidden" name="alm_settings[_alm_hide_btn]" value="0" />
|
796 |
+
<label><input type="checkbox" name="alm_settings[_alm_hide_btn]" value="1"'. (($options['_alm_hide_btn']) ? ' checked="checked"' : '') .' /> '.__('Hide shortcode button in WYSIWYG editor', ALM_NAME).'<p class="desc"></p></label>';
|
797 |
}
|
798 |
|
799 |
|
800 |
/*
|
801 |
* alm_class_callback
|
802 |
+
* Add classes to the Ajax Load More wrapper
|
803 |
*
|
804 |
* @since 2.0.0
|
805 |
*/
|
807 |
function alm_class_callback(){
|
808 |
$options = get_option( 'alm_settings' );
|
809 |
|
810 |
+
echo '<label for="alm_settings[_alm_classname]">'.__('Add classes to Ajax Load More container', ALM_NAME).'</label><br/><input type="text" id="alm_settings[_alm_classname]" name="alm_settings[_alm_classname]" value="'.$options['_alm_classname'].'" placeholder="posts listing etc..." /> ';
|
811 |
}
|
812 |
|
813 |
|
826 |
$options['_alm_container_type'] = '1';
|
827 |
|
828 |
$html = '<input type="radio" id="_alm_container_type_one" name="alm_settings[_alm_container_type]" value="1"' . checked( 1, $options['_alm_container_type'], false ) . '/>';
|
829 |
+
$html .= '<label for="_alm_container_type_one"><ul> <span><!-- '.__('Ajax Posts Here', ALM_NAME).' --></span> </ul></label><br/>';
|
830 |
|
831 |
$html .= '<input type="radio" id="_alm_container_type_two" name="alm_settings[_alm_container_type]" value="2"' . checked( 2, $options['_alm_container_type'], false ) . '/>';
|
832 |
+
$html .= '<label for="_alm_container_type_two"><div> <span><!-- '.__('Ajax Posts Here', ALM_NAME).' --></span> </div></label>';
|
833 |
|
834 |
echo $html;
|
835 |
|
876 |
if($color == 'grey')
|
877 |
$selected5 = 'selected="selected"';
|
878 |
|
879 |
+
$selected6 = '';
|
880 |
+
if($color == 'white')
|
881 |
+
$selected5 = 'selected="selected"';
|
882 |
+
|
883 |
+
$html = '<label for="alm_settings_btn_color">'.__('Choose your load more button color', ALM_NAME).'</label><br/>';
|
884 |
+
$html .= '<select id="alm_settings_btn_color" name="alm_settings[_alm_btn_color]">';
|
885 |
$html .= '<option value="default" ' . $selected0 .'>Default (Orange)</option>';
|
886 |
$html .= '<option value="blue" ' . $selected1 .'>Blue</option>';
|
887 |
$html .= '<option value="green" ' . $selected2 .'>Green</option>';
|
888 |
$html .= '<option value="red" ' . $selected3 .'>Red</option>';
|
889 |
$html .= '<option value="purple" ' . $selected4 .'>Purple</option>';
|
890 |
$html .= '<option value="grey" ' . $selected5 .'>Grey</option>';
|
891 |
+
$html .= '<option value="white" ' . $selected6 .'>White</option>';
|
892 |
$html .= '</select>';
|
893 |
|
894 |
+
$html .= '<div class="ajax-load-more-wrap '.$color.'"><span>'.__('Preview', ALM_NAME) .'</span><button class="alm-load-more-btn loading" disabled="disabled">Show More</button></div>';
|
895 |
echo $html;
|
896 |
+
?>
|
897 |
+
<script>
|
898 |
+
//Button preview
|
899 |
+
var colorArray = "default grey purple green red blue white";
|
900 |
+
jQuery("select#alm_settings_btn_color").change(function() {
|
901 |
+
var color = jQuery(this).val();
|
902 |
+
jQuery('.ajax-load-more-wrap').removeClass(colorArray);
|
903 |
+
jQuery('.ajax-load-more-wrap').addClass(color);
|
904 |
+
});
|
905 |
+
jQuery("select#alm_settings_btn_color").click(function(e){
|
906 |
+
e.preventDefault();
|
907 |
+
});
|
908 |
+
|
909 |
+
// Check if Disable CSS === true
|
910 |
+
if(jQuery('input#alm_disable_css_input').is(":checked")){
|
911 |
+
//alert("true");
|
912 |
+
jQuery('input#alm_disable_css_input').parent().parent().parent('tr').next('tr').hide();
|
913 |
+
}
|
914 |
+
jQuery('input#alm_disable_css_input').change(function() {
|
915 |
+
var el = jQuery(this);
|
916 |
+
if(el.is(":checked")) {
|
917 |
+
el.parent().parent().parent('tr').next('tr').hide();
|
918 |
+
}else{
|
919 |
+
el.parent().parent().parent('tr').next('tr').show();
|
920 |
+
}
|
921 |
+
});
|
922 |
+
|
923 |
+
</script>
|
924 |
+
<?php
|
925 |
}
|
926 |
|
927 |
|
admin/codemirror/addon/edit/closebrackets.js
ADDED
@@ -0,0 +1,158 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
var DEFAULT_BRACKETS = "()[]{}''\"\"";
|
13 |
+
var DEFAULT_EXPLODE_ON_ENTER = "[]{}";
|
14 |
+
var SPACE_CHAR_REGEX = /\s/;
|
15 |
+
|
16 |
+
var Pos = CodeMirror.Pos;
|
17 |
+
|
18 |
+
CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {
|
19 |
+
if (old != CodeMirror.Init && old)
|
20 |
+
cm.removeKeyMap("autoCloseBrackets");
|
21 |
+
if (!val) return;
|
22 |
+
var pairs = DEFAULT_BRACKETS, explode = DEFAULT_EXPLODE_ON_ENTER;
|
23 |
+
if (typeof val == "string") pairs = val;
|
24 |
+
else if (typeof val == "object") {
|
25 |
+
if (val.pairs != null) pairs = val.pairs;
|
26 |
+
if (val.explode != null) explode = val.explode;
|
27 |
+
}
|
28 |
+
var map = buildKeymap(pairs);
|
29 |
+
if (explode) map.Enter = buildExplodeHandler(explode);
|
30 |
+
cm.addKeyMap(map);
|
31 |
+
});
|
32 |
+
|
33 |
+
function charsAround(cm, pos) {
|
34 |
+
var str = cm.getRange(Pos(pos.line, pos.ch - 1),
|
35 |
+
Pos(pos.line, pos.ch + 1));
|
36 |
+
return str.length == 2 ? str : null;
|
37 |
+
}
|
38 |
+
|
39 |
+
// Project the token type that will exists after the given char is
|
40 |
+
// typed, and use it to determine whether it would cause the start
|
41 |
+
// of a string token.
|
42 |
+
function enteringString(cm, pos, ch) {
|
43 |
+
var line = cm.getLine(pos.line);
|
44 |
+
var token = cm.getTokenAt(pos);
|
45 |
+
if (/\bstring2?\b/.test(token.type)) return false;
|
46 |
+
var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4);
|
47 |
+
stream.pos = stream.start = token.start;
|
48 |
+
for (;;) {
|
49 |
+
var type1 = cm.getMode().token(stream, token.state);
|
50 |
+
if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1);
|
51 |
+
stream.start = stream.pos;
|
52 |
+
}
|
53 |
+
}
|
54 |
+
|
55 |
+
function buildKeymap(pairs) {
|
56 |
+
var map = {
|
57 |
+
name : "autoCloseBrackets",
|
58 |
+
Backspace: function(cm) {
|
59 |
+
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
60 |
+
var ranges = cm.listSelections();
|
61 |
+
for (var i = 0; i < ranges.length; i++) {
|
62 |
+
if (!ranges[i].empty()) return CodeMirror.Pass;
|
63 |
+
var around = charsAround(cm, ranges[i].head);
|
64 |
+
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
|
65 |
+
}
|
66 |
+
for (var i = ranges.length - 1; i >= 0; i--) {
|
67 |
+
var cur = ranges[i].head;
|
68 |
+
cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1));
|
69 |
+
}
|
70 |
+
}
|
71 |
+
};
|
72 |
+
var closingBrackets = "";
|
73 |
+
for (var i = 0; i < pairs.length; i += 2) (function(left, right) {
|
74 |
+
if (left != right) closingBrackets += right;
|
75 |
+
map["'" + left + "'"] = function(cm) {
|
76 |
+
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
77 |
+
var ranges = cm.listSelections(), type, next;
|
78 |
+
for (var i = 0; i < ranges.length; i++) {
|
79 |
+
var range = ranges[i], cur = range.head, curType;
|
80 |
+
var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
|
81 |
+
if (!range.empty())
|
82 |
+
curType = "surround";
|
83 |
+
else if (left == right && next == right) {
|
84 |
+
if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left)
|
85 |
+
curType = "skipThree";
|
86 |
+
else
|
87 |
+
curType = "skip";
|
88 |
+
} else if (left == right && cur.ch > 1 &&
|
89 |
+
cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left &&
|
90 |
+
(cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left))
|
91 |
+
curType = "addFour";
|
92 |
+
else if (left == '"' || left == "'") {
|
93 |
+
if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both";
|
94 |
+
else return CodeMirror.Pass;
|
95 |
+
} else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next))
|
96 |
+
curType = "both";
|
97 |
+
else
|
98 |
+
return CodeMirror.Pass;
|
99 |
+
if (!type) type = curType;
|
100 |
+
else if (type != curType) return CodeMirror.Pass;
|
101 |
+
}
|
102 |
+
|
103 |
+
cm.operation(function() {
|
104 |
+
if (type == "skip") {
|
105 |
+
cm.execCommand("goCharRight");
|
106 |
+
} else if (type == "skipThree") {
|
107 |
+
for (var i = 0; i < 3; i++)
|
108 |
+
cm.execCommand("goCharRight");
|
109 |
+
} else if (type == "surround") {
|
110 |
+
var sels = cm.getSelections();
|
111 |
+
for (var i = 0; i < sels.length; i++)
|
112 |
+
sels[i] = left + sels[i] + right;
|
113 |
+
cm.replaceSelections(sels, "around");
|
114 |
+
} else if (type == "both") {
|
115 |
+
cm.replaceSelection(left + right, null);
|
116 |
+
cm.execCommand("goCharLeft");
|
117 |
+
} else if (type == "addFour") {
|
118 |
+
cm.replaceSelection(left + left + left + left, "before");
|
119 |
+
cm.execCommand("goCharRight");
|
120 |
+
}
|
121 |
+
});
|
122 |
+
};
|
123 |
+
if (left != right) map["'" + right + "'"] = function(cm) {
|
124 |
+
var ranges = cm.listSelections();
|
125 |
+
for (var i = 0; i < ranges.length; i++) {
|
126 |
+
var range = ranges[i];
|
127 |
+
if (!range.empty() ||
|
128 |
+
cm.getRange(range.head, Pos(range.head.line, range.head.ch + 1)) != right)
|
129 |
+
return CodeMirror.Pass;
|
130 |
+
}
|
131 |
+
cm.execCommand("goCharRight");
|
132 |
+
};
|
133 |
+
})(pairs.charAt(i), pairs.charAt(i + 1));
|
134 |
+
return map;
|
135 |
+
}
|
136 |
+
|
137 |
+
function buildExplodeHandler(pairs) {
|
138 |
+
return function(cm) {
|
139 |
+
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
140 |
+
var ranges = cm.listSelections();
|
141 |
+
for (var i = 0; i < ranges.length; i++) {
|
142 |
+
if (!ranges[i].empty()) return CodeMirror.Pass;
|
143 |
+
var around = charsAround(cm, ranges[i].head);
|
144 |
+
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
|
145 |
+
}
|
146 |
+
cm.operation(function() {
|
147 |
+
cm.replaceSelection("\n\n", null);
|
148 |
+
cm.execCommand("goCharLeft");
|
149 |
+
ranges = cm.listSelections();
|
150 |
+
for (var i = 0; i < ranges.length; i++) {
|
151 |
+
var line = ranges[i].head.line;
|
152 |
+
cm.indentLine(line, null, true);
|
153 |
+
cm.indentLine(line + 1, null, true);
|
154 |
+
}
|
155 |
+
});
|
156 |
+
};
|
157 |
+
}
|
158 |
+
});
|
admin/codemirror/addon/edit/closetag.js
ADDED
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
2 |
+
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Tag-closer extension for CodeMirror.
|
6 |
+
*
|
7 |
+
* This extension adds an "autoCloseTags" option that can be set to
|
8 |
+
* either true to get the default behavior, or an object to further
|
9 |
+
* configure its behavior.
|
10 |
+
*
|
11 |
+
* These are supported options:
|
12 |
+
*
|
13 |
+
* `whenClosing` (default true)
|
14 |
+
* Whether to autoclose when the '/' of a closing tag is typed.
|
15 |
+
* `whenOpening` (default true)
|
16 |
+
* Whether to autoclose the tag when the final '>' of an opening
|
17 |
+
* tag is typed.
|
18 |
+
* `dontCloseTags` (default is empty tags for HTML, none for XML)
|
19 |
+
* An array of tag names that should not be autoclosed.
|
20 |
+
* `indentTags` (default is block tags for HTML, none for XML)
|
21 |
+
* An array of tag names that should, when opened, cause a
|
22 |
+
* blank line to be added inside the tag, and the blank line and
|
23 |
+
* closing line to be indented.
|
24 |
+
*
|
25 |
+
* See demos/closetag.html for a usage example.
|
26 |
+
*/
|
27 |
+
|
28 |
+
(function(mod) {
|
29 |
+
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
30 |
+
mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
|
31 |
+
else if (typeof define == "function" && define.amd) // AMD
|
32 |
+
define(["../../lib/codemirror", "../fold/xml-fold"], mod);
|
33 |
+
else // Plain browser env
|
34 |
+
mod(CodeMirror);
|
35 |
+
})(function(CodeMirror) {
|
36 |
+
CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) {
|
37 |
+
if (old != CodeMirror.Init && old)
|
38 |
+
cm.removeKeyMap("autoCloseTags");
|
39 |
+
if (!val) return;
|
40 |
+
var map = {name: "autoCloseTags"};
|
41 |
+
if (typeof val != "object" || val.whenClosing)
|
42 |
+
map["'/'"] = function(cm) { return autoCloseSlash(cm); };
|
43 |
+
if (typeof val != "object" || val.whenOpening)
|
44 |
+
map["'>'"] = function(cm) { return autoCloseGT(cm); };
|
45 |
+
cm.addKeyMap(map);
|
46 |
+
});
|
47 |
+
|
48 |
+
var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param",
|
49 |
+
"source", "track", "wbr"];
|
50 |
+
var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4",
|
51 |
+
"h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
|
52 |
+
|
53 |
+
function autoCloseGT(cm) {
|
54 |
+
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
55 |
+
var ranges = cm.listSelections(), replacements = [];
|
56 |
+
for (var i = 0; i < ranges.length; i++) {
|
57 |
+
if (!ranges[i].empty()) return CodeMirror.Pass;
|
58 |
+
var pos = ranges[i].head, tok = cm.getTokenAt(pos);
|
59 |
+
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
|
60 |
+
if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass;
|
61 |
+
|
62 |
+
var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html";
|
63 |
+
var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose);
|
64 |
+
var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent);
|
65 |
+
|
66 |
+
var tagName = state.tagName;
|
67 |
+
if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);
|
68 |
+
var lowerTagName = tagName.toLowerCase();
|
69 |
+
// Don't process the '>' at the end of an end-tag or self-closing tag
|
70 |
+
if (!tagName ||
|
71 |
+
tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) ||
|
72 |
+
tok.type == "tag" && state.type == "closeTag" ||
|
73 |
+
tok.string.indexOf("/") == (tok.string.length - 1) || // match something like <someTagName />
|
74 |
+
dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 ||
|
75 |
+
closingTagExists(cm, tagName, pos, state, true))
|
76 |
+
return CodeMirror.Pass;
|
77 |
+
|
78 |
+
var indent = indentTags && indexOf(indentTags, lowerTagName) > -1;
|
79 |
+
replacements[i] = {indent: indent,
|
80 |
+
text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">",
|
81 |
+
newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)};
|
82 |
+
}
|
83 |
+
|
84 |
+
for (var i = ranges.length - 1; i >= 0; i--) {
|
85 |
+
var info = replacements[i];
|
86 |
+
cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert");
|
87 |
+
var sel = cm.listSelections().slice(0);
|
88 |
+
sel[i] = {head: info.newPos, anchor: info.newPos};
|
89 |
+
cm.setSelections(sel);
|
90 |
+
if (info.indent) {
|
91 |
+
cm.indentLine(info.newPos.line, null, true);
|
92 |
+
cm.indentLine(info.newPos.line + 1, null, true);
|
93 |
+
}
|
94 |
+
}
|
95 |
+
}
|
96 |
+
|
97 |
+
function autoCloseSlash(cm) {
|
98 |
+
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
99 |
+
var ranges = cm.listSelections(), replacements = [];
|
100 |
+
for (var i = 0; i < ranges.length; i++) {
|
101 |
+
if (!ranges[i].empty()) return CodeMirror.Pass;
|
102 |
+
var pos = ranges[i].head, tok = cm.getTokenAt(pos);
|
103 |
+
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
|
104 |
+
if (tok.type == "string" || tok.string.charAt(0) != "<" ||
|
105 |
+
tok.start != pos.ch - 1 || inner.mode.name != "xml" ||
|
106 |
+
!state.context || !state.context.tagName ||
|
107 |
+
closingTagExists(cm, state.context.tagName, pos, state))
|
108 |
+
return CodeMirror.Pass;
|
109 |
+
replacements[i] = "/" + state.context.tagName + ">";
|
110 |
+
}
|
111 |
+
cm.replaceSelections(replacements);
|
112 |
+
}
|
113 |
+
|
114 |
+
function indexOf(collection, elt) {
|
115 |
+
if (collection.indexOf) return collection.indexOf(elt);
|
116 |
+
for (var i = 0, e = collection.length; i < e; ++i)
|
117 |
+
if (collection[i] == elt) return i;
|
118 |
+
return -1;
|
119 |
+
}
|
120 |
+
|
121 |
+
// If xml-fold is loaded, we use its functionality to try and verify
|
122 |
+
// whether a given tag is actually unclosed.
|
123 |
+
function closingTagExists(cm, tagName, pos, state, newTag) {
|
124 |
+
if (!CodeMirror.scanForClosingTag) return false;
|
125 |
+
var end = Math.min(cm.lastLine() + 1, pos.line + 500);
|
126 |
+
var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end);
|
127 |
+
if (!nextClose || nextClose.tag != tagName) return false;
|
128 |
+
var cx = state.context;
|
129 |
+
// If the immediate wrapping context contains onCx instances of
|
130 |
+
// the same tag, a closing tag only exists if there are at least
|
131 |
+
// that many closing tags of that type following.
|
132 |
+
for (var onCx = newTag ? 1 : 0; cx && cx.tagName == tagName; cx = cx.prev) ++onCx;
|
133 |
+
pos = nextClose.to;
|
134 |
+
for (var i = 1; i < onCx; i++) {
|
135 |
+
var next = CodeMirror.scanForClosingTag(cm, pos, null, end);
|
136 |
+
if (!next || next.tag != tagName) return false;
|
137 |
+
pos = next.to;
|
138 |
+
}
|
139 |
+
return true;
|
140 |
+
}
|
141 |
+
});
|
admin/codemirror/addon/edit/continuelist.js
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 listRE = /^(\s*)([*+-]|(\d+)\.)(\s+)/,
|
15 |
+
unorderedBullets = "*+-";
|
16 |
+
|
17 |
+
CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {
|
18 |
+
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
19 |
+
var ranges = cm.listSelections(), replacements = [];
|
20 |
+
for (var i = 0; i < ranges.length; i++) {
|
21 |
+
var pos = ranges[i].head, match;
|
22 |
+
var inList = cm.getStateAfter(pos.line).list !== false;
|
23 |
+
|
24 |
+
if (!ranges[i].empty() || !inList || !(match = cm.getLine(pos.line).match(listRE))) {
|
25 |
+
cm.execCommand("newlineAndIndent");
|
26 |
+
return;
|
27 |
+
}
|
28 |
+
var indent = match[1], after = match[4];
|
29 |
+
var bullet = unorderedBullets.indexOf(match[2]) >= 0
|
30 |
+
? match[2]
|
31 |
+
: (parseInt(match[3], 10) + 1) + ".";
|
32 |
+
|
33 |
+
replacements[i] = "\n" + indent + bullet + after;
|
34 |
+
}
|
35 |
+
|
36 |
+
cm.replaceSelections(replacements);
|
37 |
+
};
|
38 |
+
});
|
admin/codemirror/addon/edit/matchbrackets.js
ADDED
@@ -0,0 +1,120 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
var ie_lt8 = /MSIE \d/.test(navigator.userAgent) &&
|
13 |
+
(document.documentMode == null || document.documentMode < 8);
|
14 |
+
|
15 |
+
var Pos = CodeMirror.Pos;
|
16 |
+
|
17 |
+
var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};
|
18 |
+
|
19 |
+
function findMatchingBracket(cm, where, strict, config) {
|
20 |
+
var line = cm.getLineHandle(where.line), pos = where.ch - 1;
|
21 |
+
var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
|
22 |
+
if (!match) return null;
|
23 |
+
var dir = match.charAt(1) == ">" ? 1 : -1;
|
24 |
+
if (strict && (dir > 0) != (pos == where.ch)) return null;
|
25 |
+
var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));
|
26 |
+
|
27 |
+
var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);
|
28 |
+
if (found == null) return null;
|
29 |
+
return {from: Pos(where.line, pos), to: found && found.pos,
|
30 |
+
match: found && found.ch == match.charAt(0), forward: dir > 0};
|
31 |
+
}
|
32 |
+
|
33 |
+
// bracketRegex is used to specify which type of bracket to scan
|
34 |
+
// should be a regexp, e.g. /[[\]]/
|
35 |
+
//
|
36 |
+
// Note: If "where" is on an open bracket, then this bracket is ignored.
|
37 |
+
//
|
38 |
+
// Returns false when no bracket was found, null when it reached
|
39 |
+
// maxScanLines and gave up
|
40 |
+
function scanForBracket(cm, where, dir, style, config) {
|
41 |
+
var maxScanLen = (config && config.maxScanLineLength) || 10000;
|
42 |
+
var maxScanLines = (config && config.maxScanLines) || 1000;
|
43 |
+
|
44 |
+
var stack = [];
|
45 |
+
var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/;
|
46 |
+
var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)
|
47 |
+
: Math.max(cm.firstLine() - 1, where.line - maxScanLines);
|
48 |
+
for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {
|
49 |
+
var line = cm.getLine(lineNo);
|
50 |
+
if (!line) continue;
|
51 |
+
var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;
|
52 |
+
if (line.length > maxScanLen) continue;
|
53 |
+
if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);
|
54 |
+
for (; pos != end; pos += dir) {
|
55 |
+
var ch = line.charAt(pos);
|
56 |
+
if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {
|
57 |
+
var match = matching[ch];
|
58 |
+
if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch);
|
59 |
+
else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};
|
60 |
+
else stack.pop();
|
61 |
+
}
|
62 |
+
}
|
63 |
+
}
|
64 |
+
return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;
|
65 |
+
}
|
66 |
+
|
67 |
+
function matchBrackets(cm, autoclear, config) {
|
68 |
+
// Disable brace matching in long lines, since it'll cause hugely slow updates
|
69 |
+
var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;
|
70 |
+
var marks = [], ranges = cm.listSelections();
|
71 |
+
for (var i = 0; i < ranges.length; i++) {
|
72 |
+
var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config);
|
73 |
+
if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {
|
74 |
+
var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
|
75 |
+
marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));
|
76 |
+
if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)
|
77 |
+
marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));
|
78 |
+
}
|
79 |
+
}
|
80 |
+
|
81 |
+
if (marks.length) {
|
82 |
+
// Kludge to work around the IE bug from issue #1193, where text
|
83 |
+
// input stops going to the textare whever this fires.
|
84 |
+
if (ie_lt8 && cm.state.focused) cm.display.input.focus();
|
85 |
+
|
86 |
+
var clear = function() {
|
87 |
+
cm.operation(function() {
|
88 |
+
for (var i = 0; i < marks.length; i++) marks[i].clear();
|
89 |
+
});
|
90 |
+
};
|
91 |
+
if (autoclear) setTimeout(clear, 800);
|
92 |
+
else return clear;
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
var currentlyHighlighted = null;
|
97 |
+
function doMatchBrackets(cm) {
|
98 |
+
cm.operation(function() {
|
99 |
+
if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}
|
100 |
+
currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);
|
101 |
+
});
|
102 |
+
}
|
103 |
+
|
104 |
+
CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {
|
105 |
+
if (old && old != CodeMirror.Init)
|
106 |
+
cm.off("cursorActivity", doMatchBrackets);
|
107 |
+
if (val) {
|
108 |
+
cm.state.matchBrackets = typeof val == "object" ? val : {};
|
109 |
+
cm.on("cursorActivity", doMatchBrackets);
|
110 |
+
}
|
111 |
+
});
|
112 |
+
|
113 |
+
CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);});
|
114 |
+
CodeMirror.defineExtension("findMatchingBracket", function(pos, strict, config){
|
115 |
+
return findMatchingBracket(this, pos, strict, config);
|
116 |
+
});
|
117 |
+
CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){
|
118 |
+
return scanForBracket(this, pos, dir, style, config);
|
119 |
+
});
|
120 |
+
});
|
admin/codemirror/addon/edit/matchtags.js
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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"), require("../fold/xml-fold"));
|
7 |
+
else if (typeof define == "function" && define.amd) // AMD
|
8 |
+
define(["../../lib/codemirror", "../fold/xml-fold"], mod);
|
9 |
+
else // Plain browser env
|
10 |
+
mod(CodeMirror);
|
11 |
+
})(function(CodeMirror) {
|
12 |
+
"use strict";
|
13 |
+
|
14 |
+
CodeMirror.defineOption("matchTags", false, function(cm, val, old) {
|
15 |
+
if (old && old != CodeMirror.Init) {
|
16 |
+
cm.off("cursorActivity", doMatchTags);
|
17 |
+
cm.off("viewportChange", maybeUpdateMatch);
|
18 |
+
clear(cm);
|
19 |
+
}
|
20 |
+
if (val) {
|
21 |
+
cm.state.matchBothTags = typeof val == "object" && val.bothTags;
|
22 |
+
cm.on("cursorActivity", doMatchTags);
|
23 |
+
cm.on("viewportChange", maybeUpdateMatch);
|
24 |
+
doMatchTags(cm);
|
25 |
+
}
|
26 |
+
});
|
27 |
+
|
28 |
+
function clear(cm) {
|
29 |
+
if (cm.state.tagHit) cm.state.tagHit.clear();
|
30 |
+
if (cm.state.tagOther) cm.state.tagOther.clear();
|
31 |
+
cm.state.tagHit = cm.state.tagOther = null;
|
32 |
+
}
|
33 |
+
|
34 |
+
function doMatchTags(cm) {
|
35 |
+
cm.state.failedTagMatch = false;
|
36 |
+
cm.operation(function() {
|
37 |
+
clear(cm);
|
38 |
+
if (cm.somethingSelected()) return;
|
39 |
+
var cur = cm.getCursor(), range = cm.getViewport();
|
40 |
+
range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to);
|
41 |
+
var match = CodeMirror.findMatchingTag(cm, cur, range);
|
42 |
+
if (!match) return;
|
43 |
+
if (cm.state.matchBothTags) {
|
44 |
+
var hit = match.at == "open" ? match.open : match.close;
|
45 |
+
if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: "CodeMirror-matchingtag"});
|
46 |
+
}
|
47 |
+
var other = match.at == "close" ? match.open : match.close;
|
48 |
+
if (other)
|
49 |
+
cm.state.tagOther = cm.markText(other.from, other.to, {className: "CodeMirror-matchingtag"});
|
50 |
+
else
|
51 |
+
cm.state.failedTagMatch = true;
|
52 |
+
});
|
53 |
+
}
|
54 |
+
|
55 |
+
function maybeUpdateMatch(cm) {
|
56 |
+
if (cm.state.failedTagMatch) doMatchTags(cm);
|
57 |
+
}
|
58 |
+
|
59 |
+
CodeMirror.commands.toMatchingTag = function(cm) {
|
60 |
+
var found = CodeMirror.findMatchingTag(cm, cm.getCursor());
|
61 |
+
if (found) {
|
62 |
+
var other = found.at == "close" ? found.open : found.close;
|
63 |
+
if (other) cm.extendSelection(other.to, other.from);
|
64 |
+
}
|
65 |
+
};
|
66 |
+
});
|
admin/codemirror/addon/edit/trailingspace.js
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) {
|
13 |
+
if (prev == CodeMirror.Init) prev = false;
|
14 |
+
if (prev && !val)
|
15 |
+
cm.removeOverlay("trailingspace");
|
16 |
+
else if (!prev && val)
|
17 |
+
cm.addOverlay({
|
18 |
+
token: function(stream) {
|
19 |
+
for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {}
|
20 |
+
if (i > stream.pos) { stream.pos = i; return null; }
|
21 |
+
stream.pos = l;
|
22 |
+
return "trailingspace";
|
23 |
+
},
|
24 |
+
name: "trailingspace"
|
25 |
+
});
|
26 |
+
});
|
27 |
+
});
|
admin/codemirror/lib/codemirror.css
ADDED
@@ -0,0 +1,301 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* BASICS */
|
2 |
+
|
3 |
+
.CodeMirror {
|
4 |
+
/* Set height, width, borders, and global font properties here */
|
5 |
+
font-family: monospace;
|
6 |
+
height: 300px;
|
7 |
+
}
|
8 |
+
.CodeMirror-scroll {
|
9 |
+
/* Set scrolling behaviour here */
|
10 |
+
overflow: auto;
|
11 |
+
}
|
12 |
+
|
13 |
+
/* PADDING */
|
14 |
+
|
15 |
+
.CodeMirror-lines {
|
16 |
+
padding: 4px 0; /* Vertical padding around content */
|
17 |
+
}
|
18 |
+
.CodeMirror pre {
|
19 |
+
padding: 0 4px; /* Horizontal padding of content */
|
20 |
+
}
|
21 |
+
|
22 |
+
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
|
23 |
+
background-color: white; /* The little square between H and V scrollbars */
|
24 |
+
}
|
25 |
+
|
26 |
+
/* GUTTER */
|
27 |
+
|
28 |
+
.CodeMirror-gutters {
|
29 |
+
border-right: 1px solid #ddd;
|
30 |
+
background-color: #f7f7f7;
|
31 |
+
white-space: nowrap;
|
32 |
+
}
|
33 |
+
.CodeMirror-linenumbers {}
|
34 |
+
.CodeMirror-linenumber {
|
35 |
+
padding: 0 3px 0 5px;
|
36 |
+
min-width: 20px;
|
37 |
+
text-align: right;
|
38 |
+
color: #999;
|
39 |
+
-moz-box-sizing: content-box;
|
40 |
+
box-sizing: content-box;
|
41 |
+
}
|
42 |
+
|
43 |
+
.CodeMirror-guttermarker { color: black; }
|
44 |
+
.CodeMirror-guttermarker-subtle { color: #999; }
|
45 |
+
|
46 |
+
/* CURSOR */
|
47 |
+
|
48 |
+
.CodeMirror div.CodeMirror-cursor {
|
49 |
+
border-left: 1px solid black;
|
50 |
+
}
|
51 |
+
/* Shown when moving in bi-directional text */
|
52 |
+
.CodeMirror div.CodeMirror-secondarycursor {
|
53 |
+
border-left: 1px solid silver;
|
54 |
+
}
|
55 |
+
.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
|
56 |
+
width: auto;
|
57 |
+
border: 0;
|
58 |
+
background: #7e7;
|
59 |
+
}
|
60 |
+
.cm-animate-fat-cursor {
|
61 |
+
width: auto;
|
62 |
+
border: 0;
|
63 |
+
-webkit-animation: blink 1.06s steps(1) infinite;
|
64 |
+
-moz-animation: blink 1.06s steps(1) infinite;
|
65 |
+
animation: blink 1.06s steps(1) infinite;
|
66 |
+
}
|
67 |
+
@-moz-keyframes blink {
|
68 |
+
0% { background: #7e7; }
|
69 |
+
50% { background: none; }
|
70 |
+
100% { background: #7e7; }
|
71 |
+
}
|
72 |
+
@-webkit-keyframes blink {
|
73 |
+
0% { background: #7e7; }
|
74 |
+
50% { background: none; }
|
75 |
+
100% { background: #7e7; }
|
76 |
+
}
|
77 |
|