www/codemirror/fhem_codemirror.js: additional modules loads now dynamically based on codemirrorParam, fixed bug in cm_wait() setTimeout, some further improvements.

git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@9700 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rapster
2015-10-27 23:38:08 +00:00
parent f5a6f014fc
commit d22e2fc432

View File

@@ -1,72 +1,21 @@
/* $Id$ */
var cm_loaded = 0; var cm_loaded = 0;
var cm_active = 0;
$(document).ready(function(){ var cm_attr = {
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_loaded == 9)
return cm_wait(e, cb);
loadLink("codemirror/codemirror.css");
loadLink("codemirror/show-hint.css");
loadLink("codemirror/dialog.css");
loadScript("codemirror/codemirror.js", function(){ cm_loaded++;} );
loadScript("codemirror/closebrackets.js",function(){ cm_loaded++;} );
loadScript("codemirror/matchbrackets.js",function(){ cm_loaded++;} );
loadScript("codemirror/search.js", function(){ cm_loaded++;} );
loadScript("codemirror/searchcursor.js", function(){ cm_loaded++;} );
loadScript("codemirror/dialog.js", function(){ cm_loaded++;} );
loadScript("codemirror/comment.js", function(){ cm_loaded++;} );
loadScript("codemirror/autorefresh.js", function(){ cm_loaded++;} );
loadScript("codemirror/show-hint.js", function(){
cm_loaded++;
cm_wait(e, cb);
});
}
function
cm_wait(cm_editor, callback)
{
if(cm_loaded != 9) {
setTimeout(cm_wait, 10);
return;
}
var ltype,type="fhem"; // get the type from the hidden filename extension
$("input[name=save]").each(function(){
ltype = $(this).attr("value");
ltype = ltype.substr(ltype.lastIndexOf(".")+1);
if(ltype=="css") type = "css";
if(ltype=="svg") type = "xml";
});
var attr = {
indentUnit: 4,
indentWithTabs: false,
autoCloseBrackets: false,
matchBrackets: true, matchBrackets: true,
autofocus: true,
theme: "blackboard",
lineNumbers: true,
autoRefresh: true, autoRefresh: true,
search: true,
comment: true,
autocomplete: true,
autoCloseBrackets:false,
indentUnit: 4,
type: "fhem",
theme: "blackboard",
indentWithTabs: false,
autofocus: true,
lineNumbers: true,
extraKeys: { extraKeys: {
'Ctrl-Space': 'autocomplete',
'Tab': function(cm) { 'Tab': function(cm) {
if (cm.somethingSelected()) { if (cm.somethingSelected()) {
var sel = cm.getSelection("\n"); var sel = cm.getSelection("\n");
@@ -81,9 +30,6 @@ cm_wait(cm_editor, callback)
'Shift-Tab': function(cm) { 'Shift-Tab': function(cm) {
cm.indentSelection("subtract"); cm.indentSelection("subtract");
}, },
'Ctrl-Q': function(cm) { // Needs comment.js
cm.toggleComment({ indent: false, lineComment: "#" });
},
'Ctrl-Up': function(cm) { 'Ctrl-Up': function(cm) {
var info = cm.getScrollInfo(); var info = cm.getScrollInfo();
if (!cm.somethingSelected()) { if (!cm.somethingSelected()) {
@@ -103,12 +49,79 @@ cm_wait(cm_editor, callback)
cm.scrollTo(null, info.top + cm.defaultTextHeight()); 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) {
var userAttr = scriptAttribute("fhem_codemirror.js"); var userAttr = scriptAttribute("fhem_codemirror.js");
for(var a in userAttr) for(var a in userAttr)
attr[a] = userAttr[a]; cm_attr[a] = userAttr[a];
loadLink("codemirror/"+attr.theme+".css"); if(cm_active && cm_loaded == cm_active)
return cm_wait(e, cb);
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( $("head").append(
'<style type="text/css">'+ '<style type="text/css">'+
(ltype ? (ltype ?
@@ -116,10 +129,24 @@ cm_wait(cm_editor, callback)
'.CodeMirror {width: ' + (window.innerWidth - 300) + 'px;}')+ '.CodeMirror {width: ' + (window.innerWidth - 300) + 'px;}')+
'</style>'); '</style>');
loadScript("codemirror/"+type+".js", function(){ cm_active++;
log("Calling CodeMirror"); loadScript("codemirror/"+cm_attr.type+".js", function(){
var cm = CodeMirror.fromTextArea(cm_editor, attr); cm_loaded++;
if(callback) cm_wait(e, cb);
callback(cm);
}); });
} }
function cm_wait(cm_editor, callback, recursions) {
recursions = typeof recursions !== 'undefined' ? recursions : 0;
if(cm_loaded != cm_active) {
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);
}