268 lines
8.9 KiB
JavaScript
268 lines
8.9 KiB
JavaScript
|
/* jshint devel: true, onevar: false, smarttabs: true */
|
||
|
/* global AtD, QTags, AtD_l10n_r0ar, edButtons, edButton, switchEditors, AtD_unbind_proofreader_listeners */
|
||
|
/* exported AtD_unbind_proofreader_listeners */
|
||
|
|
||
|
var AtD_qtbutton, autosave;
|
||
|
/* convienence method to restore the text area from the preview div */
|
||
|
function AtD_restore_text_area() {
|
||
|
var content;
|
||
|
|
||
|
/* swap the preview div for the textarea, notice how I have to restore the appropriate class/id/style attributes */
|
||
|
if( jQuery('#atd-content').get(0) ) {
|
||
|
AtD.remove('atd-content');
|
||
|
content = jQuery('#atd-content').html();
|
||
|
} else {
|
||
|
AtD.remove('content');
|
||
|
content = jQuery('#content').html();
|
||
|
}
|
||
|
|
||
|
if ( navigator.appName === 'Microsoft Internet Explorer' ) {
|
||
|
content = content.replace(/<BR.*?class.*?atd_remove_me.*?>/gi, '\n');
|
||
|
}
|
||
|
|
||
|
// Remove emoji replacement images
|
||
|
if ( typeof window.twemoji !== 'undefined' ) {
|
||
|
content = content.replace( /<img [^>]+>/g, function( img ) {
|
||
|
// The images should have class containing 'emoji'
|
||
|
if ( img.indexOf( 'emoji' ) !== -1 ) {
|
||
|
var alt = img.match( /alt="([^"]+)"/ );
|
||
|
|
||
|
if ( alt && alt[1] && window.twemoji.test( alt[1] ) ) {
|
||
|
return alt[1];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return img;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// jQuery('#content').replaceWith( AtD.content_canvas );
|
||
|
jQuery('#content').val( content.replace(/\<\;/g, '<').replace(/\>\;/g, '>').replace(/\&/g, '&') )
|
||
|
.height(AtD.height)
|
||
|
.show();
|
||
|
jQuery('#atd-content').remove();
|
||
|
|
||
|
if ( AtD_qtbutton ) {
|
||
|
/* change the link text back to its original label */
|
||
|
jQuery(AtD_qtbutton).val( AtD.getLang('button_proofread', 'proofread') );
|
||
|
jQuery(AtD_qtbutton).css({ 'color' : '#464646' });
|
||
|
|
||
|
/* enable the toolbar buttons */
|
||
|
jQuery( AtD_qtbutton ).siblings('input').andSelf().attr( 'disabled', false );
|
||
|
}
|
||
|
|
||
|
/* restore autosave */
|
||
|
if ( AtD.autosave !== undefined ) {
|
||
|
if ( window.wp && window.wp.autosave && window.wp.autosave.server ) {
|
||
|
window.wp.autosave.local.resume && window.wp.autosave.local.resume();
|
||
|
window.wp.autosave.server.resume && window.wp.autosave.server.resume();
|
||
|
} else {
|
||
|
autosave = AtD.autosave;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// add the AtD button properly to quicktags
|
||
|
if ( typeof(QTags) !== 'undefined' && QTags.addButton ) {
|
||
|
jQuery(document).ready(function(){
|
||
|
QTags.addButton( 'AtD', AtD_l10n_r0ar.button_proofread, AtD_check );
|
||
|
});
|
||
|
} else {
|
||
|
edButtons[edButtons.length] = new edButton('ed_AtD', 'AtD', '', '', '');
|
||
|
jQuery(document).ready(function($){
|
||
|
$('#ed_AtD').replaceWith('<input type="button" id="ed_AtD" accesskey="" class="ed_button" onclick="AtD_check(this);" value="' + AtD_l10n_r0ar.button_proofread + '" />');
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function AtD_restore_if_proofreading() {
|
||
|
if ( AtD_qtbutton && jQuery(AtD_qtbutton).val() === AtD.getLang('button_edit_text', 'edit text') ) {
|
||
|
AtD_restore_text_area();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function AtD_unbind_proofreader_listeners() {
|
||
|
jQuery('#save-post, #post-preview, #publish, #edButtonPreview').unbind('focus', AtD_restore_if_proofreading );
|
||
|
jQuery('#add_poll, #add_image, #add_video, #add_audio, #add_media').unbind('click', AtD_restore_if_proofreading );
|
||
|
jQuery('#post').unbind('submit', AtD_restore_if_proofreading );
|
||
|
}
|
||
|
|
||
|
function AtD_bind_proofreader_listeners() {
|
||
|
jQuery('#save-post, #post-preview, #publish, #edButtonPreview').focus( AtD_restore_if_proofreading );
|
||
|
jQuery('#add_poll, #add_image, #add_video, #add_audio, #add_media').click( AtD_restore_if_proofreading );
|
||
|
jQuery('#post').submit( AtD_restore_if_proofreading );
|
||
|
}
|
||
|
|
||
|
/* where the magic happens, checks the spelling or restores the form */
|
||
|
function AtD_check(button) {
|
||
|
var callback, divHeight;
|
||
|
|
||
|
if ( jQuery.isFunction( button ) ) {
|
||
|
callback = button;
|
||
|
|
||
|
if ( !AtD_qtbutton ) {
|
||
|
AtD_qtbutton = jQuery( '#qt_content_AtD, #ed_AtD' ).get( 0 );
|
||
|
}
|
||
|
} else {
|
||
|
if ( !button.id ) {
|
||
|
button = button[0];
|
||
|
}
|
||
|
|
||
|
AtD_qtbutton = button;
|
||
|
}
|
||
|
|
||
|
if ( !jQuery('#content').size() ) {
|
||
|
if ( 'undefined' !== typeof callback ) {
|
||
|
callback( 0 );
|
||
|
}
|
||
|
AtD_restore_if_proofreading();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/* If the text of the link says edit comment, then restore the textarea so the user can edit the text */
|
||
|
|
||
|
if ( jQuery(AtD_qtbutton).val() === AtD.getLang('button_edit_text', 'edit text') ) {
|
||
|
AtD_restore_text_area();
|
||
|
} else {
|
||
|
// Disable editor expand/scroll
|
||
|
if ( window.editorExpand && jQuery( '#postdivrich' ).hasClass( 'wp-editor-expand' ) ) {
|
||
|
AtD.wpEditorExpand = true;
|
||
|
// window.editorExpand.off && window.editorExpand.off();
|
||
|
} else {
|
||
|
AtD.wpEditorExpand = false;
|
||
|
}
|
||
|
|
||
|
/* initialize some of the stuff related to this plugin */
|
||
|
if ( ! AtD.height ) {
|
||
|
|
||
|
AtD.height = jQuery('#content').height();
|
||
|
AtD_bind_proofreader_listeners();
|
||
|
|
||
|
/* make it so clicking the Visual button works when AtD is active */
|
||
|
|
||
|
jQuery('#edButtonPreview').attr( 'onclick', null ).click( function() {
|
||
|
AtD_restore_if_proofreading();
|
||
|
switchEditors.go( 'content', 'tinymce' );
|
||
|
});
|
||
|
|
||
|
/* saved the textarea as we need to restore the original one for the toolbar to continue to function properly */
|
||
|
AtD.content_canvas = jQuery('#content');
|
||
|
|
||
|
/* store the autosave, we're going to make it empty during spellcheck to prevent auto saved text from being
|
||
|
over written with empty text */
|
||
|
AtD.autosave = autosave;
|
||
|
} else {
|
||
|
// Update the height
|
||
|
AtD.height = jQuery('#content').height();
|
||
|
}
|
||
|
|
||
|
/* set the spell check link to a link that lets the user edit the text */
|
||
|
/* disable the button to prevent a race condition where content is deleted if proofread is clicked with a check
|
||
|
in progress. */
|
||
|
jQuery(AtD_qtbutton).css({ 'color' : 'red' }).val( AtD.getLang('button_edit_text', 'edit text') ).attr('disabled', true);
|
||
|
|
||
|
/* replace the div */
|
||
|
var $replacement,
|
||
|
$textarea = jQuery('#content'),
|
||
|
text = $textarea.val().replace( /\&/g, '&' ).replace( /</g, '<' ).replace( /\>/g, '>' ),
|
||
|
fontFamily = $textarea.css('font-family'),
|
||
|
fontSize = $textarea.css('font-size'),
|
||
|
lineHeight = $textarea.css('line-height');
|
||
|
|
||
|
if ( navigator.appName === 'Microsoft Internet Explorer' ) {
|
||
|
text = text.replace( /[\n\r\f]/gm, '<BR class="atd_remove_me">' );
|
||
|
}
|
||
|
|
||
|
$replacement = jQuery( '<div class="input" id="atd-content">' + text + '</div>' );
|
||
|
$textarea.after( $replacement ).hide();
|
||
|
|
||
|
divHeight = AtD.height;
|
||
|
// AtD disables resizing of the Text editor, normalize the size of the replacement div.
|
||
|
if ( divHeight < 200 ) {
|
||
|
divHeight = 200;
|
||
|
} else if ( divHeight > 1000 ) {
|
||
|
divHeight = 1000;
|
||
|
}
|
||
|
var toolBarHeight = jQuery('#ed_toolbar').height();
|
||
|
$replacement.css( {
|
||
|
overflow: 'auto',
|
||
|
'background-color': 'white',
|
||
|
color: 'black',
|
||
|
'white-space': 'pre-wrap',
|
||
|
padding: '10px',
|
||
|
'font-family': fontFamily || 'Consolas, Monaco, monospace',
|
||
|
'font-size': fontSize || '13px',
|
||
|
'line-height': lineHeight || '1.5',
|
||
|
height: divHeight,
|
||
|
'margin-top': toolBarHeight+7+'px'
|
||
|
} );
|
||
|
|
||
|
/* kill autosave... :) */
|
||
|
if ( window.wp && window.wp.autosave && window.wp.autosave.server ) {
|
||
|
window.wp.autosave.local.suspend && window.wp.autosave.local.suspend();
|
||
|
window.wp.autosave.server.suspend && window.wp.autosave.server.suspend();
|
||
|
} else {
|
||
|
autosave = function() { };
|
||
|
}
|
||
|
|
||
|
/* disable the toolbar buttons */
|
||
|
jQuery( AtD_qtbutton ).siblings('input').andSelf().attr( 'disabled', true ); // using .arrt instead of .prop so it's compat with older WP and jQuery
|
||
|
|
||
|
/* check the writing in the textarea */
|
||
|
AtD.check('atd-content', {
|
||
|
success: function(errorCount) {
|
||
|
if ( Number( errorCount ) === 0 && typeof callback !== 'function' ) {
|
||
|
alert( AtD.getLang('message_no_errors_found', 'No writing errors were found') );
|
||
|
}
|
||
|
AtD_restore_if_proofreading();
|
||
|
},
|
||
|
|
||
|
ready: function(errorCount) {
|
||
|
jQuery(AtD_qtbutton).attr('disabled', false);
|
||
|
|
||
|
if ( typeof callback === 'function' ) {
|
||
|
callback( errorCount );
|
||
|
}
|
||
|
},
|
||
|
|
||
|
error: function() {
|
||
|
jQuery(AtD_qtbutton).attr('disabled', false);
|
||
|
|
||
|
if ( typeof callback === 'function' ) {
|
||
|
callback( -1 );
|
||
|
} else {
|
||
|
alert( AtD.getLang('message_server_error', 'There was a problem communicating with the Proofreading service. Try again in one minute.') );
|
||
|
}
|
||
|
|
||
|
AtD_restore_if_proofreading();
|
||
|
},
|
||
|
|
||
|
editSelection: function(element) {
|
||
|
var text = prompt( AtD.getLang('dialog_replace_selection', 'Replace selection with:'), element.text() );
|
||
|
|
||
|
if ( text != null ) {
|
||
|
element.replaceWith( text );
|
||
|
}
|
||
|
},
|
||
|
|
||
|
explain: function(url) {
|
||
|
var left = (screen.width / 2) - (480 / 2);
|
||
|
var top = (screen.height / 2) - (380 / 2);
|
||
|
window.open( url, '', 'width=480,height=380,toolbar=0,status=0,resizable=0,location=0,menuBar=0,left=' + left + ',top=' + top).focus();
|
||
|
},
|
||
|
|
||
|
ignore: function(word) {
|
||
|
jQuery.ajax({
|
||
|
type : 'GET',
|
||
|
url : AtD.rpc_ignore + encodeURI( word ).replace( /&/g, '%26'),
|
||
|
format : 'raw',
|
||
|
error : function(XHR, status, error) {
|
||
|
if ( AtD.callback_f !== undefined && AtD.callback_f.error !== undefined ) {
|
||
|
AtD.callback_f.error(status + ': ' + error);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|