2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 12:49:34 +00:00
fhem-mirror/fhem/www/codemirror/fhem_codemirror.js

153 lines
5.2 KiB
JavaScript

/* $Id$ */
var cm_loaded = 0;
var cm_active = 0;
var cm_attr = {
matchBrackets: true,
autoRefresh: true,
search: true,
comment: true,
autocomplete: true,
autoCloseBrackets:false,
indentUnit: 4,
type: "fhem",
theme: "blackboard",
indentWithTabs: false,
autofocus: true,
lineNumbers: true,
extraKeys: {
'Tab': function(cm) {
if (cm.somethingSelected()) {
var sel = cm.getSelection("\n");
// Indent only if there are multiple lines selected, or if the selection spans a full line
if (sel.length > 0 && (sel.indexOf("\n") > -1 || sel.length === cm.getLine(cm.getCursor().line).length)) {
cm.indentSelection("add");
return;
}
}
cm.getOption("indentWithTabs") ? cm.execCommand("insertTab") : cm.execCommand("insertSoftTab");
},
'Shift-Tab': function(cm) {
cm.indentSelection("subtract");
},
'Ctrl-Up': function(cm) {
var info = cm.getScrollInfo();
if (!cm.somethingSelected()) {
var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, "local");
if (cm.getCursor().line >= visibleBottomLine)
cm.execCommand("goLineUp");
}
cm.scrollTo(null, info.top - cm.defaultTextHeight());
},
'Ctrl-Down': function(cm) {
var info = cm.getScrollInfo();
if (!cm.somethingSelected()) {
var visibleTopLine = cm.lineAtHeight(info.top, "local")+1;
if (cm.getCursor().line <= visibleTopLine)
cm.execCommand("goLineDown");
}
cm.scrollTo(null, info.top + cm.defaultTextHeight());
}
}
};
$(document).ready(function(){
var els = document.getElementsByTagName("textarea");
if(els.length == 0)
return;
if($(els[0]).closest("div#edit").css("display")=="none") { // DEF special
$("table.internals a").each(function(){
var oc = $(this).attr("onclick");
if(oc) {
$(this).attr("onclick", oc+
's=document.getElementById("edit").getElementsByTagName("textarea");'+
'if(!s[0].editor) { s[0].editor=true; AddCodeMirror(s[0]);}');
}
});
} else {
AddCodeMirror(els[0]);
}
});
function AddCodeMirror(e, cb) {
if(cm_active && cm_loaded == cm_active)
return cm_wait(e, cb);
var userAttr = scriptAttribute("fhem_codemirror.js");
for(var a in userAttr)
cm_attr[a] = userAttr[a];
cm_active++;
loadLink("codemirror/codemirror.css");
loadScript("codemirror/codemirror.js", function(){cm_loaded++;} );
if (cm_attr.autoCloseBrackets) {
cm_active++; loadScript("codemirror/closebrackets.js", function(){cm_loaded++;} );
}
if (cm_attr.matchBrackets) {
cm_active++; loadScript("codemirror/matchbrackets.js", function(){cm_loaded++;} );
}
if (cm_attr.search) {
cm_active++; loadScript("codemirror/search.js", function(){cm_loaded++;} );
cm_active++; loadScript("codemirror/searchcursor.js", function(){cm_loaded++;} );
cm_active++;
loadLink("codemirror/dialog.css");
loadScript("codemirror/dialog.js", function(){cm_loaded++;} );
}
if (cm_attr.comment) {
cm_active++; loadScript("codemirror/comment.js", function(){cm_loaded++;} );
cm_attr.extraKeys['Ctrl-Q'] = function(cm) {
cm.toggleComment({ indent: false, lineComment: "#" });
};
}
if (cm_attr.autocomplete) {
cm_active++;
loadLink("codemirror/show-hint.css");
loadScript("codemirror/show-hint.js", function(){cm_loaded++;});
cm_attr.extraKeys['Ctrl-Space'] = 'autocomplete';
}
if (cm_attr.autoRefresh) {
cm_active++; loadScript("codemirror/autorefresh.js", function(){cm_loaded++;} );
}
// get the type from hidden filename extension, load the type-file.js, theme.css and call cm_wait
var ltype;
$("input[name=save]").each(function() {
ltype = $(this).attr("value");
ltype = ltype.substr(ltype.lastIndexOf(".")+1);
if(ltype=="css") cm_attr.type = "css";
if(ltype=="svg") cm_attr.type = "xml";
});
loadLink("codemirror/"+cm_attr.theme+".css");
$("head").append(
'<style type="text/css">'+
(ltype ?
'.CodeMirror {height: ' + (window.innerHeight - 150) + 'px;}':
'.CodeMirror {width: ' + (window.innerWidth - 300) + 'px;}')+
'</style>');
cm_active++;
loadScript("codemirror/"+cm_attr.type+".js", function(){
cm_loaded++;
cm_wait(e, cb);
});
}
function cm_wait(cm_editor, callback, recursions) {
if(cm_loaded != cm_active) {
recursions = typeof recursions !== 'undefined' ? recursions : 0;
if(recursions < 100) {
recursions++;
setTimeout(function(){ cm_wait(cm_editor, callback, recursions) }, 20);
}
return;
}
var cm = CodeMirror.fromTextArea(cm_editor, cm_attr);
if(callback)
callback(cm);
}