Changeset 3617:bb465743f804
- Timestamp:
- 12/11/17 15:59:17 (8 years ago)
- Branch:
- default
- Location:
- admin/js/codemirror
- Files:
-
- 37 edited
Legend:
- Unmodified
- Added
- Removed
-
admin/js/codemirror/addon/edit/closebrackets.js
r3532 r3617 24 24 } 25 25 if (val) { 26 ensureBound(getOption(val, "pairs")) 26 27 cm.state.closeBrackets = val; 27 28 cm.addKeyMap(keyMap); … … 35 36 } 36 37 37 var bind = defaults.pairs + "`";38 38 var keyMap = {Backspace: handleBackspace, Enter: handleEnter}; 39 for (var i = 0; i < bind.length; i++) 40 keyMap["'" + bind.charAt(i) + "'"] = handler(bind.charAt(i)); 39 function ensureBound(chars) { 40 for (var i = 0; i < chars.length; i++) { 41 var ch = chars.charAt(i), key = "'" + ch + "'" 42 if (!keyMap[key]) keyMap[key] = handler(ch) 43 } 44 } 45 ensureBound(defaults.pairs + "`") 41 46 42 47 function handler(ch) { … … 80 85 } 81 86 cm.operation(function() { 82 cm.replaceSelection("\n\n", null); 87 var linesep = cm.lineSeparator() || "\n"; 88 cm.replaceSelection(linesep + linesep, null); 83 89 cm.execCommand("goCharLeft"); 84 90 ranges = cm.listSelections(); … … 128 134 curType = "addFour"; 129 135 } else if (identical) { 130 if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, ch)) curType = "both"; 136 var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur) 137 if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both"; 131 138 else return CodeMirror.Pass; 132 139 } else if (opening && (cm.getLine(cur.line).length == cur.ch || … … 180 187 } 181 188 182 // Project the token type that will exists after the given char is183 // typed, and use it to determine whether it would cause the start184 // of a string token.185 function enteringString(cm, pos, ch) {186 var line = cm.getLine(pos.line);187 var token = cm.getTokenAt(pos);188 if (/\bstring2?\b/.test(token.type) || stringStartsAfter(cm, pos)) return false;189 var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4);190 stream.pos = stream.start = token.start;191 for (;;) {192 var type1 = cm.getMode().token(stream, token.state);193 if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1);194 stream.start = stream.pos;195 }196 }197 198 189 function stringStartsAfter(cm, pos) { 199 190 var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1)) 200 return /\bstring/.test(token.type) && token.start == pos.ch 191 return /\bstring/.test(token.type) && token.start == pos.ch && 192 (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos))) 201 193 } 202 194 }); -
admin/js/codemirror/addon/edit/matchbrackets.js
r3532 r3617 17 17 var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"}; 18 18 19 function findMatchingBracket(cm, where, strict,config) {19 function findMatchingBracket(cm, where, config) { 20 20 var line = cm.getLineHandle(where.line), pos = where.ch - 1; 21 var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)]; 21 var afterCursor = config && config.afterCursor 22 if (afterCursor == null) 23 afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className) 24 25 // A cursor is defined as between two characters, but in in vim command mode 26 // (i.e. not insert mode), the cursor is visually represented as a 27 // highlighted box on top of the 2nd character. Otherwise, we allow matches 28 // from before or after the cursor. 29 var match = (!afterCursor && pos >= 0 && matching[line.text.charAt(pos)]) || 30 matching[line.text.charAt(++pos)]; 22 31 if (!match) return null; 23 32 var dir = match.charAt(1) == ">" ? 1 : -1; 24 if ( strict && (dir > 0) != (pos == where.ch)) return null;33 if (config && config.strict && (dir > 0) != (pos == where.ch)) return null; 25 34 var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); 26 35 … … 70 79 var marks = [], ranges = cm.listSelections(); 71 80 for (var i = 0; i < ranges.length; i++) { 72 var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false,config);81 var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config); 73 82 if (match && cm.getLine(match.from.line).length <= maxHighlightLen) { 74 83 var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; … … 114 123 115 124 CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);}); 116 CodeMirror.defineExtension("findMatchingBracket", function(pos, strict, config){ 117 return findMatchingBracket(this, pos, strict, config); 125 CodeMirror.defineExtension("findMatchingBracket", function(pos, config, oldConfig){ 126 // Backwards-compatibility kludge 127 if (oldConfig || typeof config == "boolean") { 128 if (!oldConfig) { 129 config = config ? {strict: true} : null 130 } else { 131 oldConfig.strict = config 132 config = oldConfig 133 } 134 } 135 return findMatchingBracket(this, pos, config) 118 136 }); 119 137 CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){ -
admin/js/codemirror/lib/codemirror.css
r3542 r3617 6 6 height: 300px; 7 7 color: black; 8 direction: ltr; 8 9 } 9 10 … … 59 60 z-index: 1; 60 61 } 61 62 .cm-fat-cursor-mark { 63 background-color: rgba(20, 255, 20, 0.5); 64 -webkit-animation: blink 1.06s steps(1) infinite; 65 -moz-animation: blink 1.06s steps(1) infinite; 66 animation: blink 1.06s steps(1) infinite; 67 } 62 68 .cm-animate-fat-cursor { 63 69 width: auto; … … 120 126 .cm-s-default .cm-operator {} 121 127 .cm-s-default .cm-variable-2 {color: #05a;} 122 .cm-s-default .cm-variable-3 {color: #085;}128 .cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} 123 129 .cm-s-default .cm-comment {color: #a50;} 124 130 .cm-s-default .cm-string {color: #a11;} … … 140 146 /* Default styles for common addons */ 141 147 142 div.CodeMirror span.CodeMirror-matchingbracket {color: #0 f0;}143 div.CodeMirror span.CodeMirror-nonmatchingbracket {color: # f22;}148 div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} 149 div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} 144 150 .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } 145 151 .CodeMirror-activeline-background {background: #e8f2ff;} … … 320 326 321 327 .cm-searching { 322 background : #ffa;323 background : rgba(255, 255, 0, .4);328 background-color: #ffa; 329 background-color: rgba(255, 255, 0, .4); 324 330 } 325 331 -
admin/js/codemirror/mode/css/css.js
r3542 r3617 78 78 } else if (/[:;{}\[\]\(\)]/.test(ch)) { 79 79 return ret(null, ch); 80 } else if (( ch == "u" && stream.match(/rl(-prefix)?\(/)) ||81 ( ch == "d" && stream.match("omain(")) ||82 ( ch == "r" && stream.match("egexp("))) {80 } else if (((ch == "u" || ch == "U") && stream.match(/rl(-prefix)?\(/i)) || 81 ((ch == "d" || ch == "D") && stream.match("omain(", true, true)) || 82 ((ch == "r" || ch == "R") && stream.match("egexp(", true, true))) { 83 83 stream.backUp(1); 84 84 state.tokenize = tokenParenthesized; … … 163 163 } else if (type == "}" && state.context.prev) { 164 164 return popContext(state); 165 } else if (supportsAtComponent && /@component/ .test(type)) {165 } else if (supportsAtComponent && /@component/i.test(type)) { 166 166 return pushContext(state, stream, "atComponentBlock"); 167 } else if (/^@(-moz-)?document$/ .test(type)) {167 } else if (/^@(-moz-)?document$/i.test(type)) { 168 168 return pushContext(state, stream, "documentTypes"); 169 } else if (/^@(media|supports|(-moz-)?document|import)$/ .test(type)) {169 } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) { 170 170 return pushContext(state, stream, "atBlock"); 171 } else if (/^@(font-face|counter-style)/ .test(type)) {171 } else if (/^@(font-face|counter-style)/i.test(type)) { 172 172 state.stateArg = type; 173 173 return "restricted_atBlock_before"; 174 } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/ .test(type)) {174 } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) { 175 175 return "keyframes"; 176 176 } else if (type && type.charAt(0) == "@") { … … 384 384 } 385 385 override = style; 386 state.state = states[state.state](type, stream, state); 386 if (type != "comment") 387 state.state = states[state.state](type, stream, state); 387 388 return override; 388 389 }, … … 402 403 // Dedent relative to current context. 403 404 indent = Math.max(0, cx.indent - indentUnit); 404 cx = cx.prev;405 405 } 406 406 } … … 411 411 blockCommentStart: "/*", 412 412 blockCommentEnd: "*/", 413 blockCommentContinue: " * ", 413 414 lineComment: lineComment, 414 415 fold: "brace" … … 473 474 "border-top-width", "border-width", "bottom", "box-decoration-break", 474 475 "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", 475 "caption-side", "c lear", "clip", "color", "color-profile", "column-count",476 "caption-side", "caret-color", "clear", "clip", "color", "color-profile", "column-count", 476 477 "column-fill", "column-gap", "column-rule", "column-rule-color", 477 478 "column-rule-style", "column-rule-width", "column-span", "column-width", … … 494 495 "grid-template-rows", "hanging-punctuation", "height", "hyphens", 495 496 "icon", "image-orientation", "image-rendering", "image-resolution", 496 "inline-box-align", "justify-content", " left", "letter-spacing",497 "inline-box-align", "justify-content", "justify-items", "justify-self", "left", "letter-spacing", 497 498 "line-break", "line-height", "line-stacking", "line-stacking-ruby", 498 499 "line-stacking-shift", "line-stacking-strategy", "list-style", … … 509 510 "page", "page-break-after", "page-break-before", "page-break-inside", 510 511 "page-policy", "pause", "pause-after", "pause-before", "perspective", 511 "perspective-origin", "pitch", "pitch-range", "pla y-during", "position",512 "perspective-origin", "pitch", "pitch-range", "place-content", "place-items", "place-self", "play-during", "position", 512 513 "presentation-level", "punctuation-trim", "quotes", "region-break-after", 513 514 "region-break-before", "region-break-inside", "region-fragment", … … 660 661 "scroll", "scrollbar", "scroll-position", "se-resize", "searchfield", 661 662 "searchfield-cancel-button", "searchfield-decoration", 662 "searchfield-results-button", "searchfield-results-decoration", 663 "searchfield-results-button", "searchfield-results-decoration", "self-start", "self-end", 663 664 "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", 664 665 "simp-chinese-formal", "simp-chinese-informal", "single", … … 666 667 "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", 667 668 "small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali", 668 "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "sp ell-out", "square",669 "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "space-evenly", "spell-out", "square", 669 670 "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", 670 671 "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "system-ui", "table", … … 749 750 }, 750 751 ":": function(stream) { 751 if (stream.match(/\s*\{/ ))752 return [null, "{"];752 if (stream.match(/\s*\{/, false)) 753 return [null, null] 753 754 return false; 754 755 }, … … 793 794 "@": function(stream) { 794 795 if (stream.eat("{")) return [null, "interpolation"]; 795 if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/ , false)) return false;796 if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i, false)) return false; 796 797 stream.eatWhile(/[\w\\\-]/); 797 798 if (stream.match(/^\s*:/, false)) -
admin/js/codemirror/mode/htmlmixed/htmlmixed.js
r3532 r3617 134 134 }, 135 135 136 indent: function (state, textAfter ) {136 indent: function (state, textAfter, line) { 137 137 if (!state.localMode || /^\s*<\//.test(textAfter)) 138 138 return htmlMode.indent(state.htmlState, textAfter); 139 139 else if (state.localMode.indent) 140 return state.localMode.indent(state.localState, textAfter );140 return state.localMode.indent(state.localState, textAfter, line); 141 141 else 142 142 return CodeMirror.Pass; -
admin/js/codemirror/mode/javascript/javascript.js
r3542 r3617 12 12 "use strict"; 13 13 14 function expressionAllowed(stream, state, backUp) {15 return /^(?:operator|sof|keyword c|case|new|export|default|[\[{}\(,;:]|=>)$/.test(state.lastType) ||16 (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))17 }18 19 14 CodeMirror.defineMode("javascript", function(config, parserConfig) { 20 15 var indentUnit = config.indentUnit; … … 29 24 var keywords = function(){ 30 25 function kw(type) {return {type: type, style: "keyword"};} 31 var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c") ;26 var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"), D = kw("keyword d"); 32 27 var operator = kw("operator"), atom = {type: "atom", style: "atom"}; 33 28 34 29 var jsKeywords = { 35 30 "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, 36 "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "throw": C, "debugger": C,37 " var": kw("var"), "const": kw("var"), "let": kw("var"),31 "return": D, "break": D, "continue": D, "new": kw("new"), "delete": C, "void": C, "throw": C, 32 "debugger": kw("debugger"), "var": kw("var"), "const": kw("var"), "let": kw("var"), 38 33 "function": kw("function"), "catch": kw("catch"), 39 34 "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), … … 42 37 "this": kw("this"), "class": kw("class"), "super": kw("atom"), 43 38 "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, 44 "await": C , "async": kw("async")39 "await": C 45 40 }; 46 41 47 42 // Extend the 'normal' keywords with the TypeScript language extensions 48 43 if (isTS) { 49 var type = {type: "variable", style: " variable-3"};44 var type = {type: "variable", style: "type"}; 50 45 var tsKeywords = { 51 46 // object-like things … … 53 48 "implements": C, 54 49 "namespace": C, 55 "module": kw("module"),56 "enum": kw("module"),57 "type": kw("type"),58 50 59 51 // scope modifiers … … 62 54 "protected": kw("modifier"), 63 55 "abstract": kw("modifier"), 64 65 // operators 66 "as": operator, 56 "readonly": kw("modifier"), 67 57 68 58 // types … … 78 68 }(); 79 69 80 var isOperatorChar = /[+\-*&%=<>!?|~^ ]/;70 var isOperatorChar = /[+\-*&%=<>!?|~^@]/; 81 71 var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; 82 72 … … 137 127 return ret("regexp", "string-2"); 138 128 } else { 139 stream.eat While(isOperatorChar);129 stream.eat("="); 140 130 return ret("operator", "operator", stream.current()); 141 131 } … … 147 137 return ret("error", "error"); 148 138 } else if (isOperatorChar.test(ch)) { 149 if (ch != ">" || !state.lexical || state.lexical.type != ">") 150 stream.eatWhile(isOperatorChar); 139 if (ch != ">" || !state.lexical || state.lexical.type != ">") { 140 if (stream.eat("=")) { 141 if (ch == "!" || ch == "=") stream.eat("=") 142 } else if (/[<>*+\-]/.test(ch)) { 143 stream.eat(ch) 144 if (ch == ">") stream.eat(ch) 145 } 146 } 151 147 return ret("operator", "operator", stream.current()); 152 148 } else if (wordRE.test(ch)) { 153 149 stream.eatWhile(wordRE); 154 var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; 155 return (known && state.lastType != ".") ? ret(known.type, known.style, word) : 156 ret("variable", "variable", word); 150 var word = stream.current() 151 if (state.lastType != ".") { 152 if (keywords.propertyIsEnumerable(word)) { 153 var kw = keywords[word] 154 return ret(kw.type, kw.style, word) 155 } 156 if (word == "async" && stream.match(/^(\s|\/\*.*?\*\/)*[\(\w]/, false)) 157 return ret("async", "keyword", word) 158 } 159 return ret("variable", "variable", word) 157 160 } 158 161 } … … 353 356 if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); 354 357 if (type == "keyword b") return cont(pushlex("form"), statement, poplex); 358 if (type == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex); 359 if (type == "debugger") return cont(expect(";")); 355 360 if (type == "{") return cont(pushlex("}"), block, poplex); 356 361 if (type == ";") return cont(); … … 362 367 if (type == "function") return cont(functiondef); 363 368 if (type == "for") return cont(pushlex("form"), forspec, statement, poplex); 364 if (type == "variable") return cont(pushlex("stat"), maybelabel); 365 if (type == "switch") return cont(pushlex("form"), parenExpr, pushlex("}", "switch"), expect("{"), 369 if (type == "variable") { 370 if (isTS && value == "type") { 371 cx.marked = "keyword" 372 return cont(typeexpr, expect("operator"), typeexpr, expect(";")); 373 } else if (isTS && value == "declare") { 374 cx.marked = "keyword" 375 return cont(statement) 376 } else if (isTS && (value == "module" || value == "enum") && cx.stream.match(/^\s*\w/, false)) { 377 cx.marked = "keyword" 378 return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex) 379 } else { 380 return cont(pushlex("stat"), maybelabel); 381 } 382 } 383 if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), 366 384 block, poplex, poplex); 367 385 if (type == "case") return cont(expression, expect(":")); … … 372 390 if (type == "export") return cont(pushlex("stat"), afterExport, poplex); 373 391 if (type == "import") return cont(pushlex("stat"), afterImport, poplex); 374 if (type == "module") return cont(pushlex("form"), pattern, pushlex("}"), expect("{"), block, poplex, poplex)375 if (type == "type") return cont(typeexpr, expect("operator"), typeexpr, expect(";"));376 392 if (type == "async") return cont(statement) 393 if (value == "@") return cont(expression, statement) 377 394 return pass(pushlex("stat"), expression, expect(";"), poplex); 378 395 } … … 390 407 if (cx.state.fatArrowAt == cx.stream.start) { 391 408 var body = noComma ? arrowBodyNoComma : arrowBody; 392 if (type == "(") return cont(pushcontext, pushlex(")"), commasep( pattern, ")"), poplex, expect("=>"), body, popcontext);409 if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext); 393 410 else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); 394 411 } … … 398 415 if (type == "function") return cont(functiondef, maybeop); 399 416 if (type == "class") return cont(pushlex("form"), classExpression, poplex); 400 if (type == "keyword c" || type == "async") return cont(noComma ? maybeexpressionNoComma : maybeexpression);417 if (type == "keyword c" || type == "async") return cont(noComma ? expressionNoComma : expression); 401 418 if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); 402 419 if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); … … 411 428 return pass(expression); 412 429 } 413 function maybeexpressionNoComma(type) {414 if (type.match(/[;\}\)\],]/)) return pass();415 return pass(expressionNoComma);416 }417 430 418 431 function maybeoperatorComma(type, value) { … … 425 438 if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); 426 439 if (type == "operator") { 427 if (/\+\+|--/.test(value)) return cont(me); 440 if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); 441 if (isTS && value == "<" && cx.stream.match(/^([^>]|<.*?>)*>\s*\(/, false)) 442 return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me); 428 443 if (value == "?") return cont(expression, expect(":"), expr); 429 444 return cont(expr); … … 434 449 if (type == ".") return cont(property, me); 435 450 if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); 451 if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) } 452 if (type == "regexp") { 453 cx.state.lastType = cx.marked = "operator" 454 cx.stream.backUp(cx.stream.pos - cx.stream.start - 1) 455 return cont(expr) 456 } 436 457 } 437 458 function quasi(type, value) { … … 458 479 return function(type) { 459 480 if (type == ".") return cont(noComma ? targetNoComma : target); 481 else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma) 460 482 else return pass(noComma ? expressionNoComma : expression); 461 483 }; … … 481 503 cx.marked = "property"; 482 504 if (value == "get" || value == "set") return cont(getterSetter); 505 var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params 506 if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false))) 507 cx.state.fatArrowAt = cx.stream.pos + m[0].length 483 508 return cont(afterprop); 484 509 } else if (type == "number" || type == "string") { … … 492 517 return cont(expression, expect("]"), afterprop); 493 518 } else if (type == "spread") { 494 return cont(expression); 519 return cont(expressionNoComma, afterprop); 520 } else if (value == "*") { 521 cx.marked = "keyword"; 522 return cont(objprop); 495 523 } else if (type == ":") { 496 524 return pass(afterprop) … … 539 567 } 540 568 } 541 function typeexpr(type) { 542 if (type == "variable") {cx.marked = "variable-3"; return cont(afterType);} 569 function mayberettype(type) { 570 if (isTS && type == ":") { 571 if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr) 572 else return cont(typeexpr) 573 } 574 } 575 function isKW(_, value) { 576 if (value == "is") { 577 cx.marked = "keyword" 578 return cont() 579 } 580 } 581 function typeexpr(type, value) { 582 if (type == "variable" || value == "void") { 583 if (value == "keyof") { 584 cx.marked = "keyword" 585 return cont(typeexpr) 586 } else { 587 cx.marked = "type" 588 return cont(afterType) 589 } 590 } 543 591 if (type == "string" || type == "number" || type == "atom") return cont(afterType); 544 if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex) 592 if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType) 593 if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType) 545 594 if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType) 546 595 } … … 556 605 } else if (type == ":") { 557 606 return cont(typeexpr) 607 } else if (type == "[") { 608 return cont(expression, maybetype, expect("]"), typeprop) 558 609 } 559 610 } … … 566 617 if (value == "|" || type == ".") return cont(typeexpr) 567 618 if (type == "[") return cont(expect("]"), afterType) 619 if (value == "extends") return cont(typeexpr) 620 } 621 function maybeTypeArgs(_, value) { 622 if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) 623 } 624 function typeparam() { 625 return pass(typeexpr, maybeTypeDefault) 626 } 627 function maybeTypeDefault(_, value) { 628 if (value == "=") return cont(typeexpr) 568 629 } 569 630 function vardef() { … … 620 681 if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} 621 682 if (type == "variable") {register(value); return cont(functiondef);} 622 if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, maybetype, statement, popcontext); 623 } 624 function funarg(type) { 625 if (type == "spread") return cont(funarg); 683 if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext); 684 if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef) 685 } 686 function funarg(type, value) { 687 if (value == "@") cont(expression, funarg) 688 if (type == "spread" || type == "modifier") return cont(funarg); 626 689 return pass(pattern, maybetype, maybeAssign); 627 690 } … … 635 698 } 636 699 function classNameAfter(type, value) { 637 if (value == "<") return cont(pushlex(">"), commasep(type expr, ">"), poplex, classNameAfter)700 if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter) 638 701 if (value == "extends" || value == "implements" || (isTS && type == ",")) 639 702 return cont(isTS ? typeexpr : expression, classNameAfter); … … 641 704 } 642 705 function classBody(type, value) { 706 if (type == "modifier" || type == "async" || 707 (type == "variable" && 708 (value == "static" || value == "get" || value == "set") && 709 cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false))) { 710 cx.marked = "keyword"; 711 return cont(classBody); 712 } 643 713 if (type == "variable" || cx.style == "keyword") { 644 if ((value == "async" || value == "static" || value == "get" || value == "set" ||645 (isTS && (value == "public" || value == "private" || value == "protected" || value == "readonly" || value == "abstract"))) &&646 cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false)) {647 cx.marked = "keyword";648 return cont(classBody);649 }650 714 cx.marked = "property"; 651 715 return cont(isTS ? classfield : functiondef, classBody); … … 659 723 if (type == ";") return cont(classBody); 660 724 if (type == "}") return cont(); 725 if (value == "@") return cont(expression, classBody) 661 726 } 662 727 function classfield(type, value) { … … 704 769 isOperatorChar.test(textAfter.charAt(0)) || 705 770 /[,.]/.test(textAfter.charAt(0)); 771 } 772 773 function expressionAllowed(stream, state, backUp) { 774 return state.tokenize == tokenBase && 775 /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) || 776 (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) 706 777 } 707 778 … … 771 842 blockCommentStart: jsonMode ? null : "/*", 772 843 blockCommentEnd: jsonMode ? null : "*/", 844 blockCommentContinue: jsonMode ? null : " * ", 773 845 lineComment: jsonMode ? null : "//", 774 846 fold: "brace", … … 780 852 781 853 expressionAllowed: expressionAllowed, 854 782 855 skipExpression: function(state) { 783 856 var top = state.cc[state.cc.length - 1] -
admin/js/codemirror/mode/php/php.js
r3251 r3617 152 152 153 153 CodeMirror.defineMode("php", function(config, parserConfig) { 154 var htmlMode = CodeMirror.getMode(config, "text/html");154 var htmlMode = CodeMirror.getMode(config, (parserConfig && parserConfig.htmlMode) || "text/html"); 155 155 var phpMode = CodeMirror.getMode(config, phpConfig); 156 156 -
admin/js/codemirror/mode/xml/xml.js
r3251 r3617 53 53 allowUnquoted: false, 54 54 allowMissing: false, 55 allowMissingTagName: false, 55 56 caseFold: false 56 57 } … … 227 228 setStyle = "tag"; 228 229 return attrState; 230 } else if (config.allowMissingTagName && type == "endTag") { 231 setStyle = "tag bracket"; 232 return attrState(type, stream, state); 229 233 } else { 230 234 setStyle = "error"; … … 245 249 return closeStateErr; 246 250 } 251 } else if (config.allowMissingTagName && type == "endTag") { 252 setStyle = "tag bracket"; 253 return closeState(type, stream, state); 247 254 } else { 248 255 setStyle = "error"; -
admin/js/codemirror/theme/abcdef.css
r3251 r3617 15 15 .cm-s-abcdef span.cm-variable { color: #abcdef; } 16 16 .cm-s-abcdef span.cm-variable-2 { color: #cacbcc; } 17 .cm-s-abcdef span.cm-variable-3 { color: #def; }17 .cm-s-abcdef span.cm-variable-3, .cm-s-abcdef span.cm-type { color: #def; } 18 18 .cm-s-abcdef span.cm-property { color: #fedcba; } 19 19 .cm-s-abcdef span.cm-operator { color: #ff0; } -
admin/js/codemirror/theme/ambiance.css
r3251 r3617 12 12 .cm-s-ambiance .cm-variable { color: #ffb795; } 13 13 .cm-s-ambiance .cm-variable-2 { color: #eed1b3; } 14 .cm-s-ambiance .cm-variable-3 { color: #faded3; }14 .cm-s-ambiance .cm-variable-3, .cm-s-ambiance .cm-type { color: #faded3; } 15 15 .cm-s-ambiance .cm-property { color: #eed1b3; } 16 16 .cm-s-ambiance .cm-operator { color: #fa8d6a; } -
admin/js/codemirror/theme/cobalt.css
r3251 r3617 16 16 .cm-s-cobalt span.cm-meta { color: #ff9d00; } 17 17 .cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; } 18 .cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def { color: white; }18 .cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def, .cm-s-cobalt .cm-type { color: white; } 19 19 .cm-s-cobalt span.cm-bracket { color: #d8d8d8; } 20 20 .cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; } -
admin/js/codemirror/theme/colorforth.css
r3251 r3617 16 16 17 17 .cm-s-colorforth span.cm-variable-2 { color: #EEE; } 18 .cm-s-colorforth span.cm-variable-3 18 .cm-s-colorforth span.cm-variable-3, .cm-s-colorforth span.cm-type { color: #DDD; } 19 19 .cm-s-colorforth span.cm-property {} 20 20 .cm-s-colorforth span.cm-operator {} -
admin/js/codemirror/theme/dracula.css
r3532 r3617 35 35 .cm-s-dracula span.cm-property { color: #66d9ef; } 36 36 .cm-s-dracula span.cm-builtin { color: #50fa7b; } 37 .cm-s-dracula span.cm-variable-3 { color: #ffb86c; }37 .cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; } 38 38 39 39 .cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); } -
admin/js/codemirror/theme/duotone-dark.css
r3532 r3617 25 25 .cm-s-duotone-dark span.cm-positive { color: #6a51e6; } 26 26 27 .cm-s-duotone-dark span.cm-variable-2, .cm-s-duotone-dark span.cm-variable-3, .cm-s-duotone-dark span.cm- string-2, .cm-s-duotone-dark span.cm-url { color: #7a63ee; }27 .cm-s-duotone-dark span.cm-variable-2, .cm-s-duotone-dark span.cm-variable-3, .cm-s-duotone-dark span.cm-type, .cm-s-duotone-dark span.cm-string-2, .cm-s-duotone-dark span.cm-url { color: #7a63ee; } 28 28 .cm-s-duotone-dark span.cm-def, .cm-s-duotone-dark span.cm-tag, .cm-s-duotone-dark span.cm-builtin, .cm-s-duotone-dark span.cm-qualifier, .cm-s-duotone-dark span.cm-header, .cm-s-duotone-dark span.cm-em { color: #eeebff; } 29 29 .cm-s-duotone-dark span.cm-bracket, .cm-s-duotone-dark span.cm-comment { color: #6c6783; } -
admin/js/codemirror/theme/duotone-light.css
r3532 r3617 24 24 .cm-s-duotone-light span.cm-positive { color: #896724; } 25 25 26 .cm-s-duotone-light span.cm-variable-2, .cm-s-duotone-light span.cm-variable-3, .cm-s-duotone-light span.cm- string-2, .cm-s-duotone-light span.cm-url { color: #896724; }26 .cm-s-duotone-light span.cm-variable-2, .cm-s-duotone-light span.cm-variable-3, .cm-s-duotone-light span.cm-type, .cm-s-duotone-light span.cm-string-2, .cm-s-duotone-light span.cm-url { color: #896724; } 27 27 .cm-s-duotone-light span.cm-def, .cm-s-duotone-light span.cm-tag, .cm-s-duotone-light span.cm-builtin, .cm-s-duotone-light span.cm-qualifier, .cm-s-duotone-light span.cm-header, .cm-s-duotone-light span.cm-em { color: #2d2006; } 28 28 .cm-s-duotone-light span.cm-bracket, .cm-s-duotone-light span.cm-comment { color: #b6ad9a; } -
admin/js/codemirror/theme/eclipse.css
r3251 r3617 6 6 .cm-s-eclipse span.cm-variable { color: black; } 7 7 .cm-s-eclipse span.cm-variable-2 { color: #0000C0; } 8 .cm-s-eclipse span.cm-variable-3 { color: #0000C0; }8 .cm-s-eclipse span.cm-variable-3, .cm-s-eclipse span.cm-type { color: #0000C0; } 9 9 .cm-s-eclipse span.cm-property { color: black; } 10 10 .cm-s-eclipse span.cm-operator { color: black; } -
admin/js/codemirror/theme/erlang-dark.css
r3251 r3617 28 28 .cm-s-erlang-dark span.cm-variable { color: #50fe50; } 29 29 .cm-s-erlang-dark span.cm-variable-2 { color: #e0e; } 30 .cm-s-erlang-dark span.cm-variable-3 { color: #ccc; }30 .cm-s-erlang-dark span.cm-variable-3, .cm-s-erlang-dark span.cm-type { color: #ccc; } 31 31 .cm-s-erlang-dark span.cm-error { color: #9d1e15; } 32 32 -
admin/js/codemirror/theme/icecoder.css
r3251 r3617 12 12 .cm-s-icecoder span.cm-variable { color: #6cb5d9; } /* blue */ 13 13 .cm-s-icecoder span.cm-variable-2 { color: #cc1e5c; } /* pink */ 14 .cm-s-icecoder span.cm-variable-3 { color: #f9602c; }/* orange */14 .cm-s-icecoder span.cm-variable-3, .cm-s-icecoder span.cm-type { color: #f9602c; } /* orange */ 15 15 16 16 .cm-s-icecoder span.cm-property { color: #eee; } /* off-white 1 */ -
admin/js/codemirror/theme/lesser-dark.css
r3251 r3617 28 28 .cm-s-lesser-dark span.cm-variable { color:#D9BF8C; } 29 29 .cm-s-lesser-dark span.cm-variable-2 { color: #669199; } 30 .cm-s-lesser-dark span.cm-variable-3 { color: white; }30 .cm-s-lesser-dark span.cm-variable-3, .cm-s-lesser-dark span.cm-type { color: white; } 31 31 .cm-s-lesser-dark span.cm-property { color: #92A75C; } 32 32 .cm-s-lesser-dark span.cm-operator { color: #92A75C; } -
admin/js/codemirror/theme/liquibyte.css
r3251 r3617 37 37 38 38 .cm-s-liquibyte span.cm-variable-2 { color: #007f7f; font-weight: bold; } 39 .cm-s-liquibyte span.cm-variable-3 39 .cm-s-liquibyte span.cm-variable-3, .cm-s-liquibyte span.cm-type { color: #c080ff; font-weight: bold; } 40 40 .cm-s-liquibyte span.cm-property { color: #999; font-weight: bold; } 41 41 .cm-s-liquibyte span.cm-operator { color: #fff; } … … 60 60 /* Scrollbars */ 61 61 /* Simple */ 62 .cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div:hover, div.CodeMirror-simplescroll-vertical div:hover {62 .cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div:hover, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div:hover { 63 63 background-color: rgba(80, 80, 80, .7); 64 64 } 65 .cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div, div.CodeMirror-simplescroll-vertical div {65 .cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div { 66 66 background-color: rgba(80, 80, 80, .3); 67 67 border: 1px solid #404040; -
admin/js/codemirror/theme/material.css
r3532 r3617 28 28 .cm-s-material .cm-operator { color: rgba(233, 237, 237, 1); } 29 29 .cm-s-material .cm-variable-2 { color: #80CBC4; } 30 .cm-s-material .cm-variable-3 { color: #82B1FF; }30 .cm-s-material .cm-variable-3, .cm-s-material .cm-type { color: #82B1FF; } 31 31 .cm-s-material .cm-builtin { color: #DECB6B; } 32 32 .cm-s-material .cm-atom { color: #F77669; } … … 42 42 .cm-s-material .cm-property { color: #80CBAE; } 43 43 .cm-s-material .cm-qualifier { color: #DECB6B; } 44 .cm-s-material .cm-variable-3 { color: #DECB6B; }44 .cm-s-material .cm-variable-3, .cm-s-material .cm-type { color: #DECB6B; } 45 45 .cm-s-material .cm-tag { color: rgba(255, 83, 112, 1); } 46 46 .cm-s-material .cm-error { -
admin/js/codemirror/theme/mdn-like.css
r3251 r3617 22 22 .cm-s-mdn-like .cm-def { color: #8DA6CE; } 23 23 .cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; } 24 .cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def { color: #07a; }24 .cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def, .cm-s-mdn-like span.cm-type { color: #07a; } 25 25 26 26 .cm-s-mdn-like .cm-variable { color: #07a; } -
admin/js/codemirror/theme/midnight.css
r3251 r3617 12 12 color: #D1EDFF; 13 13 } 14 15 .cm-s-midnight.CodeMirror { border-top: 1px solid black; border-bottom: 1px solid black; }16 14 17 15 .cm-s-midnight div.CodeMirror-selected { background: #314D67; } -
admin/js/codemirror/theme/monokai.css
r3251 r3617 22 22 .cm-s-monokai span.cm-variable { color: #f8f8f2; } 23 23 .cm-s-monokai span.cm-variable-2 { color: #9effff; } 24 .cm-s-monokai span.cm-variable-3 { color: #66d9ef; }24 .cm-s-monokai span.cm-variable-3, .cm-s-monokai span.cm-type { color: #66d9ef; } 25 25 .cm-s-monokai span.cm-def { color: #fd971f; } 26 26 .cm-s-monokai span.cm-bracket { color: #f8f8f2; } -
admin/js/codemirror/theme/night.css
r3251 r3617 18 18 .cm-s-night span.cm-meta { color: #7678e2; } 19 19 .cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } 20 .cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { color: white; }20 .cm-s-night span.cm-variable-3, .cm-s-night span.cm-def, .cm-s-night span.cm-type { color: white; } 21 21 .cm-s-night span.cm-bracket { color: #8da6ce; } 22 22 .cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } -
admin/js/codemirror/theme/panda-syntax.css
r3532 r3617 53 53 color: #ff9ac1; 54 54 } 55 .cm-s-panda-syntax .cm-variable-3 {55 .cm-s-panda-syntax .cm-variable-3, .cm-s-panda-syntax .cm-type { 56 56 color: #ff9ac1; 57 57 } -
admin/js/codemirror/theme/pastel-on-dark.css
r3532 r3617 35 35 .cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; } 36 36 .cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; } 37 .cm-s-pastel-on-dark span.cm-variable-3 { color: #DE8E30; }37 .cm-s-pastel-on-dark span.cm-variable-3, .cm-s-pastel-on-dark span.cm-type { color: #DE8E30; } 38 38 .cm-s-pastel-on-dark span.cm-def { color: #757aD8; } 39 39 .cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; } -
admin/js/codemirror/theme/rubyblue.css
r3251 r3617 16 16 .cm-s-rubyblue span.cm-meta { color: #F0F; } 17 17 .cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; } 18 .cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def { color: white; }18 .cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def, .cm-s-rubyblue span.cm-type { color: white; } 19 19 .cm-s-rubyblue span.cm-bracket { color: #F0F; } 20 20 .cm-s-rubyblue span.cm-link { color: #F4C20B; } -
admin/js/codemirror/theme/seti.css
r3251 r3617 39 39 .cm-s-seti span.cm-qualifier { color: #9fca56; } 40 40 .cm-s-seti span.cm-property { color: #a074c4; } 41 .cm-s-seti span.cm-variable-3 { color: #9fca56; }41 .cm-s-seti span.cm-variable-3, .cm-s-seti span.cm-type { color: #9fca56; } 42 42 .cm-s-seti span.cm-builtin { color: #9fca56; } 43 43 .cm-s-seti .CodeMirror-activeline-background { background: #101213; } -
admin/js/codemirror/theme/solarized.css
r3532 r3617 58 58 .cm-s-solarized .cm-variable { color: #839496; } 59 59 .cm-s-solarized .cm-variable-2 { color: #b58900; } 60 .cm-s-solarized .cm-variable-3 { color: #6c71c4; }60 .cm-s-solarized .cm-variable-3, .cm-s-solarized .cm-type { color: #6c71c4; } 61 61 62 62 .cm-s-solarized .cm-property { color: #2aa198; } … … 88 88 text-decoration-style: dotted; 89 89 } 90 .cm-s-solarized .cm-strong { color: #eee; }91 90 .cm-s-solarized .cm-error, 92 91 .cm-s-solarized .cm-invalidchar { -
admin/js/codemirror/theme/the-matrix.css
r3251 r3617 15 15 .cm-s-the-matrix span.cm-variable { color: #F6C; } 16 16 .cm-s-the-matrix span.cm-variable-2 { color: #C6F; } 17 .cm-s-the-matrix span.cm-variable-3 { color: #96F; }17 .cm-s-the-matrix span.cm-variable-3, .cm-s-the-matrix span.cm-type { color: #96F; } 18 18 .cm-s-the-matrix span.cm-property { color: #62FFA0; } 19 19 .cm-s-the-matrix span.cm-operator { color: #999; } -
admin/js/codemirror/theme/ttcn.css
r3251 r3617 30 30 .cm-s-ttcn .cm-variable { color: #8B2252; } 31 31 .cm-s-ttcn .cm-variable-2 { color: #05a; } 32 .cm-s-ttcn .cm-variable-3 { color: #085; }32 .cm-s-ttcn .cm-variable-3, .cm-s-ttcn .cm-type { color: #085; } 33 33 34 34 .cm-s-ttcn .cm-invalidchar { color: #f00; } -
admin/js/codemirror/theme/twilight.css
r3251 r3617 15 15 .cm-s-twilight .cm-def { color: #8DA6CE; } 16 16 .cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/ 17 .cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def { color: #607392; } /**/17 .cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def, .cm-s-twilight span.cm-type { color: #607392; } /**/ 18 18 .cm-s-twilight .cm-operator { color: #cda869; } /**/ 19 19 .cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/ -
admin/js/codemirror/theme/vibrant-ink.css
r3251 r3617 17 17 .cm-s-vibrant-ink .cm-def { color: #8DA6CE; } 18 18 .cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D; } 19 .cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def { color: #FFC66D; }19 .cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def, .cm-s-vibrant span.cm-type { color: #FFC66D; } 20 20 .cm-s-vibrant-ink .cm-operator { color: #888; } 21 21 .cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; } -
admin/js/codemirror/theme/xq-dark.css
r3251 r3617 37 37 .cm-s-xq-dark span.cm-variable { color: #FFF; } 38 38 .cm-s-xq-dark span.cm-variable-2 { color: #EEE; } 39 .cm-s-xq-dark span.cm-variable-3 { color: #DDD; }39 .cm-s-xq-dark span.cm-variable-3, .cm-s-xq-dark span.cm-type { color: #DDD; } 40 40 .cm-s-xq-dark span.cm-property {} 41 41 .cm-s-xq-dark span.cm-operator {} -
admin/js/codemirror/theme/xq-light.css
r3251 r3617 27 27 .cm-s-xq-light span.cm-variable { color: black; } 28 28 .cm-s-xq-light span.cm-variable-2 { color:black; } 29 .cm-s-xq-light span.cm-variable-3 { color: black; }29 .cm-s-xq-light span.cm-variable-3, .cm-s-xq-light span.cm-type { color: black; } 30 30 .cm-s-xq-light span.cm-property {} 31 31 .cm-s-xq-light span.cm-operator {} -
admin/js/codemirror/theme/yeti.css
r3251 r3617 40 40 .cm-s-yeti span.cm-property { color: #a074c4; } 41 41 .cm-s-yeti span.cm-builtin { color: #a074c4; } 42 .cm-s-yeti span.cm-variable-3 { color: #96c0d8; }42 .cm-s-yeti span.cm-variable-3, .cm-s-yeti span.cm-type { color: #96c0d8; } 43 43 .cm-s-yeti .CodeMirror-activeline-background { background: #E7E4E0; } 44 44 .cm-s-yeti .CodeMirror-matchingbracket { text-decoration: underline; }
Note: See TracChangeset
for help on using the changeset viewer.