nextcloud/apps/files_texteditor/js/editor.js

222 lines
7.0 KiB
JavaScript
Raw Normal View History

2011-10-02 01:48:00 +04:00
function setEditorSize(){
// Sets the size of the text editor window.
fillWindow($('#editor'));
2011-10-02 01:48:00 +04:00
}
function getFileExtension(file){
var parts=file.split('.');
return parts[parts.length-1];
}
function setSyntaxMode(ext){
// Loads the syntax mode files and tells the editor
var filetype = new Array();
// Todo finish these
filetype["h"] = "c_cpp";
filetype["c"] = "c_cpp";
filetype["clj"] = "clojure";
filetype["coffee"] = "coffee"; // coffescript can be compiled to javascript
2012-01-02 00:04:46 +04:00
filetype["coldfusion"] = "cfc";
filetype["cpp"] = "c_cpp";
filetype["cs"] = "csharp";
2011-10-02 01:48:00 +04:00
filetype["css"] = "css";
filetype["groovy"] = "groovy";
2012-01-02 00:04:46 +04:00
filetype["haxe"] = "hx";
filetype["html"] = "html";
filetype["java"] = "java";
filetype["js"] = "javascript";
filetype["json"] = "json";
2012-01-02 00:04:46 +04:00
filetype["latex"] = "latex";
filetype["lua"] = "lua";
filetype["markdown"] = "markdown"; // also: .md .markdown .mdown .mdwn
filetype["ml"] = "ocaml";
filetype["mli"] = "ocaml";
2011-10-02 01:48:00 +04:00
filetype["pl"] = "perl";
filetype["php"] = "php";
2012-01-02 00:04:46 +04:00
filetype["powershell"] = "ps1";
2011-10-02 01:48:00 +04:00
filetype["py"] = "python";
filetype["rb"] = "ruby";
filetype["scad"] = "scad"; // seems to be something like 3d model files printed with e.g. reprap
filetype["scala"] = "scala";
filetype["scss"] = "scss"; // "sassy css"
2012-01-02 00:04:46 +04:00
filetype["sql"] = "sql";
filetype["svg"] = "svg";
filetype["textile"] = "textile"; // related to markdown
2011-10-02 01:48:00 +04:00
filetype["xml"] = "xml";
if(filetype[ext]!=null){
// Then it must be in the array, so load the custom syntax mode
// Set the syntax mode
OC.addScript('files_texteditor','aceeditor/mode-'+filetype[ext], function(){
var SyntaxMode = require("ace/mode/"+filetype[ext]).Mode;
window.aceEditor.getSession().setMode(new SyntaxMode());
});
}
}
2012-01-09 21:22:51 +04:00
function showControls(filename,writeperms){
2011-10-02 01:48:00 +04:00
// Loads the control bar at the top.
2011-10-04 01:59:40 +04:00
$('.actions,#file_action_panel').fadeOut('slow').promise().done(function() {
2011-10-02 01:48:00 +04:00
// Load the new toolbar.
2012-01-09 21:22:51 +04:00
var savebtnhtml;
if(writeperms=="true"){
2012-01-09 22:17:26 +04:00
var savebtnhtml = '<button id="editor_save">'+t('files_texteditor','Save')+'</button>';
2012-01-09 21:22:51 +04:00
}
2012-01-09 22:17:26 +04:00
var html = '<button id="editor_close">X</button>';
$('#controls').append(html);
$('#editorbar').fadeIn('slow');
var breadcrumbhtml = '<div class="crumb svg" id="breadcrumb_file" style="background-image:url(&quot;../core/img/breadcrumb.png&quot;)"><p>'+filename+'</p></div>';
$('.actions').before(breadcrumbhtml).before(savebtnhtml);
2011-10-02 01:48:00 +04:00
});
}
2011-10-04 01:59:40 +04:00
2011-10-02 01:48:00 +04:00
function bindControlEvents(){
$("#editor_save").die('click',doFileSave).live('click',doFileSave);
$('#editor_close').die('click',hideFileEditor).live('click',hideFileEditor);
}
function editorIsShown(){
// Not working as intended. Always returns true.
return is_editor_shown;
2011-10-04 01:59:40 +04:00
}
function doFileSave(){
if(editorIsShown()){
// Get file path
var path = $('#editor').attr('data-dir')+'/'+$('#editor').attr('data-filename');
// Get original mtime
var mtime = $('#editor').attr('data-mtime');
// Show saving spinner
$("#editor_save").die('click',doFileSave);
2012-01-09 22:17:26 +04:00
$('#save_result').remove();
$('#editor_save').text(t('files_texteditor','Saving...'));//after('<img id="saving_icon" src="'+OC.filePath('core','img','loading.gif')+'"></img>');
// Get the data
var filecontents = window.aceEditor.getSession().getValue();
// Send the data
$.post(OC.filePath('files_texteditor','ajax','savefile.php'), { filecontents: filecontents, path: path, mtime: mtime },function(jsondata){
if(jsondata.status!='success'){
// Save failed
2012-01-09 22:17:26 +04:00
$('#editor_save').text(t('files_texteditor','Save'));
$('#editor_save').after('<p id="save_result" style="float: left">Failed to save file</p>');
2012-01-09 22:17:26 +04:00
$("#editor_save").live('click',doFileSave);
} else {
// Save OK
2012-01-09 21:03:19 +04:00
// Update mtime
$('#editor').attr('data-mtime',jsondata.data.mtime);
2012-01-09 22:17:26 +04:00
$('#editor_save').text(t('files_texteditor','Save'));
$("#editor_save").live('click',doFileSave);
}
},'json');
}
2011-10-04 01:59:40 +04:00
};
function giveEditorFocus(){
window.aceEditor.focus();
};
2011-10-02 01:48:00 +04:00
function showFileEditor(dir,filename){
if(!editorIsShown()){
// Loads the file editor and display it.
var data = $.ajax({
url: OC.filePath('files_texteditor','ajax','loadfile.php'),
data: 'file='+encodeURIComponent(filename)+'&dir='+encodeURIComponent(dir),
complete: function(data){
result = jQuery.parseJSON(data.responseText);
if(result.status == 'success'){
// Save mtime
$('#editor').attr('data-mtime', result.data.mtime);
// Initialise the editor
2012-01-09 21:22:51 +04:00
showControls(filename,result.data.write);
$('table').fadeOut('slow', function() {
$('#editor').text(result.data.filecontents);
$('#editor').attr('data-dir', dir);
$('#editor').attr('data-filename', filename);
window.aceEditor = ace.edit("editor");
aceEditor.setShowPrintMargin(false);
if(result.data.write=='false'){
aceEditor.setReadOnly(true);
}
setEditorSize();
setSyntaxMode(getFileExtension(filename));
OC.addScript('files_texteditor','aceeditor/theme-clouds', function(){
window.aceEditor.setTheme("ace/theme/clouds");
});
});
} else {
// Failed to get the file.
alert(result.data.message);
}
// End success
}
// End ajax
2011-10-02 01:48:00 +04:00
});
is_editor_shown = true;
}
2011-10-02 01:48:00 +04:00
}
function hideFileEditor(){
// Fade out controls
$('#editor_close').fadeOut('slow');
// Fade out the save button
$('#editor_save').fadeOut('slow');
// Fade out breadcrumb
$('#breadcrumb_file').fadeOut('slow', function(){ $(this).remove();});
// Fade out editor
$('#editor').fadeOut('slow', function(){
$('#editor_close').remove();
$('#editor_save').remove();
$('#editor').remove();
var editorhtml = '<div id="editor"></div>';
$('table').after(editorhtml);
$('.actions,#file_access_panel').fadeIn('slow');
$('table').fadeIn('slow');
});
is_editor_shown = false;
2011-10-02 01:48:00 +04:00
}
// Keyboard Shortcuts
var ctrlBtn = false;
function checkForSaveKeyPress(e){
2011-12-31 16:28:25 +04:00
if(e.which == 17 || e.which == 91) ctrlBtn=true;
if(e.which == 83 && ctrlBtn == true) {
e.preventDefault();
$('#editor_save').trigger('click');
return false;
}
}
2011-10-02 01:48:00 +04:00
$(window).resize(function() {
setEditorSize();
});
var is_editor_shown = false;
$(document).ready(function(){
if(typeof FileActions!=='undefined'){
FileActions.register('text','Edit','',function(filename){
showFileEditor($('#dir').val(),filename);
});
FileActions.setDefault('text','Edit');
FileActions.register('application/xml','Edit','',function(filename){
showFileEditor($('#dir').val(),filename);
});
FileActions.setDefault('application/xml','Edit');
}
2011-10-05 04:44:24 +04:00
OC.search.customResults.Text=function(row,item){
var text=item.link.substr(item.link.indexOf('file=')+5);
var a=row.find('a');
a.data('file',text);
a.attr('href','#');
a.click(function(){
var file=text.split('/').pop();
var dir=text.substr(0,text.length-file.length-1);
showFileEditor(dir,file);
});
}
// Binds the file save and close editor events
bindControlEvents();
// Binds the save keyboard shortcut events
2011-12-31 16:28:25 +04:00
$(document).unbind('keydown').bind('keydown',checkForSaveKeyPress);
});