diff --git a/fhem/CHANGED b/fhem/CHANGED index 8d504ced6..682854e03 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,19 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: codemirror modules now loaded by default: search.js, comment.js + dialog.js, autorefresh.js, searchcursor.js, dialog.css + codemirror search & replace is now activated by default. + to use this feature now you must only load in fhemweb + attribute 'JavaScripts' the codemirror/fhem_codemirror.js file + new extraKeys for 'TAB', 'Shift+Tab', 'STRG+Q', 'STRG+UP', + and 'STRG+DOWN' are added. + codemirror default parameters are now: + indentUnit:4, indentWithTabs:false, autoCloseBrackets:false, + matchBrackets:true, autofocus:true, theme:"blackboard", + lineNumbers:true, autoRefresh:true + this can be overwritten with fhemweb attribute 'codemirrorParam' + - updated: codemirror version to 5.8 + the default codemirror javascript files are now minified - feature: 70_XBMC: -added disable attribute -added reading tvshowid - feature: new module 00_SIGNALduino.pm and 90_SIGNALduino_un: added diff --git a/fhem/MAINTAINER.txt b/fhem/MAINTAINER.txt index 69fd3d37d..31c92ddda 100644 --- a/fhem/MAINTAINER.txt +++ b/fhem/MAINTAINER.txt @@ -354,7 +354,7 @@ contrib/98_PID.pm betateilchen http://forum.fhem.de Automatis contrib/WebViewControl/* Dirk http://forum.fhem.de Mobile Devices contrib/GDS/GDSweblink.pm jensb http://forum.fhem.de Unterstuetzende Dienste -www/codemirror/* betateilchen http://forum.fhem.de Frontends +www/codemirror/* rapster http://forum.fhem.de Frontends www/gplot/* rudolfkoenig http://forum.fhem.de Frontends www/images/* ulimaass http://forum.fhem.de Frontends www/pgm2/dashboard/* svenson08 http://forum.fhem.de Frontends diff --git a/fhem/www/codemirror/autorefresh.js b/fhem/www/codemirror/autorefresh.js new file mode 100644 index 000000000..7febfa415 --- /dev/null +++ b/fhem/www/codemirror/autorefresh.js @@ -0,0 +1,2 @@ +(function(c){"object"==typeof exports&&"object"==typeof module?c(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],c):c(CodeMirror)})(function(c){function f(b,a){function d(){b.display.wrapper.offsetHeight?(e(b,a),b.display.lastWrapHeight!=b.display.wrapper.clientHeight&&b.refresh()):a.timeout=setTimeout(d,a.delay)}a.timeout=setTimeout(d,a.delay);a.hurry=function(){clearTimeout(a.timeout);a.timeout=setTimeout(d,50)};c.on(window,"mouseup",a.hurry); +c.on(window,"keyup",a.hurry)}function e(b,a){clearTimeout(a.timeout);c.off(window,"mouseup",a.hurry);c.off(window,"keyup",a.hurry)}c.defineOption("autoRefresh",!1,function(b,a){b.state.autoRefresh&&(e(b,b.state.autoRefresh),b.state.autoRefresh=null);a&&0==b.display.wrapper.offsetHeight&&f(b,b.state.autoRefresh={delay:a.delay||250})})}); \ No newline at end of file diff --git a/fhem/www/codemirror/blackboard.css b/fhem/www/codemirror/blackboard.css index 8b7608472..b6eaedb18 100644 --- a/fhem/www/codemirror/blackboard.css +++ b/fhem/www/codemirror/blackboard.css @@ -1,17 +1,21 @@ /* Port of TextMate's Blackboard theme */ .cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; } -.cm-s-blackboard .CodeMirror-selected { background: #253B76 !important; } +.cm-s-blackboard div.CodeMirror-selected { background: #253B76; } +.cm-s-blackboard .CodeMirror-line::selection, .cm-s-blackboard .CodeMirror-line > span::selection, .cm-s-blackboard .CodeMirror-line > span > span::selection { background: rgba(37, 59, 118, .99); } +.cm-s-blackboard .CodeMirror-line::-moz-selection, .cm-s-blackboard .CodeMirror-line > span::-moz-selection, .cm-s-blackboard .CodeMirror-line > span > span::-moz-selection { background: rgba(37, 59, 118, .99); } .cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; } +.cm-s-blackboard .CodeMirror-guttermarker { color: #FBDE2D; } +.cm-s-blackboard .CodeMirror-guttermarker-subtle { color: #888; } .cm-s-blackboard .CodeMirror-linenumber { color: #888; } -.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; } +.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7; } .cm-s-blackboard .cm-keyword { color: #FBDE2D; } .cm-s-blackboard .cm-atom { color: #D8FA3C; } .cm-s-blackboard .cm-number { color: #D8FA3C; } .cm-s-blackboard .cm-def { color: #8DA6CE; } .cm-s-blackboard .cm-variable { color: #FF6400; } -.cm-s-blackboard .cm-operator { color: #FBDE2D;} +.cm-s-blackboard .cm-operator { color: #FBDE2D; } .cm-s-blackboard .cm-comment { color: #AEAEAE; } .cm-s-blackboard .cm-string { color: #61CE3C; } .cm-s-blackboard .cm-string-2 { color: #61CE3C; } @@ -24,5 +28,5 @@ .cm-s-blackboard .cm-link { color: #8DA6CE; } .cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; } -.cm-s-blackboard .CodeMirror-activeline-background {background: #3C3636 !important;} -.cm-s-blackboard .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important} \ No newline at end of file +.cm-s-blackboard .CodeMirror-activeline-background { background: #3C3636; } +.cm-s-blackboard .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; } diff --git a/fhem/www/codemirror/closebrackets.js b/fhem/www/codemirror/closebrackets.js index 0575222be..2d16a5112 100644 --- a/fhem/www/codemirror/closebrackets.js +++ b/fhem/www/codemirror/closebrackets.js @@ -1,84 +1,7 @@ -(function() { - var DEFAULT_BRACKETS = "()[]{}''\"\""; - var DEFAULT_EXPLODE_ON_ENTER = "[]{}"; - var SPACE_CHAR_REGEX = /\s/; - - CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) { - if (old != CodeMirror.Init && old) - cm.removeKeyMap("autoCloseBrackets"); - if (!val) return; - var pairs = DEFAULT_BRACKETS, explode = DEFAULT_EXPLODE_ON_ENTER; - if (typeof val == "string") pairs = val; - else if (typeof val == "object") { - if (val.pairs != null) pairs = val.pairs; - if (val.explode != null) explode = val.explode; - } - var map = buildKeymap(pairs); - if (explode) map.Enter = buildExplodeHandler(explode); - cm.addKeyMap(map); - }); - - function charsAround(cm, pos) { - var str = cm.getRange(CodeMirror.Pos(pos.line, pos.ch - 1), - CodeMirror.Pos(pos.line, pos.ch + 1)); - return str.length == 2 ? str : null; - } - - function buildKeymap(pairs) { - var map = { - name : "autoCloseBrackets", - Backspace: function(cm) { - if (cm.somethingSelected() || cm.getOption("disableInput")) return CodeMirror.Pass; - var cur = cm.getCursor(), around = charsAround(cm, cur); - if (around && pairs.indexOf(around) % 2 == 0) - cm.replaceRange("", CodeMirror.Pos(cur.line, cur.ch - 1), CodeMirror.Pos(cur.line, cur.ch + 1)); - else - return CodeMirror.Pass; - } - }; - var closingBrackets = ""; - for (var i = 0; i < pairs.length; i += 2) (function(left, right) { - if (left != right) closingBrackets += right; - function surround(cm) { - var selection = cm.getSelection(); - cm.replaceSelection(left + selection + right); - } - function maybeOverwrite(cm) { - var cur = cm.getCursor(), ahead = cm.getRange(cur, CodeMirror.Pos(cur.line, cur.ch + 1)); - if (ahead != right || cm.somethingSelected()) return CodeMirror.Pass; - else cm.execCommand("goCharRight"); - } - map["'" + left + "'"] = function(cm) { - if (left == "'" && cm.getTokenAt(cm.getCursor()).type == "comment" || - cm.getOption("disableInput")) - return CodeMirror.Pass; - if (cm.somethingSelected()) return surround(cm); - if (left == right && maybeOverwrite(cm) != CodeMirror.Pass) return; - var cur = cm.getCursor(), ahead = CodeMirror.Pos(cur.line, cur.ch + 1); - var line = cm.getLine(cur.line), nextChar = line.charAt(cur.ch), curChar = cur.ch > 0 ? line.charAt(cur.ch - 1) : ""; - if (left == right && CodeMirror.isWordChar(curChar)) - return CodeMirror.Pass; - if (line.length == cur.ch || closingBrackets.indexOf(nextChar) >= 0 || SPACE_CHAR_REGEX.test(nextChar)) - cm.replaceSelection(left + right, {head: ahead, anchor: ahead}); - else - return CodeMirror.Pass; - }; - if (left != right) map["'" + right + "'"] = maybeOverwrite; - })(pairs.charAt(i), pairs.charAt(i + 1)); - return map; - } - - function buildExplodeHandler(pairs) { - return function(cm) { - var cur = cm.getCursor(), around = charsAround(cm, cur); - if (!around || pairs.indexOf(around) % 2 != 0 || cm.getOption("disableInput")) - return CodeMirror.Pass; - cm.operation(function() { - var newPos = CodeMirror.Pos(cur.line + 1, 0); - cm.replaceSelection("\n\n", {anchor: newPos, head: newPos}, "+input"); - cm.indentLine(cur.line + 1, null, true); - cm.indentLine(cur.line + 2, null, true); - }); - }; - } -})(); +(function(f){"object"==typeof exports&&"object"==typeof module?f(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],f):f(CodeMirror)})(function(f){function r(b,a){return"pairs"==a&&"string"==typeof b?b:"object"==typeof b&&null!=b[a]?b[a]:w[a]}function z(b){return function(a){return A(a,b)}}function t(b){var a=b.state.closeBrackets;return a?b.getModeAt(b.getCursor()).closeBrackets||a:null}function A(b,a){var c=t(b);if(!c||b.getOption("disableInput"))return f.Pass; +var e=r(c,"pairs"),d=e.indexOf(a);if(-1==d)return f.Pass;for(var c=r(c,"triples"),u=e.charAt(d+1)==a,x=b.listSelections(),m=0==d%2,l,h,p=0;p=g.ch||b.getRange(k(g.line,g.ch-3),k(g.line,g.ch-2))!=a))h="addFour";else if(u)if(!f.isWordChar(h)&&B(b,g,a))h="both";else return f.Pass;else if(m&&(b.getLine(g.line).length== +g.ch||C(h,e)||/\s/.test(h)))h="both";else return f.Pass;else h=0<=c.indexOf(a)&&b.getRange(g,k(g.line,g.ch+3))==a+a+a?"skipThree":"skip";if(!l)l=h;else if(l!=h)return f.Pass}var n=d%2?e.charAt(d-1):a,v=d%2?a:e.charAt(d+1);b.operation(function(){if("skip"==l)b.execCommand("goCharRight");else if("skipThree"==l)for(var a=0;3>a;a++)b.execCommand("goCharRight");else if("surround"==l){for(var c=b.getSelections(),a=0;a=a.ch+1)return/\bstring2?\b/.test(e);c.start=c.pos}}var w={pairs:"()[]{}''\"\"",triples:"",explode:"[]{}"},k=f.Pos;f.defineOption("autoCloseBrackets",!1,function(b,a,c){c&&c!=f.Init&&(b.removeKeyMap(p),b.state.closeBrackets=null);a&&(b.state.closeBrackets= +a,b.addKeyMap(p))});for(var q=w.pairs+"`",p={Backspace:function(b){var a=t(b);if(!a||b.getOption("disableInput"))return f.Pass;for(var c=r(a,"pairs"),a=b.listSelections(),e=0;e