최초등록
This commit is contained in:
@@ -0,0 +1,447 @@
|
||||
/*
|
||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||
* Copyright (C) 2003-2010 Frederico Caldeira Knabben
|
||||
*
|
||||
* == BEGIN LICENSE ==
|
||||
*
|
||||
* Licensed under the terms of any of the following licenses at your
|
||||
* choice:
|
||||
*
|
||||
* - GNU General Public License Version 2 or later (the "GPL")
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||
* http://www.gnu.org/licenses/lgpl.html
|
||||
*
|
||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||
*
|
||||
* == END LICENSE ==
|
||||
*/
|
||||
|
||||
var FCKScayt;
|
||||
|
||||
(function()
|
||||
{
|
||||
var scaytOnLoad = [] ;
|
||||
var isEngineLoaded = ( FCK && FCK.EditorWindow && FCK.EditorWindow.parent.parent.scayt)
|
||||
? true : false ;
|
||||
var scaytEnable = false;
|
||||
var scaytReady = false;
|
||||
|
||||
function ScaytEngineLoad( callback )
|
||||
{
|
||||
if ( isEngineLoaded )
|
||||
return ;
|
||||
|
||||
isEngineLoaded = true ;
|
||||
var top = FCK.EditorWindow.parent.parent;
|
||||
|
||||
var init = function ()
|
||||
{
|
||||
window.scayt = top.scayt ;
|
||||
InitScayt() ;
|
||||
var ScaytCombobox = FCKToolbarItems.LoadedItems[ 'ScaytCombobox' ] ;
|
||||
ScaytCombobox && ScaytCombobox.SetEnabled( scyt_control && scyt_control.disabled ) ;
|
||||
InitSetup() ;
|
||||
};
|
||||
|
||||
if ( top.scayt )
|
||||
{
|
||||
init() ;
|
||||
return ;
|
||||
}
|
||||
|
||||
// Compose the scayt url.
|
||||
if (FCK.Config.ScaytCustomUrl)
|
||||
FCK.Config.ScaytCustomUrl = new String(FCK.Config.ScaytCustomUrl).replace( new RegExp( "^http[s]*:\/\/"),"") ;
|
||||
|
||||
var protocol = document.location.protocol ;
|
||||
var baseUrl = FCK.Config.ScaytCustomUrl ||'svc.spellchecker.net/spellcheck3/lf/scayt/scayt4.js' ;
|
||||
var scaytUrl = protocol + '//' + baseUrl ;
|
||||
var scaytConfigBaseUrl = ParseUrl( scaytUrl ).path + '/' ;
|
||||
|
||||
// SCAYT is targetted to CKEditor, so we need this trick to make it work here.
|
||||
var CKEDITOR = top.window.CKEDITOR || ( top.window.CKEDITOR = {} ) ;
|
||||
CKEDITOR._djScaytConfig =
|
||||
{
|
||||
baseUrl : scaytConfigBaseUrl,
|
||||
addOnLoad : function()
|
||||
{
|
||||
init();
|
||||
},
|
||||
isDebug : false
|
||||
};
|
||||
|
||||
|
||||
if ( callback )
|
||||
scaytOnLoad.push( callback ) ;
|
||||
|
||||
DoLoadScript( scaytUrl ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* DoLoadScript - load scripts with dinamic tag script creating
|
||||
* @param string url
|
||||
*/
|
||||
function DoLoadScript( url )
|
||||
{
|
||||
if (!url)
|
||||
return false ;
|
||||
var top = FCK.EditorWindow.parent.parent;
|
||||
var s = top.document.createElement('script') ;
|
||||
s.type = 'text/javascript' ;
|
||||
s.src = url ;
|
||||
top.document.getElementsByTagName('head')[0].appendChild(s) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
function ParseUrl( data )
|
||||
{
|
||||
var m = data.match(/(.*)[\/\\]([^\/\\]+\.\w+)$/) ;
|
||||
return m ? { path: m[1], file: m[2] } : data ;
|
||||
}
|
||||
|
||||
function createScaytControl ()
|
||||
{
|
||||
// Get public scayt params.
|
||||
var oParams = {} ;
|
||||
var top = FCK.EditorWindow.parent.parent;
|
||||
oParams.srcNodeRef = FCK.EditingArea.IFrame; // Get the iframe.
|
||||
// syntax : AppName.AppVersion@AppRevision
|
||||
//oParams.assocApp = "FCKEDITOR." + FCKeditorAPI.Varsion + "@" + FCKeditorAPI.VersionBuild;
|
||||
oParams.customerid = FCK.Config.ScaytCustomerid ;
|
||||
oParams.customDictionaryName = FCK.Config.ScaytCustomDictionaryName ;
|
||||
oParams.userDictionaryName = FCK.Config.ScaytUserDictionaryName ;
|
||||
oParams.defLang = FCK.Config.ScaytDefLang ;
|
||||
|
||||
var scayt = top.scayt;
|
||||
var scayt_control = window.scayt_control = new scayt( oParams ) ;
|
||||
}
|
||||
|
||||
function InitScayt()
|
||||
{
|
||||
createScaytControl();
|
||||
|
||||
var scayt_control = window.scayt_control ;
|
||||
|
||||
if ( scayt_control )
|
||||
{
|
||||
scayt_control.setDisabled( false ) ;
|
||||
scaytReady = true;
|
||||
scaytEnable = !scayt_control.disabled ;
|
||||
|
||||
// set default scayt status
|
||||
var ScaytCombobox = FCKToolbarItems.LoadedItems[ 'ScaytCombobox' ] ;
|
||||
ScaytCombobox && ScaytCombobox.Enable() ;
|
||||
ShowScaytState() ;
|
||||
}
|
||||
|
||||
for ( var i = 0 ; i < scaytOnLoad.length ; i++ )
|
||||
{
|
||||
try
|
||||
{
|
||||
scaytOnLoad[i].call( this ) ;
|
||||
}
|
||||
catch(err)
|
||||
{}
|
||||
}
|
||||
}
|
||||
|
||||
// ###
|
||||
// SCAYT command class.
|
||||
var ScaytCommand = function()
|
||||
{
|
||||
name = 'Scayt' ;
|
||||
}
|
||||
|
||||
ScaytCommand.prototype.Execute = function( action )
|
||||
{
|
||||
switch ( action )
|
||||
{
|
||||
case 'Options' :
|
||||
case 'Langs' :
|
||||
case 'About' :
|
||||
if ( isEngineLoaded && scaytReady && !scaytEnable )
|
||||
{
|
||||
ScaytMessage( 'SCAYT is not enabled' );
|
||||
break;
|
||||
}
|
||||
|
||||
if ( isEngineLoaded && scaytReady )
|
||||
FCKDialog.OpenDialog( 'Scayt', 'SCAYT Settings', 'dialog/fck_scayt.html?' + action.toLowerCase(), 343, 343 );
|
||||
break;
|
||||
|
||||
default :
|
||||
if ( !isEngineLoaded )
|
||||
{
|
||||
var me = this;
|
||||
ScaytEngineLoad( function ()
|
||||
{
|
||||
me.SetEnabled( !window.scayt_control.disabled ) ;
|
||||
}) ;
|
||||
|
||||
return true;
|
||||
}
|
||||
else if ( scaytReady )
|
||||
{
|
||||
// Switch the current scayt state.
|
||||
if ( scaytEnable )
|
||||
this.Disable() ;
|
||||
else
|
||||
this.Enable() ;
|
||||
|
||||
ShowScaytState() ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ( !isEngineLoaded )
|
||||
return ScaytMessage( 'SCAYT is not loaded' ) || false;
|
||||
|
||||
if ( !scaytReady )
|
||||
return ScaytMessage( 'SCAYT is not ready' ) || false;
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ScaytCommand.prototype.Enable = function()
|
||||
{
|
||||
window.scayt_control.setDisabled( false ) ;
|
||||
scaytEnable = true;
|
||||
}
|
||||
|
||||
ScaytCommand.prototype.Disable = function()
|
||||
{
|
||||
window.scayt_control.setDisabled( true ) ;
|
||||
scaytEnable = false;
|
||||
}
|
||||
|
||||
ScaytCommand.prototype.SetEnabled = function( state )
|
||||
{
|
||||
if ( state )
|
||||
this.Enable() ;
|
||||
else
|
||||
this.Disable() ;
|
||||
|
||||
ShowScaytState() ;
|
||||
return true;
|
||||
}
|
||||
|
||||
ScaytCommand.prototype.GetState = function()
|
||||
{
|
||||
return FCK_TRISTATE_OFF;
|
||||
}
|
||||
|
||||
function ShowScaytState()
|
||||
{
|
||||
var combo = FCKToolbarItems.GetItem( 'SpellCheck' ) ;
|
||||
|
||||
if ( !combo || !combo._Combo || !combo._Combo._OuterTable )
|
||||
return;
|
||||
|
||||
var bItem = combo._Combo._OuterTable.getElementsByTagName( 'img' )[1] ;
|
||||
var dNode = combo._Combo.Items['trigger'] ;
|
||||
|
||||
if ( scaytEnable )
|
||||
{
|
||||
bItem.style.opacity = '1' ;
|
||||
dNode.innerHTML = GetStatusLabel() ;
|
||||
}
|
||||
else
|
||||
{
|
||||
bItem.style.opacity = '0.5' ;
|
||||
dNode.innerHTML = GetStatusLabel() ;
|
||||
}
|
||||
}
|
||||
|
||||
function GetStatusLabel()
|
||||
{
|
||||
if ( !scaytReady )
|
||||
return '<b>Enable SCAYT</b>' ;
|
||||
|
||||
return scaytEnable ? '<b>Disable SCAYT</b>' : '<b>Enable SCAYT</b>' ;
|
||||
}
|
||||
|
||||
// ###
|
||||
// Class for the toolbar item.
|
||||
var ToolbarScaytComboBox = function( tooltip, style )
|
||||
{
|
||||
this.Command = FCKCommands.GetCommand( 'Scayt' ) ;
|
||||
this.CommandName = 'Scayt' ;
|
||||
this.Label = this.GetLabel() ;
|
||||
this.Tooltip = FCKLang.ScaytTitle ;
|
||||
this.Style = FCK_TOOLBARITEM_ONLYTEXT ; //FCK_TOOLBARITEM_ICONTEXT OR FCK_TOOLBARITEM_ONLYTEXT
|
||||
}
|
||||
|
||||
ToolbarScaytComboBox.prototype = new FCKToolbarSpecialCombo ;
|
||||
|
||||
//Add the items to the combo list
|
||||
ToolbarScaytComboBox.prototype.CreateItems = function()
|
||||
{
|
||||
this._Combo.AddItem( 'Trigger', '<b>Enable SCAYT</b>' );
|
||||
this._Combo.AddItem( 'Options', FCKLang.ScaytTitleOptions || "Options" );
|
||||
this._Combo.AddItem( 'Langs', FCKLang.ScaytTitleLangs || "Languages");
|
||||
this._Combo.AddItem( 'About', FCKLang.ScaytTitleAbout || "About");
|
||||
}
|
||||
|
||||
// Label shown in the toolbar.
|
||||
ToolbarScaytComboBox.prototype.GetLabel = function()
|
||||
{
|
||||
var strip = FCKConfig.SkinPath + 'fck_strip.gif';
|
||||
|
||||
return FCKBrowserInfo.IsIE ?
|
||||
'<div class="TB_Button_Image"><img src="' + strip + '" style="top:-192px"></div>'
|
||||
:
|
||||
'<img class="TB_Button_Image" src="' + FCK_SPACER_PATH + '" style="background-position: 0px -192px;background-image: url(' + strip + ');">';
|
||||
}
|
||||
|
||||
function ScaytMessage( m )
|
||||
{
|
||||
m && alert( m ) ;
|
||||
}
|
||||
|
||||
var ScaytContextCommand = function()
|
||||
{
|
||||
name = 'ScaytContext' ;
|
||||
}
|
||||
|
||||
ScaytContextCommand.prototype.Execute = function( contextInfo )
|
||||
{
|
||||
var action = contextInfo && contextInfo.action,
|
||||
node = action && contextInfo.node,
|
||||
scayt_control = window.scayt_control;
|
||||
|
||||
if ( node )
|
||||
{
|
||||
switch ( action )
|
||||
{
|
||||
case 'Suggestion' :
|
||||
scayt_control.replace( node, contextInfo.suggestion ) ;
|
||||
break ;
|
||||
case 'Ignore' :
|
||||
scayt_control.ignore( node ) ;
|
||||
break ;
|
||||
case 'Ignore All' :
|
||||
scayt_control.ignoreAll( node ) ;
|
||||
break ;
|
||||
case 'Add Word' :
|
||||
var top = FCK.EditorWindow.parent.parent ;
|
||||
top.scayt.addWordToUserDictionary( node ) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Register context menu listeners.
|
||||
function InitSetup()
|
||||
{
|
||||
FCK.ContextMenu.RegisterListener(
|
||||
{
|
||||
AddItems : function( menu )
|
||||
{
|
||||
var top = FCK.EditorWindow.parent.parent;
|
||||
|
||||
var scayt_control = window.scayt_control,
|
||||
scayt = top.scayt;
|
||||
|
||||
if ( !scayt_control )
|
||||
return;
|
||||
|
||||
var node = scayt_control.getScaytNode() ;
|
||||
|
||||
if ( !node )
|
||||
return;
|
||||
|
||||
var suggestions = scayt.getSuggestion( scayt_control.getWord( node ), scayt_control.getLang() ) ;
|
||||
|
||||
if ( !suggestions || !suggestions.length )
|
||||
return;
|
||||
|
||||
menu.AddSeparator() ;
|
||||
|
||||
var maxSuggestions = FCK.Config.ScaytMaxSuggestions || 5 ;
|
||||
var suggAveCount = ( maxSuggestions == -1 ) ? suggestions.length : maxSuggestions ;
|
||||
|
||||
for ( var i = 0 ; i < suggAveCount ; i += 1 )
|
||||
{
|
||||
if ( suggestions[i] )
|
||||
{
|
||||
menu.AddItem( 'ScaytContext', suggestions[i], null, false, {
|
||||
'action' : 'Suggestion',
|
||||
'node' : node,
|
||||
'suggestion' : suggestions[i] } ) ;
|
||||
}
|
||||
}
|
||||
|
||||
menu.AddSeparator() ;
|
||||
|
||||
menu.AddItem( 'ScaytContext', 'Ignore', null, false, { 'action' : 'Ignore', 'node' : node } );
|
||||
menu.AddItem( 'ScaytContext', 'Ignore All', null, false, { 'action' : 'Ignore All', 'node' : node } );
|
||||
menu.AddItem( 'ScaytContext', 'Add Word', null, false, { 'action' : 'Add Word', 'node' : node } );
|
||||
try
|
||||
{
|
||||
if (scaytReady && scaytEnable)
|
||||
scayt_control.fireOnContextMenu( null, FCK.ContextMenu._InnerContextMenu);
|
||||
|
||||
}
|
||||
catch( err ) {}
|
||||
}
|
||||
}) ;
|
||||
|
||||
FCK.Events.AttachEvent( 'OnPaste', function()
|
||||
{
|
||||
window.scayt_control.refresh() ;
|
||||
return true;
|
||||
} ) ;
|
||||
}
|
||||
|
||||
// ##
|
||||
// Register event listeners.
|
||||
|
||||
FCK.Events.AttachEvent( 'OnAfterSetHTML', function()
|
||||
{
|
||||
if ( FCKConfig.SpellChecker == 'SCAYT' )
|
||||
{
|
||||
if ( !isEngineLoaded && FCK.Config.ScaytAutoStartup )
|
||||
ScaytEngineLoad() ;
|
||||
|
||||
if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG && isEngineLoaded && scaytReady )
|
||||
createScaytControl();
|
||||
|
||||
ShowScaytState() ;
|
||||
}
|
||||
} ) ;
|
||||
|
||||
FCK.Events.AttachEvent( 'OnBeforeGetData', function()
|
||||
{
|
||||
scaytReady && window.scayt_control.reset();
|
||||
} ) ;
|
||||
|
||||
FCK.Events.AttachEvent( 'OnAfterGetData', function()
|
||||
{
|
||||
scaytReady && window.scayt_control.refresh();
|
||||
} ) ;
|
||||
|
||||
// ###
|
||||
// The main object that holds the SCAYT interaction in the code.
|
||||
FCKScayt =
|
||||
{
|
||||
CreateCommand : function()
|
||||
{
|
||||
return new ScaytCommand();
|
||||
},
|
||||
|
||||
CreateContextCommand : function()
|
||||
{
|
||||
return new ScaytContextCommand();
|
||||
},
|
||||
|
||||
CreateToolbarItem : function()
|
||||
{
|
||||
return new ToolbarScaytComboBox() ;
|
||||
}
|
||||
} ;
|
||||
})() ;
|
||||
Reference in New Issue
Block a user