mirror of https://github.com/avecms/AVE.cms.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1027 lines
30 KiB
1027 lines
30 KiB
(function(editors, elFinder) { |
|
if (typeof define === 'function' && define.amd) { |
|
define(['elfinder'], editors); |
|
} else if (elFinder) { |
|
var optEditors = elFinder.prototype._options.commandsOptions.edit.editors; |
|
elFinder.prototype._options.commandsOptions.edit.editors = optEditors.concat(editors(elFinder)); |
|
} |
|
}(function(elFinder) { |
|
var // get query of getfile |
|
getfile = window.location.search.match(/getfile=([a-z]+)/), |
|
// cdns location |
|
cdns = { |
|
ace : '//cdnjs.cloudflare.com/ajax/libs/ace/1.2.6', |
|
codemirror : '//cdnjs.cloudflare.com/ajax/libs/codemirror/5.26.0', |
|
ckeditor : '//cdnjs.cloudflare.com/ajax/libs/ckeditor/4.7.0', |
|
tinymce : '//cdnjs.cloudflare.com/ajax/libs/tinymce/4.6.3', |
|
simplemde : '//cdnjs.cloudflare.com/ajax/libs/simplemde/1.11.2' |
|
}, |
|
useRequire = (typeof define === 'function' && define.amd), |
|
hasFlash = (function() { |
|
var hasFlash; |
|
try { |
|
hasFlash = !!(new ActiveXObject('ShockwaveFlash.ShockwaveFlash')); |
|
} catch (e) { |
|
hasFlash = !!(navigator && navigator.mimeTypes["application/x-shockwave-flash"]); |
|
} |
|
return hasFlash; |
|
})(), |
|
initImgTag = function(id, file, content, fm) { |
|
var node = $(this).children('img:first'), |
|
spnr = $('<div/>') |
|
.css({ |
|
position: 'absolute', |
|
top: '50%', |
|
textAlign: 'center', |
|
width: '100%', |
|
fontSize: '16pt' |
|
}) |
|
.html(fm.i18n('ntfloadimg')) |
|
.hide() |
|
.appendTo(this); |
|
|
|
node.attr('id', id+'-img') |
|
.attr('src', content) |
|
.css({'height':'', 'max-width':'100%', 'max-height':'100%', 'cursor':'pointer'}) |
|
.data('loading', function(done) { |
|
var btns = node.closest('.elfinder-dialog').find('button,.elfinder-titlebar-button'); |
|
btns.prop('disabled', !done)[done? 'removeClass' : 'addClass']('ui-state-disabled'); |
|
node.css('opacity', done? '' : '0.3'); |
|
spnr[done? 'hide' : 'show'](); |
|
return node; |
|
}); |
|
}, |
|
imgBase64 = function(node, mime) { |
|
var style = node.attr('style'), |
|
img, canvas, ctx, data; |
|
try { |
|
// reset css for getting image size |
|
node.attr('style', ''); |
|
// img node |
|
img = node.get(0); |
|
// New Canvas |
|
canvas = document.createElement('canvas'); |
|
canvas.width = img.width; |
|
canvas.height = img.height; |
|
// restore css |
|
node.attr('style', style); |
|
// Draw Image |
|
canvas.getContext('2d').drawImage(img, 0, 0); |
|
// To Base64 |
|
data = canvas.toDataURL(mime); |
|
} catch(e) { |
|
data = node.attr('src'); |
|
} |
|
return data; |
|
}, |
|
pixlrCallBack = function() { |
|
if (!hasFlash || window.parent === window) { |
|
return; |
|
} |
|
var pixlr = window.location.search.match(/[?&]pixlr=([^&]+)/), |
|
image = window.location.search.match(/[?&]image=([^&]+)/), |
|
p, ifm, url, node; |
|
if (pixlr) { |
|
// case of redirected from pixlr.com |
|
p = window.parent |
|
ifm = p.$('#'+pixlr[1]+'iframe').hide(); |
|
node = p.$('#'+pixlr[1]).data('resizeoff')(); |
|
if (image[1].substr(0, 4) === 'http') { |
|
url = image[1]; |
|
if (window.location.protocol === 'https:') { |
|
url = url.replace(/^http:/, 'https:'); |
|
} |
|
node.on('load error', function() { |
|
node.data('loading')(true); |
|
}) |
|
.attr('src', url) |
|
.data('loading')(); |
|
} else { |
|
node.data('loading')(true); |
|
} |
|
ifm.remove(); |
|
} |
|
}; |
|
pixlrSetup = function(opts, fm) { |
|
if (!hasFlash) { |
|
this.disabled = true; |
|
} |
|
}, |
|
pixlrLoad = function(mode, base) { |
|
var fm = this.fm, |
|
node = $(base).children('img:first') |
|
.data('loading')() |
|
.data('resizeoff', function() { |
|
$(window).off('resize.'+node.attr('id')); |
|
return node; |
|
}) |
|
.on('click', function() { |
|
launch(); |
|
}), |
|
elfNode = fm.getUI(), |
|
container = $('<iframe class="ui-front" allowtransparency="true">'), |
|
file = this.file, |
|
src = 'https://pixlr.com/'+mode+'/?s=c', |
|
myurl = window.location.href.toString().replace(/#.*$/, ''), |
|
error = function() { |
|
container.remove(); |
|
node.data('loading')(true); |
|
fm.error('Can not launch Pixlr.'); |
|
}, |
|
launch = function() { |
|
errtm = setTimeout(error, 10000); |
|
myurl += (myurl.indexOf('?') === -1? '?' : '&') + 'pixlr='+node.attr('id'); |
|
src += '&referrer=elFinder&locktitle=true&locktype=true'; |
|
src += '&exit='+encodeURIComponent(myurl+'&image=0'); |
|
src += '&target='+encodeURIComponent(myurl); |
|
src += '&title='+encodeURIComponent(file.name); |
|
src += '&image='+encodeURIComponent(node.attr('src')); |
|
container |
|
.attr('id', node.attr('id')+'iframe') |
|
.attr('src', src) |
|
.css({ |
|
width: '100%', |
|
height: $(window).height()+'px', |
|
position: 'fixed', |
|
display: 'block', |
|
backgroundColor: 'transparent', |
|
border: 'none', |
|
top: 0, |
|
right: 0 |
|
}) |
|
.on('load', function() { |
|
errtm && clearTimeout(errtm); |
|
}) |
|
.on('error', error) |
|
.appendTo(elfNode.hasClass('elfinder-fullscreen')? elfNode : 'body'); |
|
// fit to window size |
|
$(window).on('resize.'+node.attr('id'), function() { |
|
container.css('height', $(window).height()); |
|
}); |
|
}, |
|
errtm; |
|
launch(); |
|
}; |
|
|
|
// check callback from pixlr |
|
pixlrCallBack(); |
|
|
|
// check getfile callback function |
|
if (getfile) { |
|
getfile = getfile[1]; |
|
if (getfile === 'ckeditor') { |
|
elFinder.prototype._options.getFileCallback = function(file, fm) { |
|
window.opener.CKEDITOR.tools.callFunction((function() { |
|
var reParam = new RegExp('(?:[\?&]|&)CKEditorFuncNum=([^&]+)', 'i'), |
|
match = window.location.search.match(reParam); |
|
return (match && match.length > 1) ? match[1] : ''; |
|
})(), fm.convAbsUrl(file.url)); |
|
fm.destroy(); |
|
window.close(); |
|
}; |
|
} else if (getfile === 'tinymce') { |
|
elFinder.prototype._options.getFileCallback = function(file, fm) { |
|
// pass selected file data to TinyMCE |
|
parent.tinymce.activeEditor.windowManager.getParams().oninsert(file, fm); |
|
// close popup window |
|
parent.tinymce.activeEditor.windowManager.close(); |
|
}; |
|
} |
|
} |
|
|
|
// return editors Array |
|
return [ |
|
{ |
|
// Pixlr Editor |
|
info : { |
|
name : 'Pixlr Editor', |
|
iconImg : 'img/edit_pixlreditor.png', |
|
urlAsContent: true, |
|
schemeContent: true, |
|
single: true |
|
}, |
|
// MIME types to accept |
|
mimes : ['image/jpeg', 'image/png'], |
|
// HTML of this editor |
|
html : '<div style="width:100%;height:300px;text-align:center;"><img/></div>', |
|
// called on initialization of elFinder cmd edit (this: this editor's config object) |
|
setup : function(opts, fm) { |
|
pixlrSetup.call(this, opts, fm); |
|
}, |
|
// Initialization of editing node (this: this editors HTML node) |
|
init : function(id, file, url, fm) { |
|
//initImgTag.call(this, id, file, fm.convAbsUrl(fm.openUrl(file.hash, true)), fm); |
|
initImgTag.call(this, id, file, fm.convAbsUrl(url), fm); |
|
}, |
|
// Get data uri scheme (this: this editors HTML node) |
|
getContent : function() { |
|
return $(this).children('img:first').attr('src'); |
|
}, |
|
load : function(base) { |
|
pixlrLoad.call(this, 'editor', base); |
|
}, |
|
save : function(base) {}, |
|
// unbind resize event function |
|
close : function(base) { |
|
//$(window).off('resize.'+$(base).children('img:first').attr('id')); |
|
} |
|
}, |
|
{ |
|
// Pixlr Express |
|
info : { |
|
name : 'Pixlr Express', |
|
iconImg : 'img/edit_pixlrexpress.png', |
|
urlAsContent: true, |
|
schemeContent: true, |
|
single: true |
|
}, |
|
// MIME types to accept |
|
mimes : ['image/jpeg', 'image/png'], |
|
// HTML of this editor |
|
html : '<div style="width:100%;height:300px;text-align:center;"><img/></div>', |
|
// called on initialization of elFinder cmd edit (this: this editor's config object) |
|
setup : function(opts, fm) { |
|
pixlrSetup.call(this, opts, fm); |
|
}, |
|
// Initialization of editing node (this: this editors HTML node) |
|
init : function(id, file, url, fm) { |
|
initImgTag.call(this, id, file, fm.convAbsUrl(url), fm); |
|
}, |
|
// Get data uri scheme (this: this editors HTML node) |
|
getContent : function() { |
|
return $(this).children('img:first').attr('src'); |
|
}, |
|
load : function(base) { |
|
pixlrLoad.call(this, 'express', base); |
|
}, |
|
save : function(base) {}, |
|
// unbind resize event function |
|
close : function(base) { |
|
//$(window).off('resize.'+$(base).children('img:first').attr('id')); |
|
} |
|
}, |
|
{ |
|
// Adobe Creative SDK Creative Tools Image Editor UI |
|
// MIME types to accept |
|
info : { |
|
name : 'Creative Cloud', |
|
iconImg : 'img/edit_creativecloud.png', |
|
schemeContent: true, |
|
single: true |
|
}, |
|
mimes : ['image/jpeg', 'image/png'], |
|
// HTML of this editor |
|
html : '<div style="width:100%;height:300px;text-align:center;"><img/></div>', |
|
// called on initialization of elFinder cmd edit (this: this editor's config object) |
|
setup : function(opts, fm) { |
|
if (fm.UA.ltIE8 || !opts.extraOptions || !opts.extraOptions.creativeCloudApiKey) { |
|
this.disabled = true; |
|
} else { |
|
this.apiKey = opts.extraOptions.creativeCloudApiKey; |
|
} |
|
}, |
|
// Initialization of editing node (this: this editors HTML node) |
|
init : function(id, file, content, fm) { |
|
initImgTag.call(this, id, file, content, fm); |
|
}, |
|
// Get data uri scheme (this: this editors HTML node) |
|
getContent : function() { |
|
return $(this).children('img:first').attr('src'); |
|
}, |
|
// Launch Aviary Feather editor when dialog open |
|
load : function(base) { |
|
var self = this, |
|
fm = this.fm, |
|
node = $(base).children('img:first'), |
|
elfNode = fm.getUI(), |
|
dfrd = $.Deferred(), |
|
container = $('#elfinder-aviary-container'), |
|
init = function(onload) { |
|
var getLang = function() { |
|
var langMap = { |
|
'jp' : 'ja', |
|
'zh_TW' : 'zh_HANT', |
|
'zh_CN' : 'zh_HANS' |
|
}; |
|
return langMap[fm.lang]? langMap[fm.lang] : fm.lang; |
|
}; |
|
|
|
if (!container.length) { |
|
container = $('<div id="elfinder-aviary-container" class="ui-front"/>').css({ |
|
position: 'fixed', |
|
top: 0, |
|
right: 0, |
|
width: '100%', |
|
height: $(window).height(), |
|
overflow: 'auto' |
|
}).hide().appendTo(elfNode.hasClass('elfinder-fullscreen')? elfNode : 'body'); |
|
// fit to window size |
|
$(window).on('resize.'+fm.namespace, function() { |
|
container.css('height', $(window).height()); |
|
}); |
|
// bind switch fullscreen event |
|
elfNode.on('resize.'+fm.namespace, function(e, data) { |
|
data && data.fullscreen && container.appendTo(data.fullscreen === 'on'? elfNode : 'body'); |
|
}); |
|
fm.bind('destroy', function() { |
|
container.remove(); |
|
}); |
|
} else { |
|
// always moves to last |
|
container.appendTo(container.parent()); |
|
} |
|
node.on('click', launch).data('loading')(); |
|
featherEditor = new Aviary.Feather({ |
|
apiKey: self.confObj.apiKey, |
|
onSave: function(imageID, newURL) { |
|
featherEditor.showWaitIndicator(); |
|
node.on('load error', function() { |
|
node.data('loading')(true); |
|
}) |
|
.attr('crossorigin', 'anonymous') |
|
.attr('src', newURL) |
|
.data('loading')(); |
|
featherEditor.close(); |
|
}, |
|
onLoad: onload || function(){}, |
|
onClose: function() { $(container).hide(); }, |
|
appendTo: container.get(0), |
|
maxSize: 2048, |
|
language: getLang() |
|
}); |
|
// return editor instance |
|
dfrd.resolve(featherEditor); |
|
}, |
|
launch = function() { |
|
$(container).show(); |
|
featherEditor.launch({ |
|
image: node.attr('id'), |
|
url: node.attr('src') |
|
}); |
|
node.data('loading')(true); |
|
}, |
|
featherEditor, extraOpts; |
|
|
|
// load script then init |
|
if (typeof Aviary === 'undefined') { |
|
fm.loadScript(['https://dme0ih8comzn4.cloudfront.net/imaging/v3/editor.js'], function() { |
|
init(launch); |
|
}); |
|
} else { |
|
init(); |
|
launch(); |
|
} |
|
return dfrd; |
|
}, |
|
// Convert content url to data uri scheme to save content |
|
save : function(base) { |
|
var node = $(base).children('img:first'); |
|
if (node.attr('src').substr(0, 5) !== 'data:') { |
|
node.attr('src', imgBase64(node, this.file.mime)); |
|
} |
|
} |
|
}, |
|
{ |
|
// ACE Editor |
|
// `mimes` is not set for support everything kind of text file |
|
info : { |
|
name : 'ACE Editor', |
|
iconImg : 'img/edit_aceeditor.png' |
|
}, |
|
load : function(textarea) { |
|
var self = this, |
|
dfrd = $.Deferred(), |
|
cdn = cdns.ace, |
|
start = function() { |
|
var editor, editorBase, mode, |
|
ta = $(textarea), |
|
taBase = ta.parent(), |
|
dialog = taBase.parent(), |
|
id = textarea.id + '_ace', |
|
ext = self.file.name.replace(/^.+\.([^.]+)|(.+)$/, '$1$2').toLowerCase(), |
|
// MIME/mode map |
|
mimeMode = { |
|
'text/x-php' : 'php', |
|
'application/x-php' : 'php', |
|
'text/html' : 'html', |
|
'application/xhtml+xml' : 'html', |
|
'text/javascript' : 'javascript', |
|
'application/javascript' : 'javascript', |
|
'text/css' : 'css', |
|
'text/x-c' : 'c_cpp', |
|
'text/x-csrc' : 'c_cpp', |
|
'text/x-chdr' : 'c_cpp', |
|
'text/x-c++' : 'c_cpp', |
|
'text/x-c++src' : 'c_cpp', |
|
'text/x-c++hdr' : 'c_cpp', |
|
'text/x-shellscript' : 'sh', |
|
'application/x-csh' : 'sh', |
|
'text/x-python' : 'python', |
|
'text/x-java' : 'java', |
|
'text/x-java-source' : 'java', |
|
'text/x-ruby' : 'ruby', |
|
'text/x-perl' : 'perl', |
|
'application/x-perl' : 'perl', |
|
'text/x-sql' : 'sql', |
|
'text/xml' : 'xml', |
|
'application/docbook+xml' : 'xml', |
|
'application/xml' : 'xml' |
|
}; |
|
|
|
// set base height |
|
taBase.height(taBase.height()); |
|
|
|
// set basePath of ace |
|
ace.config.set('basePath', cdn); |
|
|
|
// Base node of Ace editor |
|
editorBase = $('<div id="'+id+'" style="width:100%; height:100%;"/>').text(ta.val()).insertBefore(ta.hide()); |
|
|
|
// Editor flag |
|
ta.data('ace', true); |
|
|
|
// Aceeditor instance |
|
editor = ace.edit(id); |
|
|
|
// Ace editor configure |
|
editor.$blockScrolling = Infinity; |
|
editor.setOptions({ |
|
theme: 'ace/theme/monokai', |
|
fontSize: '14px', |
|
wrap: true, |
|
}); |
|
ace.config.loadModule('ace/ext/modelist', function() { |
|
// detect mode |
|
mode = ace.require('ace/ext/modelist').getModeForPath('/' + self.file.name).name; |
|
if (mode === 'text') { |
|
if (mimeMode[self.file.mime]) { |
|
mode = mimeMode[self.file.mime]; |
|
} |
|
} |
|
// show MIME:mode in title bar |
|
taBase.prev().children('.elfinder-dialog-title').append(' (' + self.file.mime + ' : ' + mode.split(/[\/\\]/).pop() + ')'); |
|
editor.setOptions({ |
|
mode: 'ace/mode/' + mode |
|
}); |
|
}); |
|
ace.config.loadModule('ace/ext/language_tools', function() { |
|
ace.require('ace/ext/language_tools'); |
|
editor.setOptions({ |
|
enableBasicAutocompletion: true, |
|
enableSnippets: true, |
|
enableLiveAutocompletion: false |
|
}); |
|
}); |
|
ace.config.loadModule('ace/ext/settings_menu', function() { |
|
ace.require('ace/ext/settings_menu').init(editor); |
|
}); |
|
|
|
// Short cuts |
|
editor.commands.addCommand({ |
|
name : "saveFile", |
|
bindKey: { |
|
win : 'Ctrl-s', |
|
mac : 'Command-s' |
|
}, |
|
exec: function(editor) { |
|
self.doSave(); |
|
} |
|
}); |
|
editor.commands.addCommand({ |
|
name : "closeEditor", |
|
bindKey: { |
|
win : 'Ctrl-w|Ctrl-q', |
|
mac : 'Command-w|Command-q' |
|
}, |
|
exec: function(editor) { |
|
self.doCancel(); |
|
} |
|
}); |
|
|
|
editor.resize(); |
|
|
|
// TextArea button and Setting button |
|
$('<div class="ui-dialog-buttonset"/>').css('float', 'left') |
|
.append( |
|
$('<button/>').html(self.fm.i18n('TextArea')) |
|
.button() |
|
.on('click', function(){ |
|
if (ta.data('ace')) { |
|
ta.removeData('ace'); |
|
editorBase.hide(); |
|
ta.val(editor.session.getValue()).show().focus(); |
|
$(this).text('AceEditor'); |
|
} else { |
|
ta.data('ace', true); |
|
editorBase.show(); |
|
editor.setValue(ta.hide().val(), -1); |
|
editor.focus(); |
|
$(this).html(self.fm.i18n('TextArea')); |
|
} |
|
}) |
|
) |
|
.append( |
|
$('<button>Ace editor setting</button>') |
|
.button({ |
|
icons: { |
|
primary: 'ui-icon-gear', |
|
secondary: 'ui-icon-triangle-1-e' |
|
}, |
|
text: false |
|
}) |
|
.on('click', function(){ |
|
editor.showSettingsMenu(); |
|
$('#ace_settingsmenu') |
|
.css('font-size', '80%') |
|
.find('div[contains="setOptions"]').hide().end() |
|
.parent().parent().appendTo($('#elfinder')); |
|
}) |
|
) |
|
.prependTo(taBase.next()); |
|
|
|
dfrd.resolve(editor); |
|
}; |
|
|
|
// check ace & start |
|
if (!self.confObj.loader) { |
|
self.confObj.loader = $.Deferred(); |
|
self.fm.loadScript([ cdn+'/ace.js' ], function() { |
|
self.confObj.loader.resolve(); |
|
}, void 0, {obj: window, name: 'ace'}); |
|
} |
|
self.confObj.loader.done(start); |
|
|
|
return dfrd; |
|
}, |
|
close : function(textarea, instance) { |
|
instance && instance.destroy(); |
|
}, |
|
save : function(textarea, instance) { |
|
instance && $(textarea).data('ace') && (textarea.value = instance.session.getValue()); |
|
}, |
|
focus : function(textarea, instance) { |
|
instance && $(textarea).data('ace') && instance.focus(); |
|
}, |
|
resize : function(textarea, instance, e, data) { |
|
instance && instance.resize(); |
|
} |
|
}, |
|
{ |
|
// CodeMirror |
|
// `mimes` is not set for support everything kind of text file |
|
info : { |
|
name : 'CodeMirror', |
|
iconImg : 'img/edit_codemirror.png' |
|
}, |
|
load : function(textarea) { |
|
var cmUrl = cdns.codemirror, |
|
dfrd = $.Deferred(), |
|
self = this, |
|
start = function(CodeMirror) { |
|
var ta = $(textarea), |
|
base = ta.parent(), |
|
editor, editorBase; |
|
|
|
// set base height |
|
base.height(base.height()); |
|
|
|
// CodeMirror configure |
|
editor = CodeMirror.fromTextArea(textarea, { |
|
lineNumbers: true, |
|
lineWrapping: true, |
|
extraKeys : { |
|
'Ctrl-S': function() { self.doSave(); }, |
|
'Ctrl-Q': function() { self.doCancel(); }, |
|
'Ctrl-W': function() { self.doCancel(); } |
|
} |
|
}); |
|
|
|
// return editor instance |
|
dfrd.resolve(editor); |
|
|
|
// Auto mode set |
|
var info, m, mode, spec; |
|
if (! info) { |
|
info = CodeMirror.findModeByMIME(self.file.mime); |
|
} |
|
if (! info && (m = self.file.name.match(/.+\.([^.]+)$/))) { |
|
info = CodeMirror.findModeByExtension(m[1]); |
|
} |
|
if (info) { |
|
CodeMirror.modeURL = useRequire? 'codemirror/mode/%N/%N.min' : cmUrl + '/mode/%N/%N.min.js'; |
|
mode = info.mode; |
|
spec = info.mime; |
|
editor.setOption('mode', spec); |
|
CodeMirror.autoLoadMode(editor, mode); |
|
// show MIME:mode in title bar |
|
base.prev().children('.elfinder-dialog-title').append(' (' + spec + ' : ' + mode + ')'); |
|
} |
|
|
|
// editor base node |
|
editorBase = $(editor.getWrapperElement()).css({ |
|
// fix CSS conflict to SimpleMDE |
|
padding: 0, |
|
border: 'none' |
|
}); |
|
ta.data('cm', true); |
|
|
|
// fit height to base |
|
editorBase.height('100%'); |
|
|
|
// TextArea button and Setting button |
|
$('<div class="ui-dialog-buttonset"/>').css('float', 'left') |
|
.append( |
|
$('<button/>').html(self.fm.i18n('TextArea')) |
|
.button() |
|
.on('click', function(){ |
|
if (ta.data('cm')) { |
|
ta.removeData('cm'); |
|
editorBase.hide(); |
|
ta.val(editor.getValue()).show().focus(); |
|
$(this).text('CodeMirror'); |
|
} else { |
|
ta.data('cm', true); |
|
editorBase.show(); |
|
editor.setValue(ta.hide().val()); |
|
editor.refresh(); |
|
editor.focus(); |
|
$(this).html(self.fm.i18n('TextArea')); |
|
} |
|
}) |
|
) |
|
.prependTo(base.next()); |
|
}; |
|
// load script then start |
|
if (!self.confObj.loader) { |
|
self.confObj.loader = $.Deferred(); |
|
if (useRequire) { |
|
require.config({ |
|
packages: [{ |
|
name: 'codemirror', |
|
location: cmUrl, |
|
main: 'codemirror.min' |
|
}], |
|
map: { |
|
'codemirror': { |
|
'codemirror/lib/codemirror': 'codemirror' |
|
} |
|
} |
|
}); |
|
require([ |
|
'codemirror', |
|
'codemirror/addon/mode/loadmode.min', |
|
'codemirror/mode/meta.min' |
|
], function(CodeMirror) { |
|
self.confObj.loader.resolve(CodeMirror); |
|
}); |
|
} else { |
|
self.fm.loadScript([ |
|
cmUrl + '/codemirror.min.js', |
|
cmUrl + '/addon/mode/loadmode.min.js', |
|
cmUrl + '/mode/meta.min.js' |
|
], function() { |
|
self.confObj.loader.resolve(CodeMirror); |
|
}, void 0, {obj: window, name: 'CodeMirror'}); |
|
} |
|
self.fm.loadCss(cmUrl + '/codemirror.css'); |
|
} |
|
self.confObj.loader.done(start); |
|
return dfrd; |
|
}, |
|
close : function(textarea, instance) { |
|
instance && instance.toTextArea(); |
|
}, |
|
save : function(textarea, instance) { |
|
instance && $(textarea).data('cm') && (textarea.value = instance.getValue()); |
|
}, |
|
focus : function(textarea, instance) { |
|
instance && $(textarea).data('cm') && instance.focus(); |
|
}, |
|
resize : function(textarea, instance, e, data) { |
|
instance && instance.refresh(); |
|
} |
|
}, |
|
{ |
|
// SimpleMDE |
|
info : { |
|
name : 'SimpleMDE', |
|
iconImg : 'img/edit_simplemde.png' |
|
}, |
|
exts : ['md'], |
|
load : function(textarea) { |
|
var self = this, |
|
base = $(textarea).parent(), |
|
dfrd = $.Deferred(), |
|
start = function(SimpleMDE) { |
|
var h = base.height(), |
|
delta = base.outerHeight(true) - h + 14, |
|
editor, editorBase; |
|
|
|
// fit height function |
|
textarea._setHeight = function(h) { |
|
var h = h || base.height(), |
|
ctrH = 0, |
|
areaH; |
|
base.children('.editor-toolbar,.editor-statusbar').each(function() { |
|
ctrH += $(this).outerHeight(true); |
|
}); |
|
areaH = h - ctrH - delta; |
|
editorBase.height(areaH); |
|
editor.codemirror.refresh(); |
|
return areaH; |
|
}; |
|
|
|
// set base height |
|
base.height(h); |
|
|
|
// make editor |
|
editor = new SimpleMDE({ |
|
element: textarea, |
|
autofocus: true |
|
}); |
|
dfrd.resolve(editor); |
|
|
|
// editor base node |
|
editorBase = $(editor.codemirror.getWrapperElement()); |
|
|
|
// fit height to base |
|
editorBase.css('min-height', '50px') |
|
.children('.CodeMirror-scroll').css('min-height', '50px'); |
|
textarea._setHeight(h); |
|
}; |
|
|
|
// check SimpleMDE & start |
|
if (!self.confObj.loader) { |
|
self.confObj.loader = $.Deferred(); |
|
self.fm.loadCss(cdns.simplemde+'/simplemde.min.css'); |
|
if (useRequire) { |
|
require([ |
|
cdns.simplemde+'/simplemde.min.js' |
|
], function(SimpleMDE) { |
|
self.confObj.loader.resolve(SimpleMDE); |
|
}); |
|
} else { |
|
self.fm.loadScript([cdns.simplemde+'/simplemde.min.js'], function() { |
|
self.confObj.loader.resolve(SimpleMDE); |
|
}, void 0, {obj: window, name: 'SimpleMDE'}); |
|
} |
|
} |
|
self.confObj.loader.done(start); |
|
|
|
return dfrd; |
|
}, |
|
close : function(textarea, instance) { |
|
instance && instance.toTextArea(); |
|
instance = null; |
|
}, |
|
save : function(textarea, instance) { |
|
instance && (textarea.value = instance.value()); |
|
}, |
|
focus : function(textarea, instance) { |
|
instance && instance.codemirror.focus(); |
|
}, |
|
resize : function(textarea, instance, e, data) { |
|
instance && textarea._setHeight(); |
|
} |
|
}, |
|
{ |
|
// CKEditor for html file |
|
info : { |
|
name : 'CKEditor', |
|
iconImg : 'img/edit_ckeditor.png' |
|
}, |
|
exts : ['htm', 'html', 'xhtml'], |
|
setup : function(opts, fm) { |
|
if (opts.extraOptions && opts.extraOptions.managerUrl) { |
|
this.managerUrl = opts.extraOptions.managerUrl; |
|
} |
|
}, |
|
load : function(textarea) { |
|
var self = this, |
|
fm = this.fm, |
|
dfrd = $.Deferred(), |
|
init = function() { |
|
var base = $(textarea).parent(), |
|
dlg = base.closest('.elfinder-dialog'), |
|
h = base.height(), |
|
reg = /([&?]getfile=)[^&]+/, |
|
loc = self.confObj.managerUrl || window.location.href.replace(/#.*$/, ''), |
|
name = 'ckeditor'; |
|
|
|
// make manager location |
|
if (reg.test(loc)) { |
|
loc = loc.replace(reg, '$1' + name); |
|
} else { |
|
loc += '?getfile=' + name; |
|
} |
|
// set base height |
|
base.height(h); |
|
// CKEditor configure |
|
CKEDITOR.replace(textarea.id, { |
|
startupFocus : true, |
|
fullPage: true, |
|
allowedContent: true, |
|
filebrowserBrowseUrl : loc, |
|
removePlugins: 'resize', |
|
on: { |
|
'instanceReady' : function(e) { |
|
var editor = e.editor; |
|
editor.resize('100%', h); |
|
// re-build on dom move |
|
dlg.one('beforedommove.'+fm.namespace, function() { |
|
editor.destroy(); |
|
}).one('dommove.'+fm.namespace, function() { |
|
self.load(textarea).done(function(editor) { |
|
self.instance = editor; |
|
}); |
|
}); |
|
// return editor instance |
|
dfrd.resolve(e.editor); |
|
} |
|
} |
|
}); |
|
CKEDITOR.on('dialogDefinition', function(e) { |
|
var dlg = e.data.definition.dialog; |
|
dlg.on('show', function(e) { |
|
fm.getUI().append($('.cke_dialog_background_cover')).append(this.getElement().$) |
|
}); |
|
dlg.on('hide', function(e) { |
|
$('body:first').append($('.cke_dialog_background_cover')).append(this.getElement().$) |
|
}); |
|
}); |
|
}; |
|
|
|
if (!self.confObj.loader) { |
|
self.confObj.loader = $.Deferred(); |
|
$.getScript(cdns.ckeditor + '/ckeditor.js', function() { |
|
self.confObj.loader.resolve(); |
|
}); |
|
} |
|
self.confObj.loader.done(init); |
|
return dfrd; |
|
}, |
|
close : function(textarea, instance) { |
|
instance && instance.destroy(); |
|
}, |
|
save : function(textarea, instance) { |
|
instance && (textarea.value = instance.getData()); |
|
}, |
|
focus : function(textarea, instance) { |
|
instance && instance.focus(); |
|
}, |
|
resize : function(textarea, instance, e, data) { |
|
var self; |
|
if (instance) { |
|
if (instance.status === 'ready') { |
|
instance.resize('100%', $(textarea).parent().height()); |
|
} |
|
} |
|
} |
|
}, |
|
{ |
|
// TinyMCE for html file |
|
info : { |
|
name : 'TinyMCE', |
|
iconImg : 'img/edit_tinymce.png' |
|
}, |
|
exts : ['htm', 'html', 'xhtml'], |
|
setup : function(opts, fm) { |
|
if (opts.extraOptions && opts.extraOptions.managerUrl) { |
|
this.managerUrl = opts.extraOptions.managerUrl; |
|
} |
|
}, |
|
load : function(textarea) { |
|
var self = this, |
|
fm = this.fm, |
|
dfrd = $.Deferred(), |
|
init = function() { |
|
var base = $(textarea).parent(), |
|
dlg = base.closest('.elfinder-dialog'), |
|
h = base.height(), |
|
delta = base.outerHeight(true) - h; |
|
// set base height |
|
base.height(h); |
|
// fit height function |
|
textarea._setHeight = function(h) { |
|
var base = $(this).parent(), |
|
h = h || base.height(), |
|
ctrH = 0, |
|
areaH; |
|
base.find('.mce-container-body:first').children('.mce-toolbar,.mce-toolbar-grp,.mce-statusbar').each(function() { |
|
ctrH += $(this).outerHeight(true); |
|
}); |
|
areaH = h - ctrH - delta; |
|
base.find('.mce-edit-area iframe:first').height(areaH); |
|
return areaH; |
|
}; |
|
// TinyMCE configure |
|
tinymce.init({ |
|
selector: '#' + textarea.id, |
|
resize: false, |
|
plugins: [ |
|
'fullpage', // require for getting full HTML |
|
'image', 'link', 'media', |
|
'code', 'fullscreen' |
|
], |
|
init_instance_callback : function(editor) { |
|
// fit height on init |
|
textarea._setHeight(h); |
|
// re-build on dom move |
|
dlg.one('beforedommove.'+fm.namespace, function() { |
|
tinymce.execCommand('mceRemoveEditor', false, textarea.id); |
|
}).one('dommove.'+fm.namespace, function() { |
|
self.load(textarea).done(function(editor) { |
|
self.instance = editor; |
|
}); |
|
}); |
|
// return editor instance |
|
dfrd.resolve(editor); |
|
}, |
|
file_picker_callback : function (callback, value, meta) { |
|
var reg = /([&?]getfile=)[^&]+/, |
|
loc = self.confObj.managerUrl || window.location.href.replace(/#.*$/, ''), |
|
name = 'tinymce'; |
|
|
|
// make manager location |
|
if (reg.test(loc)) { |
|
loc = loc.replace(reg, '$1' + name); |
|
} else { |
|
loc += '?getfile=' + name; |
|
} |
|
// launch TinyMCE |
|
tinymce.activeEditor.windowManager.open({ |
|
file: loc, |
|
title: 'elFinder', |
|
width: 900, |
|
height: 450, |
|
resizable: 'yes' |
|
}, { |
|
oninsert: function (file, elf) { |
|
var url, reg, info; |
|
|
|
// URL normalization |
|
url = elf.convAbsUrl(file.url); |
|
|
|
// Make file info |
|
info = file.name + ' (' + elf.formatSize(file.size) + ')'; |
|
|
|
// Provide file and text for the link dialog |
|
if (meta.filetype == 'file') { |
|
callback(url, {text: info, title: info}); |
|
} |
|
|
|
// Provide image and alt text for the image dialog |
|
if (meta.filetype == 'image') { |
|
callback(url, {alt: info}); |
|
} |
|
|
|
// Provide alternative source and posted for the media dialog |
|
if (meta.filetype == 'media') { |
|
callback(url); |
|
} |
|
} |
|
}); |
|
return false; |
|
} |
|
}); |
|
}; |
|
|
|
// impossible launch TineMCE in native fullscreen mode |
|
fm.getUI().hasClass('elfinder-fullscreen-native') && fm.exec('fullscreen'); |
|
|
|
if (!self.confObj.loader) { |
|
self.confObj.loader = $.Deferred(); |
|
$.getScript(cdns.tinymce + '/tinymce.min.js', function() { |
|
setTimeout(function() { |
|
self.confObj.loader.resolve(); |
|
}, 0); |
|
}); |
|
} |
|
self.confObj.loader.done(init); |
|
return dfrd; |
|
}, |
|
close : function(textarea, instance) { |
|
instance && tinymce.execCommand('mceRemoveEditor', false, textarea.id); |
|
}, |
|
save : function(textarea, instance) { |
|
instance && instance.save(); |
|
}, |
|
focus : function(textarea, instance) { |
|
instance && instance.focus(); |
|
}, |
|
resize : function(textarea, instance, e, data) { |
|
// fit height to base node on dialog resize |
|
textarea._setHeight(); |
|
} |
|
}, |
|
{ |
|
// Simple Text (basic textarea editor) |
|
info : { |
|
name : 'TextArea', |
|
useTextAreaEvent : true |
|
}, |
|
load : function(){}, |
|
save : function(){} |
|
} |
|
]; |
|
}, window.elFinder));
|
|
|