diff --git a/fhem/www/codemirror/comment-fold.js b/fhem/www/codemirror/comment-fold.js deleted file mode 100644 index adaa79d86..000000000 --- a/fhem/www/codemirror/comment-fold.js +++ /dev/null @@ -1,59 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: https://codemirror.net/5/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.registerGlobalHelper("fold", "comment", function(mode) { - return mode.blockCommentStart && mode.blockCommentEnd; -}, function(cm, start) { - var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd; - if (!startToken || !endToken) return; - var line = start.line, lineText = cm.getLine(line); - - var startCh; - for (var at = start.ch, pass = 0;;) { - var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1); - if (found == -1) { - if (pass == 1) return; - pass = 1; - at = lineText.length; - continue; - } - if (pass == 1 && found < start.ch) return; - if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1))) && - (found == 0 || lineText.slice(found - endToken.length, found) == endToken || - !/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found))))) { - startCh = found + startToken.length; - break; - } - at = found - 1; - } - - var depth = 1, lastLine = cm.lastLine(), end, endCh; - outer: for (var i = line; i <= lastLine; ++i) { - var text = cm.getLine(i), pos = i == line ? startCh : 0; - for (;;) { - var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos); - if (nextOpen < 0) nextOpen = text.length; - if (nextClose < 0) nextClose = text.length; - pos = Math.min(nextOpen, nextClose); - if (pos == text.length) break; - if (pos == nextOpen) ++depth; - else if (!--depth) { end = i; endCh = pos; break outer; } - ++pos; - } - } - if (end == null || line == end && endCh == startCh) return; - return {from: CodeMirror.Pos(line, startCh), - to: CodeMirror.Pos(end, endCh)}; -}); - -}); diff --git a/fhem/www/codemirror/fhem.js b/fhem/www/codemirror/fhem.js index 5843bd16e..f4852df2b 100644 --- a/fhem/www/codemirror/fhem.js +++ b/fhem/www/codemirror/fhem.js @@ -1,3 +1,3 @@ /* $Id$ */ -CodeMirror.defineMode("fhem",function(){var e={"->":4,"++":4,"--":4,"**":4,"=~":4,"!~":4,"*":4,"/":4,"%":4,x:4,"+":4,"-":4,".":4,"<<":4,">>":4,"<":4,">":4,"<=":4,">=":4,lt:4,gt:4,le:4,ge:4,"==":4,"!=":4,"<=>":4,eq:4,ne:4,cmp:4,"~~":4,"&":4,"|":4,"^":4,"&&":4,"||":4,"//":4,"..":4,"...":4,"?":4,":":4,"=":4,"+=":4,"-=":4,"*=":4,",":4,"=>":4,"::":4,not:4,and:4,or:4,xor:4,BEGIN:[5,1],END:[5,1],PRINT:[5,1],PRINTF:[5,1],GETC:[5,1],READ:[5,1],READLINE:[5,1],DESTROY:[5,1],TIE:[5,1],TIEHANDLE:[5,1],UNTIE:[5,1],STDIN:5,STDIN_TOP:5,STDOUT:5,STDOUT_TOP:5,STDERR:5,STDERR_TOP:5,$ARG:5,$_:5,"@ARG":5,"@_":5,$LIST_SEPARATOR:5,'$"':5,$PROCESS_ID:5,$PID:5,$$:5,$REAL_GROUP_ID:5,$GID:5,"$(":5,$EFFECTIVE_GROUP_ID:5,$EGID:5,"$)":5,$PROGRAM_NAME:5,$0:5,$SUBSCRIPT_SEPARATOR:5,$SUBSEP:5,"$;":5,$REAL_USER_ID:5,$UID:5,"$<":5,$EFFECTIVE_USER_ID:5,$EUID:5,"$>":5,$a:5,$b:5,$COMPILING:5,"$^C":5,$DEBUGGING:5,"$^D":5,"${^ENCODING}":5,$ENV:5,"%ENV":5,$SYSTEM_FD_MAX:5,"$^F":5,"@F":5,"${^GLOBAL_PHASE}":5,"$^H":5,"%^H":5,"@INC":5,"%INC":5,$INPLACE_EDIT:5,"$^I":5,"$^M":5,$OSNAME:5,"$^O":5,"${^OPEN}":5,$PERLDB:5,"$^P":5,$SIG:5,"%SIG":5,$BASETIME:5,"$^T":5,"${^TAINT}":5,"${^UNICODE}":5,"${^UTF8CACHE}":5,"${^UTF8LOCALE}":5,$PERL_VERSION:5,"$^V":5,"${^WIN32_SLOPPY_STAT}":5,$EXECUTABLE_NAME:5,"$^X":5,$1:5,$MATCH:5,"$&":5,"${^MATCH}":5,$PREMATCH:5,"$`":5,"${^PREMATCH}":5,$POSTMATCH:5,"$'":5,"${^POSTMATCH}":5,$LAST_PAREN_MATCH:5,"$+":5,$LAST_SUBMATCH_RESULT:5,"$^N":5,"@LAST_MATCH_END":5,"@+":5,"%LAST_PAREN_MATCH":5,"%+":5,"@LAST_MATCH_START":5,"@-":5,"%LAST_MATCH_START":5,"%-":5,$LAST_REGEXP_CODE_RESULT:5,"$^R":5,"${^RE_DEBUG_FLAGS}":5,"${^RE_TRIE_MAXBUF}":5,$ARGV:5,"@ARGV":5,ARGV:5,ARGVOUT:5,$OUTPUT_FIELD_SEPARATOR:5,$OFS:5,"$,":5,$INPUT_LINE_NUMBER:5,$NR:5,"$.":5,$INPUT_RECORD_SEPARATOR:5,$RS:5,"$/":5,$OUTPUT_RECORD_SEPARATOR:5,$ORS:5,"$\\":5,$OUTPUT_AUTOFLUSH:5,"$|":5,$ACCUMULATOR:5,"$^A":5,$FORMAT_FORMFEED:5,"$^L":5,$FORMAT_PAGE_NUMBER:5,"$%":5,$FORMAT_LINES_LEFT:5,"$-":5,$FORMAT_LINE_BREAK_CHARACTERS:5,"$:":5,$FORMAT_LINES_PER_PAGE:5,"$=":5,$FORMAT_TOP_NAME:5,"$^":5,$FORMAT_NAME:5,"$~":5,"${^CHILD_ERROR_NATIVE}":5,$EXTENDED_OS_ERROR:5,"$^E":5,$EXCEPTIONS_BEING_CAUGHT:5,"$^S":5,$WARNING:5,"$^W":5,"${^WARNING_BITS}":5,$OS_ERROR:5,$ERRNO:5,"$!":5,"%OS_ERROR":5,"%ERRNO":5,"%!":5,$CHILD_ERROR:5,"$?":5,$EVAL_ERROR:5,"$@":5,$OFMT:5,"$#":5,"$*":5,$ARRAY_BASE:5,"$[":5,$OLD_PERL_VERSION:5,"$]":5,$_blockingcalls:5,$SELF:5,$cmd:5,$DEVICE:5,$device:5,$EVENT:5,$event:5,$EVENTS:5,$events:5,$number:5,$name:5,$TYPE:5,$STATE:5,$room:5,$group:5,$week:5,$hm:5,$md:5,$ymd:5,$twe:5,$TABLE:5,$TD:5,$TR:5,$TC:5,$TPL:5,$ATTRIBUTESFIRST:5,$SHOWNOSTATE:5,$SHOWNODEVICELINE:5,$SHOWNODEVICELINK:5,if:[1,1],elsif:[1,1],else:[1,1],while:[1,1],unless:[1,1],for:[1,1],foreach:[1,1],abs:1,accept:1,alarm:1,atan2:1,bind:1,binmode:1,bless:1,bootstrap:1,break:1,caller:1,chdir:1,chmod:1,chomp:1,chop:1,chown:1,chr:1,chroot:1,close:1,closedir:1,connect:1,continue:[1,1],cos:1,crypt:1,dbmclose:1,dbmopen:1,default:1,defined:1,delete:1,die:1,do:1,dump:1,each:1,endgrent:1,endhostent:1,endnetent:1,endprotoent:1,endpwent:1,endservent:1,eof:1,eval:1,exec:1,exists:1,exit:1,exp:1,fcntl:1,fileno:1,flock:1,fork:1,format:1,formline:1,getc:1,getgrent:1,getgrgid:1,getgrnam:1,gethostbyaddr:1,gethostbyname:1,gethostent:1,getlogin:1,getnetbyaddr:1,getnetbyname:1,getnetent:1,getpeername:1,getpgrp:1,getppid:1,getpriority:1,getprotobyname:1,getprotobynumber:1,getprotoent:1,getpwent:1,getpwnam:1,getpwuid:1,getservbyname:1,getservbyport:1,getservent:1,getsockname:1,getsockopt:1,given:1,glob:1,gmtime:1,goto:1,grep:1,hex:1,import:1,index:1,int:1,ioctl:1,join:1,keys:1,kill:1,last:1,lc:1,lcfirst:1,length:1,link:1,listen:1,local:2,localtime:1,lock:1,log:1,lstat:1,m:null,map:1,mkdir:1,msgctl:1,msgget:1,msgrcv:1,msgsnd:1,my:2,new:1,next:1,no:1,oct:1,open:1,opendir:1,ord:1,our:2,pack:1,package:1,pipe:1,pop:1,pos:1,print:1,printf:1,prototype:1,push:1,q:null,qq:null,qr:null,quotemeta:null,qw:null,qx:null,rand:1,read:1,readdir:1,readline:1,readlink:1,readpipe:1,recv:1,redo:1,ref:1,rename:1,require:1,reset:1,return:1,reverse:1,rewinddir:1,rindex:1,rmdir:1,s:null,say:1,scalar:1,seek:1,seekdir:1,select:1,semctl:1,semget:1,semop:1,send:1,setgrent:1,sethostent:1,setnetent:1,setpgrp:1,setpriority:1,setprotoent:1,setpwent:1,setservent:1,setsockopt:1,shift:1,shmctl:1,shmget:1,shmread:1,shmwrite:1,shutdown:1,sin:1,sleep:1,socket:1,socketpair:1,sort:1,splice:1,split:1,sprintf:1,sqrt:1,srand:1,stat:1,state:1,study:1,sub:1,substr:1,symlink:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,tell:1,telldir:1,tie:1,tied:1,time:1,times:1,tr:null,truncate:1,uc:1,ucfirst:1,umask:1,undef:1,unlink:1,unpack:1,unshift:1,untie:1,use:1,utime:1,values:1,vec:1,wait:1,waitpid:1,wantarray:1,warn:1,when:1,write:1,define:2,defmod:2,attr:2,at:2,notify:2,set:2,ReadingsVal:1,OldReadingsVal:1,ReadingsNum:1,OldReadingsNum:1,ReadingsTimestamp:1,OldReadingsTimestamp:1,Value:1,fhem:1,IF:2,DOIF:2,DOELSE:2,DOELSEIF:2,y:null};keywords.foreach(function(t,r){e[r]=2});var t="string-2",r=/[goseximacplud]/;function i(e,t,r,i,n){return t.chain=null,t.style=null,t.tail=null,t.tokenize=function(e,t){for(var a,o=!1,_=0;a=e.next();){if(a===r[_]&&!o){void 0!==r[++_]?(t.chain=r[_],t.style=i,t.tail=n):n&&e.eatWhile(n),t.tokenize=s;break}o=!o&&"\\"==a}return i},t.tokenize(e,t)}function n(e,t,r){return t.tokenize=function(e,t){return e.string==r&&(t.tokenize=s),e.skipToEnd(),"string"},t.tokenize(e,t)}function s(s,a){if(s.eatSpace())return null;if(a.chain)return i(s,a,a.chain,a.style,a.tail);if(s.match(/^\-?[\d\.]/,!1)&&s.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/))return"number";if(s.match(/^<<(?=\w)/))return s.eatWhile(/\w/),n(s,a,s.current().substr(2));if(s.sol()&&s.match(/^\=item(?!\w)/))return n(s,a,"=cut");var o=s.next();if('"'==o||"'"==o){if(s.prefix(3)=="<<"+o){var _=s.pos;s.eatWhile(/\w/);var l=s.current().substr(1);if(l&&s.eat(o))return n(s,a,l);s.pos=_}return i(s,a,[o],"string")}if("q"==o){var f=s.look(-2);if(!(f&&/\w/.test(f))){if("x"==(f=s.look(0))){if("("==(f=s.look(1)))return s.eatSuffix(2),i(s,a,[")"],t,r);if("["==f)return s.eatSuffix(2),i(s,a,["]"],t,r);if("{"==f)return s.eatSuffix(2),i(s,a,["}"],t,r);if("<"==f)return s.eatSuffix(2),i(s,a,[">"],t,r);if(/[\^'"!~\/]/.test(f))return s.eatSuffix(1),i(s,a,[s.eat(f)],t,r)}else if("q"==f){if("("==(f=s.look(1)))return s.eatSuffix(2),i(s,a,[")"],"string");if("["==f)return s.eatSuffix(2),i(s,a,["]"],"string");if("{"==f)return s.eatSuffix(2),i(s,a,["}"],"string");if("<"==f)return s.eatSuffix(2),i(s,a,[">"],"string");if(/[\^'"!~\/]/.test(f))return s.eatSuffix(1),i(s,a,[s.eat(f)],"string")}else if("w"==f){if("("==(f=s.look(1)))return s.eatSuffix(2),i(s,a,[")"],"bracket");if("["==f)return s.eatSuffix(2),i(s,a,["]"],"bracket");if("{"==f)return s.eatSuffix(2),i(s,a,["}"],"bracket");if("<"==f)return s.eatSuffix(2),i(s,a,[">"],"bracket");if(/[\^'"!~\/]/.test(f))return s.eatSuffix(1),i(s,a,[s.eat(f)],"bracket")}else if("r"==f){if("("==(f=s.look(1)))return s.eatSuffix(2),i(s,a,[")"],t,r);if("["==f)return s.eatSuffix(2),i(s,a,["]"],t,r);if("{"==f)return s.eatSuffix(2),i(s,a,["}"],t,r);if("<"==f)return s.eatSuffix(2),i(s,a,[">"],t,r);if(/[\^'"!~\/]/.test(f))return s.eatSuffix(1),i(s,a,[s.eat(f)],t,r)}else if(/[\^'"!~\/(\[{<]/.test(f)){if("("==f)return s.eatSuffix(1),i(s,a,[")"],"string");if("["==f)return s.eatSuffix(1),i(s,a,["]"],"string");if("{"==f)return s.eatSuffix(1),i(s,a,["}"],"string");if("<"==f)return s.eatSuffix(1),i(s,a,[">"],"string");if(/[\^'"!~\/]/.test(f))return i(s,a,[s.eat(f)],"string")}}}if("m"==o){var f=s.look(-2);if(!(f&&/\w/.test(f))&&(f=s.eat(/[(\[{<\^'"!~\/]/))){if(/[\^'"!~\/]/.test(f))return i(s,a,[f],t,r);if("("==f)return i(s,a,[")"],t,r);if("["==f)return i(s,a,["]"],t,r);if("{"==f)return i(s,a,["}"],t,r);if("<"==f)return i(s,a,[">"],t,r)}}if("s"==o||"y"==o){var f=/[\/>\]})\w]/.test(s.look(-2));if(!f&&(f=s.eat(/[(\[{<\^'"!~\/]/)))return"["==f?i(s,a,["]","]"],t,r):"{"==f?i(s,a,["}","}"],t,r):"<"==f?i(s,a,[">",">"],t,r):"("==f?i(s,a,[")",")"],t,r):i(s,a,[f,f],t,r)}if("t"==o){var f=/[\/>\]})\w]/.test(s.look(-2));if(!f&&(f=s.eat("r"))&&(f=s.eat(/[(\[{<\^'"!~\/]/)))return"["==f?i(s,a,["]","]"],t,r):"{"==f?i(s,a,["}","}"],t,r):"<"==f?i(s,a,[">",">"],t,r):"("==f?i(s,a,[")",")"],t,r):i(s,a,[f,f],t,r)}if("`"==o)return i(s,a,[o],"variable-2");if("/"==o)return/~\s*$/.test(s.prefix())?i(s,a,[o],t,r):"operator";if("$"==o){var _=s.pos;if(s.eatWhile(/\d/)||s.eat("{")&&s.eatWhile(/\d/)&&s.eat("}"))return"variable-2";s.pos=_}if(/[$@%]/.test(o)){var _=s.pos;if(s.eat("^")&&s.eat(/[A-Z]/)||!/[@$%&]/.test(s.look(-2))&&s.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){var f=s.current();if(e[f])return"variable-2"}s.pos=_}if(/[$@%&]/.test(o)&&(s.eatWhile(/[\w$\[\]]/)||s.eat("{")&&s.eatWhile(/[\w$\[\]]/)&&s.eat("}"))){var f=s.current();return e[f]?"variable-2":"variable"}if("#"==o&&"$"!=s.look(-2))return s.skipToEnd(),"comment";if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(o)){var _=s.pos;if(s.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/),e[s.current()])return"operator";s.pos=_}if("_"==o&&1==s.pos){if("_END__"==s.suffix(6))return i(s,a,["\0"],"comment");if("_DATA__"==s.suffix(7))return i(s,a,["\0"],"variable-2");if("_C__"==s.suffix(7))return i(s,a,["\0"],"string")}if(/\w/.test(o)){var _=s.pos;if("{"==s.look(-2)&&("}"==s.look(0)||s.eatWhile(/\w/)&&"}"==s.look(0)))return"string";s.pos=_}if(/[A-Z]/.test(o)){var u=s.look(-2),_=s.pos;if(s.eatWhile(/[A-Z_]/),/[\da-z]/.test(s.look(0)))s.pos=_;else{var f=e[s.current()];if(!f||(f[1]&&(f=f[0]),":"==u))return"meta";if(1==f)return"keyword";if(2==f)return"def";if(3==f)return"atom";else if(4==f)return"operator";else if(5==f)return"variable-2";else return"meta"}}if(/[a-zA-Z_]/.test(o)){var u=s.look(-2);s.eatWhile(/\w/);var f=e[s.current()];if(!f||(f[1]&&(f=f[0]),":"==u))return"meta";if(1==f)return"keyword";if(2==f)return"def";if(3==f)return"atom";else if(4==f)return"operator";else if(5==f)return"variable-2";else return"meta"}return null}return{startState:function(){return{tokenize:s,chain:null,style:null,tail:null}},token:function(e,t){return(t.tokenize||s)(e,t)},electricChars:"{}"}}),CodeMirror.defineMIME("text/x-fhem","fhem"),CodeMirror.StringStream.prototype.look=function(e){return this.string.charAt(this.pos+(e||0))},CodeMirror.StringStream.prototype.prefix=function(e){if(!e)return this.string.substr(0,this.pos-1);var t=this.pos-e;return this.string.substr(t>=0?t:0,e)},CodeMirror.StringStream.prototype.suffix=function(e){var t=this.string.length,r=t-this.pos+1;return this.string.substr(this.pos,e&&e=(t=this.string.length-1)?this.pos=t:this.pos=r},Array.prototype.foreach=function(e){for(var t=0;ts&&(r=n+1),n=Math.floor((i+r)/2);return s!=t?null:e[n]}n=l,s=u,a=f,o=c,_=[],n.foreach(function(e,t){0==t.lastIndexOf(o,0)&&_.push({text:t,className:"hintkeyword"})}),s.foreach(function(e,t){0==t.Name.lastIndexOf(o,0)&&(t.Attributes&&null!=t.Attributes.alias?_.push({text:t.Name,displayText:t.Name+" # "+t.Attributes.alias}):_.push(t.Name))}),a.foreach(function(e,t){0==t.lastIndexOf(o,0)&&_.push({text:t,className:"hintvariable"})}),r({list:_,from:CodeMirror.Pos(d.line,g),to:CodeMirror.Pos(d.line,m)})}); +CodeMirror.defineMode("fhem",function(){var e={"->":4,"++":4,"--":4,"**":4,"=~":4,"!~":4,"*":4,"/":4,"%":4,x:4,"+":4,"-":4,".":4,"<<":4,">>":4,"<":4,">":4,"<=":4,">=":4,lt:4,gt:4,le:4,ge:4,"==":4,"!=":4,"<=>":4,eq:4,ne:4,cmp:4,"~~":4,"&":4,"|":4,"^":4,"&&":4,"||":4,"//":4,"..":4,"...":4,"?":4,":":4,"=":4,"+=":4,"-=":4,"*=":4,",":4,"=>":4,"::":4,not:4,and:4,or:4,xor:4,BEGIN:[5,1],END:[5,1],PRINT:[5,1],PRINTF:[5,1],GETC:[5,1],READ:[5,1],READLINE:[5,1],DESTROY:[5,1],TIE:[5,1],TIEHANDLE:[5,1],UNTIE:[5,1],STDIN:5,STDIN_TOP:5,STDOUT:5,STDOUT_TOP:5,STDERR:5,STDERR_TOP:5,$ARG:5,$_:5,"@ARG":5,"@_":5,$LIST_SEPARATOR:5,'$"':5,$PROCESS_ID:5,$PID:5,$$:5,$REAL_GROUP_ID:5,$GID:5,"$(":5,$EFFECTIVE_GROUP_ID:5,$EGID:5,"$)":5,$PROGRAM_NAME:5,$0:5,$SUBSCRIPT_SEPARATOR:5,$SUBSEP:5,"$;":5,$REAL_USER_ID:5,$UID:5,"$<":5,$EFFECTIVE_USER_ID:5,$EUID:5,"$>":5,$a:5,$b:5,$COMPILING:5,"$^C":5,$DEBUGGING:5,"$^D":5,"${^ENCODING}":5,$ENV:5,"%ENV":5,$SYSTEM_FD_MAX:5,"$^F":5,"@F":5,"${^GLOBAL_PHASE}":5,"$^H":5,"%^H":5,"@INC":5,"%INC":5,$INPLACE_EDIT:5,"$^I":5,"$^M":5,$OSNAME:5,"$^O":5,"${^OPEN}":5,$PERLDB:5,"$^P":5,$SIG:5,"%SIG":5,$BASETIME:5,"$^T":5,"${^TAINT}":5,"${^UNICODE}":5,"${^UTF8CACHE}":5,"${^UTF8LOCALE}":5,$PERL_VERSION:5,"$^V":5,"${^WIN32_SLOPPY_STAT}":5,$EXECUTABLE_NAME:5,"$^X":5,$1:5,$MATCH:5,"$&":5,"${^MATCH}":5,$PREMATCH:5,"$`":5,"${^PREMATCH}":5,$POSTMATCH:5,"$'":5,"${^POSTMATCH}":5,$LAST_PAREN_MATCH:5,"$+":5,$LAST_SUBMATCH_RESULT:5,"$^N":5,"@LAST_MATCH_END":5,"@+":5,"%LAST_PAREN_MATCH":5,"%+":5,"@LAST_MATCH_START":5,"@-":5,"%LAST_MATCH_START":5,"%-":5,$LAST_REGEXP_CODE_RESULT:5,"$^R":5,"${^RE_DEBUG_FLAGS}":5,"${^RE_TRIE_MAXBUF}":5,$ARGV:5,"@ARGV":5,ARGV:5,ARGVOUT:5,$OUTPUT_FIELD_SEPARATOR:5,$OFS:5,"$,":5,$INPUT_LINE_NUMBER:5,$NR:5,"$.":5,$INPUT_RECORD_SEPARATOR:5,$RS:5,"$/":5,$OUTPUT_RECORD_SEPARATOR:5,$ORS:5,"$\\":5,$OUTPUT_AUTOFLUSH:5,"$|":5,$ACCUMULATOR:5,"$^A":5,$FORMAT_FORMFEED:5,"$^L":5,$FORMAT_PAGE_NUMBER:5,"$%":5,$FORMAT_LINES_LEFT:5,"$-":5,$FORMAT_LINE_BREAK_CHARACTERS:5,"$:":5,$FORMAT_LINES_PER_PAGE:5,"$=":5,$FORMAT_TOP_NAME:5,"$^":5,$FORMAT_NAME:5,"$~":5,"${^CHILD_ERROR_NATIVE}":5,$EXTENDED_OS_ERROR:5,"$^E":5,$EXCEPTIONS_BEING_CAUGHT:5,"$^S":5,$WARNING:5,"$^W":5,"${^WARNING_BITS}":5,$OS_ERROR:5,$ERRNO:5,"$!":5,"%OS_ERROR":5,"%ERRNO":5,"%!":5,$CHILD_ERROR:5,"$?":5,$EVAL_ERROR:5,"$@":5,$OFMT:5,"$#":5,"$*":5,$ARRAY_BASE:5,"$[":5,$OLD_PERL_VERSION:5,"$]":5,$_blockingcalls:5,$SELF:5,$cmd:5,$DEVICE:5,$device:5,$EVENT:5,$event:5,$EVENTS:5,$events:5,$number:5,$name:5,$TYPE:5,$STATE:5,$room:5,$group:5,$week:5,$hm:5,$md:5,$ymd:5,$twe:5,$TABLE:5,$TD:5,$TR:5,$TC:5,$TPL:5,$ATTRIBUTESFIRST:5,$SHOWNOSTATE:5,$SHOWNODEVICELINE:5,$SHOWNODEVICELINK:5,if:[1,1],elsif:[1,1],else:[1,1],while:[1,1],unless:[1,1],for:[1,1],foreach:[1,1],abs:1,accept:1,alarm:1,atan2:1,bind:1,binmode:1,bless:1,bootstrap:1,break:1,caller:1,chdir:1,chmod:1,chomp:1,chop:1,chown:1,chr:1,chroot:1,close:1,closedir:1,connect:1,continue:[1,1],cos:1,crypt:1,dbmclose:1,dbmopen:1,default:1,defined:1,delete:1,die:1,do:1,dump:1,each:1,endgrent:1,endhostent:1,endnetent:1,endprotoent:1,endpwent:1,endservent:1,eof:1,eval:1,exec:1,exists:1,exit:1,exp:1,fcntl:1,fileno:1,flock:1,fork:1,format:1,formline:1,getc:1,getgrent:1,getgrgid:1,getgrnam:1,gethostbyaddr:1,gethostbyname:1,gethostent:1,getlogin:1,getnetbyaddr:1,getnetbyname:1,getnetent:1,getpeername:1,getpgrp:1,getppid:1,getpriority:1,getprotobyname:1,getprotobynumber:1,getprotoent:1,getpwent:1,getpwnam:1,getpwuid:1,getservbyname:1,getservbyport:1,getservent:1,getsockname:1,getsockopt:1,given:1,glob:1,gmtime:1,goto:1,grep:1,hex:1,import:1,index:1,int:1,ioctl:1,join:1,keys:1,kill:1,last:1,lc:1,lcfirst:1,length:1,link:1,listen:1,local:2,localtime:1,lock:1,log:1,lstat:1,m:null,map:1,mkdir:1,msgctl:1,msgget:1,msgrcv:1,msgsnd:1,my:2,new:1,next:1,no:1,oct:1,open:1,opendir:1,ord:1,our:2,pack:1,package:1,pipe:1,pop:1,pos:1,print:1,printf:1,prototype:1,push:1,q:null,qq:null,qr:null,quotemeta:null,qw:null,qx:null,rand:1,read:1,readdir:1,readline:1,readlink:1,readpipe:1,recv:1,redo:1,ref:1,rename:1,require:1,reset:1,return:1,reverse:1,rewinddir:1,rindex:1,rmdir:1,s:null,say:1,scalar:1,seek:1,seekdir:1,select:1,semctl:1,semget:1,semop:1,send:1,setgrent:1,sethostent:1,setnetent:1,setpgrp:1,setpriority:1,setprotoent:1,setpwent:1,setservent:1,setsockopt:1,shift:1,shmctl:1,shmget:1,shmread:1,shmwrite:1,shutdown:1,sin:1,sleep:1,socket:1,socketpair:1,sort:1,splice:1,split:1,sprintf:1,sqrt:1,srand:1,stat:1,state:1,study:1,sub:1,substr:1,symlink:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,tell:1,telldir:1,tie:1,tied:1,time:1,times:1,tr:null,truncate:1,uc:1,ucfirst:1,umask:1,undef:1,unlink:1,unpack:1,unshift:1,untie:1,use:1,utime:1,values:1,vec:1,wait:1,waitpid:1,wantarray:1,warn:1,when:1,write:1,define:2,defmod:2,attr:2,at:2,notify:2,set:2,ReadingsVal:1,OldReadingsVal:1,ReadingsNum:1,OldReadingsNum:1,ReadingsTimestamp:1,OldReadingsTimestamp:1,Value:1,fhem:1,IF:2,DOIF:2,DOELSE:2,DOELSEIF:2,y:null};keywords.foreach(function(t,r){e[r]=2});var t="string-2",r=/[goseximacplud]/;function i(e,t,r,i,n){return t.chain=null,t.style=null,t.tail=null,t.tokenize=function(e,t){for(var a,o=!1,_=0;a=e.next();){if(a===r[_]&&!o){void 0!==r[++_]?(t.chain=r[_],t.style=i,t.tail=n):n&&e.eatWhile(n),t.tokenize=s;break}o=!o&&"\\"==a}return i},t.tokenize(e,t)}function n(e,t,r){return t.tokenize=function(e,t){return e.string==r&&(t.tokenize=s),e.skipToEnd(),"string"},t.tokenize(e,t)}function s(s,a){if(s.eatSpace())return null;if(a.chain)return i(s,a,a.chain,a.style,a.tail);if(s.match(/^\-?[\d\.]/,!1)&&s.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/))return"number";if(s.match(/^<<(?=\w)/))return s.eatWhile(/\w/),n(s,a,s.current().substr(2));if(s.sol()&&s.match(/^\=item(?!\w)/))return n(s,a,"=cut");var o=s.next();if('"'==o||"'"==o){if(s.prefix(3)=="<<"+o){var _=s.pos;s.eatWhile(/\w/);var l=s.current().substr(1);if(l&&s.eat(o))return n(s,a,l);s.pos=_}return i(s,a,[o],"string")}if("q"==o){var f=s.look(-2);if(!(f&&/\w/.test(f))){if("x"==(f=s.look(0))){if("("==(f=s.look(1)))return s.eatSuffix(2),i(s,a,[")"],t,r);if("["==f)return s.eatSuffix(2),i(s,a,["]"],t,r);if("{"==f)return s.eatSuffix(2),i(s,a,["}"],t,r);if("<"==f)return s.eatSuffix(2),i(s,a,[">"],t,r);if(/[\^'"!~\/]/.test(f))return s.eatSuffix(1),i(s,a,[s.eat(f)],t,r)}else if("q"==f){if("("==(f=s.look(1)))return s.eatSuffix(2),i(s,a,[")"],"string");if("["==f)return s.eatSuffix(2),i(s,a,["]"],"string");if("{"==f)return s.eatSuffix(2),i(s,a,["}"],"string");if("<"==f)return s.eatSuffix(2),i(s,a,[">"],"string");if(/[\^'"!~\/]/.test(f))return s.eatSuffix(1),i(s,a,[s.eat(f)],"string")}else if("w"==f){if("("==(f=s.look(1)))return s.eatSuffix(2),i(s,a,[")"],"bracket");if("["==f)return s.eatSuffix(2),i(s,a,["]"],"bracket");if("{"==f)return s.eatSuffix(2),i(s,a,["}"],"bracket");if("<"==f)return s.eatSuffix(2),i(s,a,[">"],"bracket");if(/[\^'"!~\/]/.test(f))return s.eatSuffix(1),i(s,a,[s.eat(f)],"bracket")}else if("r"==f){if("("==(f=s.look(1)))return s.eatSuffix(2),i(s,a,[")"],t,r);if("["==f)return s.eatSuffix(2),i(s,a,["]"],t,r);if("{"==f)return s.eatSuffix(2),i(s,a,["}"],t,r);if("<"==f)return s.eatSuffix(2),i(s,a,[">"],t,r);if(/[\^'"!~\/]/.test(f))return s.eatSuffix(1),i(s,a,[s.eat(f)],t,r)}else if(/[\^'"!~\/(\[{<]/.test(f)){if("("==f)return s.eatSuffix(1),i(s,a,[")"],"string");if("["==f)return s.eatSuffix(1),i(s,a,["]"],"string");if("{"==f)return s.eatSuffix(1),i(s,a,["}"],"string");if("<"==f)return s.eatSuffix(1),i(s,a,[">"],"string");if(/[\^'"!~\/]/.test(f))return i(s,a,[s.eat(f)],"string")}}}if("m"==o){var f=s.look(-2);if(!(f&&/\w/.test(f))&&(f=s.eat(/[(\[{<\^'"!~\/]/))){if(/[\^'"!~\/]/.test(f))return i(s,a,[f],t,r);if("("==f)return i(s,a,[")"],t,r);if("["==f)return i(s,a,["]"],t,r);if("{"==f)return i(s,a,["}"],t,r);if("<"==f)return i(s,a,[">"],t,r)}}if("s"==o||"y"==o){var f=/[\/>\]})\w]/.test(s.look(-2));if(!f&&(f=s.eat(/[(\[{<\^'"!~\/]/)))return"["==f?i(s,a,["]","]"],t,r):"{"==f?i(s,a,["}","}"],t,r):"<"==f?i(s,a,[">",">"],t,r):"("==f?i(s,a,[")",")"],t,r):i(s,a,[f,f],t,r)}if("t"==o){var f=/[\/>\]})\w]/.test(s.look(-2));if(!f&&(f=s.eat("r"))&&(f=s.eat(/[(\[{<\^'"!~\/]/)))return"["==f?i(s,a,["]","]"],t,r):"{"==f?i(s,a,["}","}"],t,r):"<"==f?i(s,a,[">",">"],t,r):"("==f?i(s,a,[")",")"],t,r):i(s,a,[f,f],t,r)}if("`"==o)return i(s,a,[o],"variable-2");if("/"==o)return/~\s*$/.test(s.prefix())?i(s,a,[o],t,r):"operator";if("$"==o){var _=s.pos;if(s.eatWhile(/\d/)||s.eat("{")&&s.eatWhile(/\d/)&&s.eat("}"))return"variable-2";s.pos=_}if(/[$@%]/.test(o)){var _=s.pos;if(s.eat("^")&&s.eat(/[A-Z]/)||!/[@$%&]/.test(s.look(-2))&&s.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){var f=s.current();if(e[f])return"variable-2"}s.pos=_}if(/[$@%&]/.test(o)&&(s.eatWhile(/[\w$\[\]]/)||s.eat("{")&&s.eatWhile(/[\w$\[\]]/)&&s.eat("}"))){var f=s.current();return e[f]?"variable-2":"variable"}if("#"==o&&"$"!=s.look(-2))return s.skipToEnd(),"comment";if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(o)){var _=s.pos;if(s.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/),e[s.current()])return"operator";s.pos=_}if("_"==o&&1==s.pos){if("_END__"==s.suffix(6))return i(s,a,["\0"],"comment");if("_DATA__"==s.suffix(7))return i(s,a,["\0"],"variable-2");if("_C__"==s.suffix(7))return i(s,a,["\0"],"string")}if(/\w/.test(o)){var _=s.pos;if("{"==s.look(-2)&&("}"==s.look(0)||s.eatWhile(/\w/)&&"}"==s.look(0)))return"string";s.pos=_}if(/[A-Z]/.test(o)){var u=s.look(-2),_=s.pos;if(s.eatWhile(/[A-Z_]/),/[\da-z]/.test(s.look(0)))s.pos=_;else{var f=e[s.current()];if(!f||(f[1]&&(f=f[0]),":"==u))return"meta";if(1==f)return"keyword";if(2==f)return"def";if(3==f)return"atom";else if(4==f)return"operator";else if(5==f)return"variable-2";else return"meta"}}if(/[a-zA-Z_]/.test(o)){var u=s.look(-2);s.eatWhile(/\w/);var f=e[s.current()];if(!f||(f[1]&&(f=f[0]),":"==u))return"meta";if(1==f)return"keyword";if(2==f)return"def";if(3==f)return"atom";else if(4==f)return"operator";else if(5==f)return"variable-2";else return"meta"}return null}return{startState:function(){return{tokenize:s,chain:null,style:null,tail:null}},token:function(e,t){return(t.tokenize||s)(e,t)},fold:"brace",electricChars:"{}"}}),CodeMirror.defineMIME("text/x-fhem","fhem"),CodeMirror.StringStream.prototype.look=function(e){return this.string.charAt(this.pos+(e||0))},CodeMirror.StringStream.prototype.prefix=function(e){if(!e)return this.string.substr(0,this.pos-1);var t=this.pos-e;return this.string.substr(t>=0?t:0,e)},CodeMirror.StringStream.prototype.suffix=function(e){var t=this.string.length,r=t-this.pos+1;return this.string.substr(this.pos,e&&e=(t=this.string.length-1)?this.pos=t:this.pos=r},Array.prototype.foreach=function(e){for(var t=0;ts&&(r=n+1),n=Math.floor((i+r)/2);return s!=t?null:e[n]}n=l,s=u,a=f,o=c,_=[],n.foreach(function(e,t){0==t.lastIndexOf(o,0)&&_.push({text:t,className:"hintkeyword"})}),s.foreach(function(e,t){0==t.Name.lastIndexOf(o,0)&&(t.Attributes&&null!=t.Attributes.alias?_.push({text:t.Name,displayText:t.Name+" # "+t.Attributes.alias}):_.push(t.Name))}),a.foreach(function(e,t){0==t.lastIndexOf(o,0)&&_.push({text:t,className:"hintvariable"})}),r({list:_,from:CodeMirror.Pos(d.line,g),to:CodeMirror.Pos(d.line,m)})}); diff --git a/fhem/www/codemirror/fhem.js.unoptimized b/fhem/www/codemirror/fhem.js.unoptimized index 9ca45c1c4..25e2252f4 100644 --- a/fhem/www/codemirror/fhem.js.unoptimized +++ b/fhem/www/codemirror/fhem.js.unoptimized @@ -829,6 +829,7 @@ stream.eatSuffix(2); tail:null};}, token:function(stream,state){ return (state.tokenize||tokenPerl)(stream,state);}, + fold:"brace", electricChars:"{}"};}); CodeMirror.defineMIME("text/x-fhem", "fhem"); @@ -899,7 +900,8 @@ var devices = []; CodeMirror.registerHelper("hint", "fhem", function hintfhem(cm, callback, options) { if( devices.length == 0 ) { - $.getJSON( '/fhem?cmd=jsonlist2', function ( data ) { + csrf = body.getAttribute('fwcsrf'); + $.getJSON( '/fhem?cmd=jsonlist2&fwcsrf='+csrf, function ( data ) { if( devices.length == 0 ) { data.Results.foreach( function(k,v) { devices.push(v); diff --git a/fhem/www/codemirror/fhem_codemirror.js b/fhem/www/codemirror/fhem_codemirror.js index 2953f2840..1d4084b59 100644 --- a/fhem/www/codemirror/fhem_codemirror.js +++ b/fhem/www/codemirror/fhem_codemirror.js @@ -14,6 +14,7 @@ var cm_attr = { autoCloseBrackets: true, indentUnit: 4, type: "fhem", + mode: "fhem", theme: "blackboard", indentWithTabs: true, autofocus: true, @@ -87,11 +88,7 @@ function AddCodeMirror(e, cb) { loadScript("codemirror/foldgutter.js", function(){cm_loaded++;} ); cm_attr.extraKeys['Ctrl-X'] = function(cm){ cm.foldCode(cm.getCursor()) }; cm_active++; loadScript("codemirror/brace-fold.js", function(){cm_loaded++;} ); - cm_active++; loadScript("codemirror/comment-fold.js", function(){cm_loaded++;} ); cm_active++; loadScript("codemirror/foldcode.js", function(){cm_loaded++;} ); - cm_active++; loadScript("codemirror/indent-fold.js", function(){cm_loaded++;} ); - cm_active++; loadScript("codemirror/markdown-fold.js", function(){cm_loaded++;} ); - cm_active++; loadScript("codemirror/xml-fold.js", function(){cm_loaded++;} ); cm_attr.gutters = ["CodeMirror-linenumbers", "CodeMirror-foldgutter"]; } if (cm_attr.autoCloseBrackets) { diff --git a/fhem/www/codemirror/indent-fold.js b/fhem/www/codemirror/indent-fold.js deleted file mode 100644 index 470e84ac4..000000000 --- a/fhem/www/codemirror/indent-fold.js +++ /dev/null @@ -1,48 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: https://codemirror.net/5/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -function lineIndent(cm, lineNo) { - var text = cm.getLine(lineNo) - var spaceTo = text.search(/\S/) - if (spaceTo == -1 || /\bcomment\b/.test(cm.getTokenTypeAt(CodeMirror.Pos(lineNo, spaceTo + 1)))) - return -1 - return CodeMirror.countColumn(text, null, cm.getOption("tabSize")) -} - -CodeMirror.registerHelper("fold", "indent", function(cm, start) { - var myIndent = lineIndent(cm, start.line) - if (myIndent < 0) return - var lastLineInFold = null - - // Go through lines until we find a line that definitely doesn't belong in - // the block we're folding, or to the end. - for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) { - var indent = lineIndent(cm, i) - if (indent == -1) { - } else if (indent > myIndent) { - // Lines with a greater indent are considered part of the block. - lastLineInFold = i; - } else { - // If this line has non-space, non-comment content, and is - // indented less or equal to the start line, it is the start of - // another block. - break; - } - } - if (lastLineInFold) return { - from: CodeMirror.Pos(start.line, cm.getLine(start.line).length), - to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length) - }; -}); - -}); diff --git a/fhem/www/codemirror/markdown-fold.js b/fhem/www/codemirror/markdown-fold.js deleted file mode 100644 index 4f9cb02f1..000000000 --- a/fhem/www/codemirror/markdown-fold.js +++ /dev/null @@ -1,49 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: https://codemirror.net/5/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.registerHelper("fold", "markdown", function(cm, start) { - var maxDepth = 100; - - function isHeader(lineNo) { - var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0)); - return tokentype && /\bheader\b/.test(tokentype); - } - - function headerLevel(lineNo, line, nextLine) { - var match = line && line.match(/^#+/); - if (match && isHeader(lineNo)) return match[0].length; - match = nextLine && nextLine.match(/^[=\-]+\s*$/); - if (match && isHeader(lineNo + 1)) return nextLine[0] == "=" ? 1 : 2; - return maxDepth; - } - - var firstLine = cm.getLine(start.line), nextLine = cm.getLine(start.line + 1); - var level = headerLevel(start.line, firstLine, nextLine); - if (level === maxDepth) return undefined; - - var lastLineNo = cm.lastLine(); - var end = start.line, nextNextLine = cm.getLine(end + 2); - while (end < lastLineNo) { - if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break; - ++end; - nextLine = nextNextLine; - nextNextLine = cm.getLine(end + 2); - } - - return { - from: CodeMirror.Pos(start.line, firstLine.length), - to: CodeMirror.Pos(end, cm.getLine(end).length) - }; -}); - -}); diff --git a/fhem/www/codemirror/xml-fold.js b/fhem/www/codemirror/xml-fold.js deleted file mode 100644 index 5450d374a..000000000 --- a/fhem/www/codemirror/xml-fold.js +++ /dev/null @@ -1,184 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: https://codemirror.net/5/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - var Pos = CodeMirror.Pos; - function cmp(a, b) { return a.line - b.line || a.ch - b.ch; } - - var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; - var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; - var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g"); - - function Iter(cm, line, ch, range) { - this.line = line; this.ch = ch; - this.cm = cm; this.text = cm.getLine(line); - this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine(); - this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine(); - } - - function tagAt(iter, ch) { - var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch)); - return type && /\btag\b/.test(type); - } - - function nextLine(iter) { - if (iter.line >= iter.max) return; - iter.ch = 0; - iter.text = iter.cm.getLine(++iter.line); - return true; - } - function prevLine(iter) { - if (iter.line <= iter.min) return; - iter.text = iter.cm.getLine(--iter.line); - iter.ch = iter.text.length; - return true; - } - - function toTagEnd(iter) { - for (;;) { - var gt = iter.text.indexOf(">", iter.ch); - if (gt == -1) { if (nextLine(iter)) continue; else return; } - if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; } - var lastSlash = iter.text.lastIndexOf("/", gt); - var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); - iter.ch = gt + 1; - return selfClose ? "selfClose" : "regular"; - } - } - function toTagStart(iter) { - for (;;) { - var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1; - if (lt == -1) { if (prevLine(iter)) continue; else return; } - if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; } - xmlTagStart.lastIndex = lt; - iter.ch = lt; - var match = xmlTagStart.exec(iter.text); - if (match && match.index == lt) return match; - } - } - - function toNextTag(iter) { - for (;;) { - xmlTagStart.lastIndex = iter.ch; - var found = xmlTagStart.exec(iter.text); - if (!found) { if (nextLine(iter)) continue; else return; } - if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; } - iter.ch = found.index + found[0].length; - return found; - } - } - function toPrevTag(iter) { - for (;;) { - var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1; - if (gt == -1) { if (prevLine(iter)) continue; else return; } - if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; } - var lastSlash = iter.text.lastIndexOf("/", gt); - var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); - iter.ch = gt + 1; - return selfClose ? "selfClose" : "regular"; - } - } - - function findMatchingClose(iter, tag) { - var stack = []; - for (;;) { - var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0); - if (!next || !(end = toTagEnd(iter))) return; - if (end == "selfClose") continue; - if (next[1]) { // closing tag - for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) { - stack.length = i; - break; - } - if (i < 0 && (!tag || tag == next[2])) return { - tag: next[2], - from: Pos(startLine, startCh), - to: Pos(iter.line, iter.ch) - }; - } else { // opening tag - stack.push(next[2]); - } - } - } - function findMatchingOpen(iter, tag) { - var stack = []; - for (;;) { - var prev = toPrevTag(iter); - if (!prev) return; - if (prev == "selfClose") { toTagStart(iter); continue; } - var endLine = iter.line, endCh = iter.ch; - var start = toTagStart(iter); - if (!start) return; - if (start[1]) { // closing tag - stack.push(start[2]); - } else { // opening tag - for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) { - stack.length = i; - break; - } - if (i < 0 && (!tag || tag == start[2])) return { - tag: start[2], - from: Pos(iter.line, iter.ch), - to: Pos(endLine, endCh) - }; - } - } - } - - CodeMirror.registerHelper("fold", "xml", function(cm, start) { - var iter = new Iter(cm, start.line, 0); - for (;;) { - var openTag = toNextTag(iter) - if (!openTag || iter.line != start.line) return - var end = toTagEnd(iter) - if (!end) return - if (!openTag[1] && end != "selfClose") { - var startPos = Pos(iter.line, iter.ch); - var endPos = findMatchingClose(iter, openTag[2]); - return endPos && cmp(endPos.from, startPos) > 0 ? {from: startPos, to: endPos.from} : null - } - } - }); - CodeMirror.findMatchingTag = function(cm, pos, range) { - var iter = new Iter(cm, pos.line, pos.ch, range); - if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return; - var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch); - var start = end && toTagStart(iter); - if (!end || !start || cmp(iter, pos) > 0) return; - var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]}; - if (end == "selfClose") return {open: here, close: null, at: "open"}; - - if (start[1]) { // closing tag - return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"}; - } else { // opening tag - iter = new Iter(cm, to.line, to.ch, range); - return {open: here, close: findMatchingClose(iter, start[2]), at: "open"}; - } - }; - - CodeMirror.findEnclosingTag = function(cm, pos, range, tag) { - var iter = new Iter(cm, pos.line, pos.ch, range); - for (;;) { - var open = findMatchingOpen(iter, tag); - if (!open) break; - var forward = new Iter(cm, pos.line, pos.ch, range); - var close = findMatchingClose(forward, open.tag); - if (close) return {open: open, close: close}; - } - }; - - // Used by addon/edit/closetag.js - CodeMirror.scanForClosingTag = function(cm, pos, name, end) { - var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null); - return findMatchingClose(iter, name); - }; -});