PluginProbe
Copy Anything to Clipboard for WordPress – Copy Button, Copy Text & Copy Code / 5.5.3
Copy Anything to Clipboard for WordPress – Copy Button, Copy Text & Copy Code v5.5.3
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 4.1.1 All 78 releases
copy-the-code / assets / js / page.js

page.js in Copy Anything to Clipboard for WordPress – Copy Button, Copy Text & Copy Code 5.5.3, at assets/js/page.js

234 lines 6.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 );
234