mirror of
https://github.com/UnickSoft/graphonline.git
synced 2025-07-03 16:25:59 +00:00
161 lines
5.8 KiB
JavaScript
Executable File
161 lines
5.8 KiB
JavaScript
Executable File
/*
|
|
* @file text statistics plugin for CKEditor
|
|
* Copyright (C) 2012 Chupurnov Valeriy <leroy@xdan.ru>(http://xdan.ru)
|
|
* @version 1.5
|
|
*
|
|
* == 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 ==
|
|
*
|
|
*/
|
|
|
|
CKEDITOR.plugins.add( 'stat',{
|
|
lang : 'en,ru,fr',
|
|
init : function( editor ){
|
|
var trim = function ( str ){
|
|
return str.replace(/^[\s]+([^\s])/g,'$1').replace(/([^\s])[\s]+$/g,'$1');
|
|
}
|
|
var wordcount = function ( text ) {
|
|
text = text.replace(/(\r\n|\n|\r)/gm, ' ').replace(/ /g, ' ');
|
|
return trim(strip(text)).split(/\s+/).length;
|
|
}
|
|
var getAreaSelection = function () {
|
|
var textArea = editor.textarea.$;
|
|
if ( document.selection ) { //IE
|
|
var bm = document.selection.createRange().getBookmark();
|
|
var sel = textArea.createTextRange();
|
|
sel.moveToBookmark(bm);
|
|
var sleft = textArea.createTextRange();
|
|
sleft.collapse(true);
|
|
sleft.setEndPoint("EndToStart", sel);
|
|
textArea.selectionStart = sleft.text.length
|
|
textArea.selectionEnd = sleft.text.length + sel.text.length;
|
|
textArea.selectedText = sel.text;
|
|
}else if (textArea.selectionStart){ //FF
|
|
textArea.selectedText = textArea.value.substring(textArea.selectionStart,textArea.selectionEnd);
|
|
}
|
|
return textArea.selectedText;
|
|
}
|
|
var getAreaSelection1 = function(){
|
|
var startPos = 0, endPos = 0 , selection ='';
|
|
if ( editor.mode != 'source' ) return '';
|
|
if (typeof(editor.textarea.$.selectionStart) != "undefined") {
|
|
startPos = editor.textarea.$.selectionStart; endPos = editor.textarea.$.selectionEnd;
|
|
}else{
|
|
if (window.getSelection){
|
|
selection = window.getSelection();
|
|
}else if (document.getSelection){
|
|
selection = document.getSelection();
|
|
}else if (document.selection){
|
|
selection = document.selection.createRange().text;
|
|
}
|
|
if( selection ){
|
|
startPos = editor.textarea.$.indexOf(selection);
|
|
if (startPos!= 0)
|
|
endPos = editor.textarea.$.indexOf(selection) + selection.length;
|
|
}
|
|
}
|
|
return editor.textarea.$.value.substring( startPos, endPos );
|
|
}
|
|
var strip = function( str,option ) {
|
|
var key = '';
|
|
var matches = [];
|
|
str += '';
|
|
matches = str.match(/(<\/?[\S][^>]*>|&[a-z]+;)/gi);
|
|
for (key in matches) {
|
|
if ( isNaN(key) )continue;
|
|
str = str.split(matches[key].toString()).join(' ');
|
|
}
|
|
if ( option == 'nospace' )
|
|
return trim( str.replace(/[\s]/gi,'') );
|
|
else
|
|
return str;
|
|
}
|
|
var timerstatText = 0;
|
|
var statText = function(){
|
|
clearTimeout(timerstatText);
|
|
timerstatText = setTimeout(function(){
|
|
var text = editor.getData()+'';
|
|
document.getElementById( 'cke_stat_word_number_'+editor.name )&& (document.getElementById( 'cke_stat_word_number_'+editor.name ).innerHTML = editor.lang.stat.words+':'+wordcount(text));
|
|
document.getElementById( 'cke_stat_'+editor.name )&& (document.getElementById( 'cke_stat_'+editor.name ).innerHTML = editor.lang.stat.strlen+':'+strip(text).length);
|
|
document.getElementById( 'cke_stat_source_'+editor.name )&& (document.getElementById( 'cke_stat_source_'+editor.name ).innerHTML = editor.lang.stat.source+':'+text.length);
|
|
},100);
|
|
};
|
|
editor.on( 'instanceReady', function(e) {
|
|
var places = ['stat','stat_select','stat_source','stat_without_space','stat_word_number'];
|
|
var style = 'float:left; line-height:23px; margin-left:10px;';
|
|
for(var r in places){
|
|
var div = document.createElement('div');
|
|
div.setAttribute('id','cke_'+places[r]+'_'+editor.name);
|
|
div.setAttribute('style',style);
|
|
CKEDITOR.document.getById( editor.ui.spaceId("bottom") ).append(new CKEDITOR.dom.node(div));
|
|
}
|
|
window.onmousemove = function(e){
|
|
if( startSelect )getStatSelect();
|
|
};
|
|
window.onmouseup = function(e){
|
|
startSelect = false;
|
|
};
|
|
statText();
|
|
});
|
|
var timerSelect = 0;
|
|
function _getStatSelect(){
|
|
var text = '';
|
|
if ( editor.mode == 'wysiwyg' ){
|
|
var sel = editor.getSelection();
|
|
text = (sel&&sel.getType()==CKEDITOR.SELECTION_TEXT&&sel.getSelectedText()!==null)?strip(sel.getSelectedText(),'nospace'):'';
|
|
}else{
|
|
if(!window["codemirror_"+editor.id])
|
|
text = getAreaSelection();
|
|
else text = window["codemirror_"+editor.id].getSelection();
|
|
}
|
|
document.getElementById( 'cke_stat_select_'+editor.name )&&(document.getElementById( 'cke_stat_select_'+editor.name ).innerHTML = editor.lang.stat.sel+':'+text.replace(/[\s\n\r]/g,'').length);
|
|
}
|
|
var getStatSelect = function(){
|
|
clearTimeout(timerSelect);
|
|
timerSelect = setTimeout(_getStatSelect,100);
|
|
}
|
|
var keyDownEvent = function(e){
|
|
if ( e.data.$.shiftKey ){
|
|
var keyCode = e.data.$.keyCode;
|
|
if( keyCode>=33&&keyCode<=40 )getStatSelect();
|
|
}
|
|
}
|
|
var startSelect = false;
|
|
editor.on( 'mode', function( e ){
|
|
if ( editor.mode != 'source' )
|
|
return;
|
|
editor.textarea.on( 'keyup',keyDownEvent);
|
|
editor.textarea.on('mousedown',function(e){
|
|
startSelect = true;
|
|
});
|
|
});
|
|
editor.on( 'contentDom', function(e){
|
|
this.getCommand('cut').on('state',getStatSelect)
|
|
editor.document.on('keyup',keyDownEvent);
|
|
editor.document.on('mousedown',function(e){
|
|
startSelect = true;
|
|
});
|
|
editor.document.on('mouseup',function(e){
|
|
startSelect = false;
|
|
});
|
|
});
|
|
editor.on( 'selectionChange', getStatSelect );
|
|
editor.on('key', statText);
|
|
editor.on('afterCommandExec', statText);
|
|
editor.on('dialogHide', statText);
|
|
}
|
|
} );
|