PluginProbe
Copy Anything to Clipboard for WordPress – Copy Button, Copy Text & Copy Code / 5.5.4
Copy Anything to Clipboard for WordPress – Copy Button, Copy Text & Copy Code v5.5.4
5.5.4 5.5.3 3.1.0 3.2.0 3.2.1 3.3.0 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.6.0 3.7.0 3.8.0 3.8.1 3.8.2 3.8.3 4.0.0 4.0.2 4.0.3 4.0.4 4.0.5 4.1.0 All 79 releases
← All changes | assets/js/page.js +233 -217 4.0.2 → 5.5.4 View file →
@@ -1,217 +1,233 @@
1 -window.CopyTheCodeToClipboard = (function(window, document, navigator) {
2 - var textArea,
3 - copy;
4 -
5 - function isOS() {
6 - return navigator.userAgent.match( /ipad|iphone/i );
7 - }
8 -
9 - function createTextArea(text) {
10 - textArea = document.createElement( 'textArea' );
11 - textArea.value = text;
12 - document.body.appendChild( textArea );
13 - }
14 -
15 - function selectText() {
16 - var range,
17 - selection;
18 -
19 - if (isOS()) {
20 - range = document.createRange();
21 - range.selectNodeContents( textArea );
22 - selection = window.getSelection();
23 - selection.removeAllRanges();
24 - selection.addRange( range );
25 - textArea.setSelectionRange( 0, 999999 );
26 - } else {
27 - textArea.select();
28 - }
29 - }
30 -
31 - function copyToClipboard() {
32 - document.execCommand( 'copy' );
33 - document.body.removeChild( textArea );
34 - }
35 -
36 - copy = function(text) {
37 - createTextArea( text );
38 - selectText();
39 - copyToClipboard();
40 - };
41 -
42 - return {
43 - copy: copy
44 - };
45 -})( window, document, navigator );
46 -
47 -
48 -(function($) {
49 -
50 - CopyTheCodePage = {
51 -
52 - /**
53 - * Init
54 - */
55 - init: function()
56 - {
57 - this._bind();
58 - this._preview();
59 - $( '.copy-the-code .nav-tab-wrapper > .nav-tab:first-child' ).addClass( 'nav-tab-active' );
60 - },
61 -
62 - _bind: function()
63 - {
64 - $( document ).on( 'input', '[name="button-text"], [name="button-copy-text"], [name="button-title"]', CopyTheCodePage._preview );
65 - $( document ).on( 'change', '[name="style"], [name="button-position"]', CopyTheCodePage._preview );
66 - $( document ).on( 'click', '.copy-the-code-button', CopyTheCodePage.copyCode );
67 - },
68 -
69 - /**
70 - * Copy to Clipboard
71 - */
72 - copyCode: function( event )
73 - {
74 - var btn = $( this ),
75 - preview = $( '#preview' ).find( 'pre' ),
76 - source = btn.parents( '.copy-the-code-wrap' ).find( preview ),
77 - oldText = btn.text();
78 -
79 - var buttonMarkup = $( '.copy-the-code-wrap' ).html() || '';
80 - var copy_as = 'text';
81 - var button_text = $( '[name="button-text"]' ).val() || '';
82 - var button_copy_text = $( '[name="button-copy-text"]' ).val() || '';
83 - var style = $( '[name="style"]' ).val() || 'button';
84 -
85 - if ( 'text' === copy_as ) {
86 - var html = source.text();
87 -
88 - // Remove the 'copy' text.
89 - var tempHTML = html.replace( button_text, '' );
90 -
91 - } else {
92 - var html = source.html();
93 -
94 - // Remove the <copy> button.
95 - var tempHTML = html.replace( buttonMarkup, '' );
96 - }
97 -
98 - // Copy the Code.
99 - var tempPre = $( "<textarea id='temp-pre'>" ),
100 - temp = $( "<textarea>" ),
101 - brRegex = '/<br\s*[/\]?>/gi';
102 -
103 - // Append temporary elements to DOM.
104 - $( "body" ).append( temp );
105 - $( "body" ).append( tempPre );
106 -
107 - // Set temporary HTML markup.
108 - tempPre.html( tempHTML );
109 -
110 - // Format the HTML markup.
111 - temp.val( tempPre.text().replace( brRegex, "\r\n" ) ).select();
112 -
113 - // Support for IOS devices too.
114 - CopyTheCodeToClipboard.copy( tempPre.text().replace( brRegex, "\r\n" ) );
115 -
116 - // Remove temporary elements.
117 - temp.remove();
118 - tempPre.remove();
119 -
120 - // Copied!
121 - btn.text( button_copy_text );
122 - setTimeout(
123 - function() {
124 - if ( 'svg-icon' === style ) {
125 - btn.html( copyTheCode.buttonSvg );
126 - } else {
127 - btn.text( oldText );
128 - }
129 - },
130 - 1000
131 - );
132 - },
133 -
134 - _preview: function() {
135 - var button_position = $( '[name="button-position"]' ).val() || '';
136 - // var value = $( 'select[name="copy-as"]' ).children("option:selected").val() || '';
137 - var style = $( '[name="style"]' ).val() || 'button';
138 - var button_text = $( '[name="button-text"]' ).val() || '';
139 - var button_copy_text = $( '[name="button-copy-text"]' ).val() || '';
140 - var button_title = $( '[name="button-title"]' ).val() || '';
141 - var buttonMarkup = copyTheCode.buttonMarkup || '';
142 -
143 - var markup = '<div class="outer">';
144 - markup += '<div class="inner copy-as-text">';
145 - markup += '<p>Sample Preview 1</p>';
146 - markup += '<pre id="pre-html"></pre>';
147 - markup += '</div>';
148 -
149 - markup += '<div class="inner copy-as-html">';
150 - markup += '<p>Sample Preview 2</p>';
151 - markup += '<pre id="pre-text"></pre>';
152 - markup += '</div>';
153 -
154 - markup += '</div>';
155 -
156 - $( '#preview' ).html( markup );
157 - $( '#preview #pre-html' ).html( copyTheCode.previewMarkup );
158 - $( '#preview #pre-text' ).text( copyTheCode.previewMarkup );
159 -
160 - if ( 'cover' !== style && 'outside' === button_position ) {
161 - $( '#preview pre' ).wrap( '<span class="copy-the-code-style-' + style + ' copy-the-code-wrap copy-the-code-outside-wrap"></span>' );
162 - $( '#preview pre' ).parent().prepend( '<div class="copy-the-code-outside">' + buttonMarkup + '</div>' );
163 - } else {
164 - $( '#preview pre' ).wrap( '<span class="copy-the-code-style-' + style + ' copy-the-code-wrap copy-the-code-inside-wrap"></span>' );
165 - $( '#preview pre' ).append( buttonMarkup );
166 - }
167 -
168 - $( '#preview' ).find( '.copy-the-code-button' ).attr( 'title', button_title );
169 - $( '#preview' ).find( '.copy-the-code-button' ).attr( 'style', style );
170 -
171 - if ( 'svg-icon' === style ) {
172 - $( '[name="button-text"]' ).parents( 'tr' ).hide();
173 - $( '[name="button-position"]' ).parents( 'tr' ).hide();
174 - } else {
175 - $( '[name="button-text"]' ).parents( 'tr' ).show();
176 - $( '[name="button-position"]' ).parents( 'tr' ).show();
177 - }
178 - if ( 'cover' === style ) {
179 - $( '[name="button-position"]' ).parents( 'tr' ).hide();
180 - } else {
181 - $( '[name="button-position"]' ).parents( 'tr' ).show();
182 - }
183 -
184 - switch ( style ) {
185 - case 'svg-icon':
186 - $( '#preview' ).find( '.copy-the-code-button' ).html( copyTheCode.buttonSvg );
187 - break;
188 - case 'cover':
189 - case 'button':
190 - default:
191 - $( '#preview' ).find( '.copy-the-code-button' ).html( button_text );
192 - break;
193 - }
194 -
195 - $( document ).trigger( 'copy-the-code-style-change', style );
196 -
197 - },
198 -
199 - _switch_tab: function( event ) {
200 - $( this ).siblings().removeClass( 'nav-tab-active' );
201 - $( this ).addClass( 'nav-tab-active' );
202 - $( '#' + $( this ).attr( 'data-id' ) ).siblings().hide();
203 - $( '#' + $( this ).attr( 'data-id' ) ).show();
204 - }
205 -
206 - };
207 -
208 - /**
209 - * Initialization
210 - */
211 - $(
212 - function() {
213 - CopyTheCodePage.init();
214 - }
215 - );
216 -
217 -})( jQuery );
1 +window.CopyTheCodeToClipboard = (function(window, document, navigator) {
2 + var textArea,
3 + copy;
4 +
5 + function isOS() {
6 + return navigator.userAgent.match( /ipad|iphone/i );
7 + }
8 +
9 + function createTextArea(text) {
10 + textArea = document.createElement( 'textArea' );
11 + textArea.value = text;
12 + document.body.appendChild( textArea );
13 + }
14 +
15 + function selectText() {
16 + var range,
17 + selection;
18 +
19 + if (isOS()) {
20 + range = document.createRange();
21 + range.selectNodeContents( textArea );
22 + selection = window.getSelection();
23 + selection.removeAllRanges();
24 + selection.addRange( range );
25 + textArea.setSelectionRange( 0, 999999 );
26 + } else {
27 + textArea.select();
28 + }
29 + }
30 +
31 + function copyToClipboard() {
32 + // Use modern Clipboard API (iOS 26+ compatible)
33 + if ( navigator.clipboard && navigator.clipboard.writeText ) {
34 + navigator.clipboard.writeText( textArea.value ).then(
35 + function() {
36 + document.body.removeChild( textArea );
37 + }
38 + ).catch(
39 + function() {
40 + // Fallback to legacy method if Clipboard API fails
41 + document.execCommand( 'copy' );
42 + document.body.removeChild( textArea );
43 + }
44 + );
45 + } else {
46 + // Fallback for older browsers
47 + document.execCommand( 'copy' );
48 + document.body.removeChild( textArea );
49 + }
50 + }
51 +
52 + copy = function(text) {
53 + createTextArea( text );
54 + selectText();
55 + copyToClipboard();
56 + };
57 +
58 + return {
59 + copy: copy
60 + };
61 +})( window, document, navigator );
62 +
63 +
64 +(function($) {
65 +
66 + CopyTheCodePage = {
67 +
68 + /**
69 + * Init
70 + */
71 + init: function()
72 + {
73 + this._bind();
74 + this._preview();
75 + $( '.copy-the-code .nav-tab-wrapper > .nav-tab:first-child' ).addClass( 'nav-tab-active' );
76 + },
77 +
78 + _bind: function()
79 + {
80 + $( document ).on( 'input', '[name="button-text"], [name="button-copy-text"], [name="button-title"]', CopyTheCodePage._preview );
81 + $( document ).on( 'change', '[name="style"], [name="button-position"]', CopyTheCodePage._preview );
82 + $( document ).on( 'click', '.copy-the-code-button', CopyTheCodePage.copyCode );
83 + },
84 +
85 + /**
86 + * Copy to Clipboard
87 + */
88 + copyCode: function( event )
89 + {
90 + var btn = $( this ),
91 + preview = $( '#preview' ).find( 'pre' ),
92 + source = btn.parents( '.copy-the-code-wrap' ).find( preview ),
93 + oldText = btn.text();
94 +
95 + var buttonMarkup = $( '.copy-the-code-wrap' ).html() || '';
96 + var copy_as = 'text';
97 + var button_text = $( '[name="button-text"]' ).val() || '';
98 + var button_copy_text = $( '[name="button-copy-text"]' ).val() || '';
99 + var style = $( '[name="style"]' ).val() || 'button';
100 +
101 + if ( 'text' === copy_as ) {
102 + var html = source.text();
103 +
104 + // Remove the 'copy' text.
105 + var tempHTML = html.replace( button_text, '' );
106 +
107 + } else {
108 + var html = source.html();
109 +
110 + // Remove the <copy> button.
111 + var tempHTML = html.replace( buttonMarkup, '' );
112 + }
113 +
114 + // Copy the Code.
115 + var tempPre = $( "<textarea id='temp-pre'>" ),
116 + temp = $( "<textarea>" ),
117 + brRegex = '/<br\s*[/\]?>/gi';
118 +
119 + // Append temporary elements to DOM.
120 + $( "body" ).append( temp );
121 + $( "body" ).append( tempPre );
122 +
123 + // Set temporary HTML markup.
124 + tempPre.html( tempHTML );
125 +
126 + // Format the HTML markup.
127 + temp.val( tempPre.text().replace( brRegex, "\r\n" ) ).select();
128 +
129 + // Support for IOS devices too.
130 + CopyTheCodeToClipboard.copy( tempPre.text().replace( brRegex, "\r\n" ) );
131 +
132 + // Remove temporary elements.
133 + temp.remove();
134 + tempPre.remove();
135 +
136 + // Copied!
137 + btn.text( button_copy_text );
138 + setTimeout(
139 + function() {
140 + if ( 'svg-icon' === style ) {
141 + btn.html( copyTheCode.buttonSvg );
142 + } else {
143 + btn.text( oldText );
144 + }
145 + },
146 + 1000
147 + );
148 + },
149 +
150 + _preview: function() {
151 + var button_position = $( '[name="button-position"]' ).val() || '';
152 + // var value = $( 'select[name="copy-as"]' ).children("option:selected").val() || '';
153 + var style = $( '[name="style"]' ).val() || 'button';
154 + var button_text = $( '[name="button-text"]' ).val() || '';
155 + var button_copy_text = $( '[name="button-copy-text"]' ).val() || '';
156 + var button_title = $( '[name="button-title"]' ).val() || '';
157 + var buttonMarkup = copyTheCode.buttonMarkup || '';
158 +
159 + var markup = '<div class="outer">';
160 + markup += '<div class="inner copy-as-text">';
161 + markup += '<p>Sample Preview 1</p>';
162 + markup += '<pre id="pre-html"></pre>';
163 + markup += '</div>';
164 +
165 + markup += '<div class="inner copy-as-html">';
166 + markup += '<p>Sample Preview 2</p>';
167 + markup += '<pre id="pre-text"></pre>';
168 + markup += '</div>';
169 +
170 + markup += '</div>';
171 +
172 + $( '#preview' ).html( markup );
173 + $( '#preview #pre-html' ).html( copyTheCode.previewMarkup );
174 + $( '#preview #pre-text' ).text( copyTheCode.previewMarkup );
175 +
176 + if ( 'cover' !== style && 'outside' === button_position ) {
177 + $( '#preview pre' ).wrap( '<span class="copy-the-code-style-' + style + ' copy-the-code-wrap copy-the-code-outside-wrap"></span>' );
178 + $( '#preview pre' ).parent().prepend( '<div class="copy-the-code-outside">' + buttonMarkup + '</div>' );
179 + } else {
180 + $( '#preview pre' ).wrap( '<span class="copy-the-code-style-' + style + ' copy-the-code-wrap copy-the-code-inside-wrap"></span>' );
181 + $( '#preview pre' ).append( buttonMarkup );
182 + }
183 +
184 + $( '#preview' ).find( '.copy-the-code-button' ).attr( 'title', button_title );
185 + $( '#preview' ).find( '.copy-the-code-button' ).attr( 'style', style );
186 +
187 + if ( 'svg-icon' === style ) {
188 + $( '[name="button-text"]' ).parents( 'tr' ).hide();
189 + $( '[name="button-position"]' ).parents( 'tr' ).hide();
190 + } else {
191 + $( '[name="button-text"]' ).parents( 'tr' ).show();
192 + $( '[name="button-position"]' ).parents( 'tr' ).show();
193 + }
194 + if ( 'cover' === style ) {
195 + $( '[name="button-position"]' ).parents( 'tr' ).hide();
196 + } else {
197 + $( '[name="button-position"]' ).parents( 'tr' ).show();
198 + }
199 +
200 + switch ( style ) {
201 + case 'svg-icon':
202 + $( '#preview' ).find( '.copy-the-code-button' ).html( copyTheCode.buttonSvg );
203 + break;
204 + case 'cover':
205 + case 'button':
206 + default:
207 + $( '#preview' ).find( '.copy-the-code-button' ).html( button_text );
208 + break;
209 + }
210 +
211 + $( document ).trigger( 'copy-the-code-style-change', style );
212 +
213 + },
214 +
215 + _switch_tab: function( event ) {
216 + $( this ).siblings().removeClass( 'nav-tab-active' );
217 + $( this ).addClass( 'nav-tab-active' );
218 + $( '#' + $( this ).attr( 'data-id' ) ).siblings().hide();
219 + $( '#' + $( this ).attr( 'data-id' ) ).show();
220 + }
221 +
222 + };
223 +
224 + /**
225 + * Initialization
226 + */
227 + $(
228 + function() {
229 + CopyTheCodePage.init();
230 + }
231 + );
232 +
233 +})( jQuery );