diff options
author | Hugues Hiegel <root@paranoid> | 2015-03-11 16:55:04 +0100 |
---|---|---|
committer | Hugues Hiegel <root@paranoid> | 2015-03-11 16:55:04 +0100 |
commit | 99f904adcc37d93c90defcd8ce898598e25be212 (patch) | |
tree | 60a6c7b7b9cf012d6c0e8dcf5c7f4fe0a5b6fc49 /codemirror_ui/lib/CodeMirror-2.3/mode/less | |
parent | b2034fdfec040a67988e543a911208ef2491ce7a (diff) |
Diffstat (limited to 'codemirror_ui/lib/CodeMirror-2.3/mode/less')
-rw-r--r-- | codemirror_ui/lib/CodeMirror-2.3/mode/less/index.html | 618 | ||||
-rw-r--r-- | codemirror_ui/lib/CodeMirror-2.3/mode/less/less.js | 232 |
2 files changed, 850 insertions, 0 deletions
diff --git a/codemirror_ui/lib/CodeMirror-2.3/mode/less/index.html b/codemirror_ui/lib/CodeMirror-2.3/mode/less/index.html new file mode 100644 index 0000000..cad8e4b --- /dev/null +++ b/codemirror_ui/lib/CodeMirror-2.3/mode/less/index.html @@ -0,0 +1,618 @@ +<!doctype html> +<html> + <head> + <title>CodeMirror: LESS mode</title> + <link rel="stylesheet" href="../../lib/codemirror.css"> + <script src="../../lib/codemirror.js"></script> + <script src="less.js"></script> + <style>.CodeMirror {background: #f8f8f8; border: 1px solid #ddd; font-size:12px} .CodeMirror-scroll {height: 400px}</style> + <link rel="stylesheet" href="../../doc/docs.css"> + <link rel="stylesheet" href="../../theme/lesser-dark.css"> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + </head> + <body> + <h1>CodeMirror: LESS mode</h1> + <form><textarea id="code" name="code">/* Some LESS code */ + +button { + width: 32px; + height: 32px; + border: 0; + margin: 4px; + cursor: pointer; +} +button.icon-plus { background: url(http://dahlström.net/tmp/sharp-icons/svg-icon-target.svg#plus) no-repeat; } +button.icon-chart { background: url(http://dahlström.net/tmp/sharp-icons/svg-icon-target.svg#chart) no-repeat; } + +button:hover { background-color: #999; } +button:active { background-color: #666; } + +@test_a: #eeeQQQ;//this is not a valid hex value and thus parsed as an element id +@test_b: #eeeFFF //this is a valid hex value but the declaration doesn't end with a semicolon and thus parsed as an element id + +#eee aaa .box +{ + #test bbb { + width: 500px; + height: 250px; + background-image: url(dir/output/sheep.png), url( betweengrassandsky.png ); + background-position: center bottom, left top; + background-repeat: no-repeat; + } +} + +@base: #f938ab; + +.box-shadow(@style, @c) when (iscolor(@c)) { + box-shadow: @style @c; + -webkit-box-shadow: @style @c; + -moz-box-shadow: @style @c; +} +.box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) { + .box-shadow(@style, rgba(0, 0, 0, @alpha)); +} + +@color: #4D926F; + +#header { + color: @color; + color: #000000; +} +h2 { + color: @color; +} + +.rounded-corners (@radius: 5px) { + border-radius: @radius; + -webkit-border-radius: @radius; + -moz-border-radius: @radius; +} + +#header { + .rounded-corners; +} +#footer { + .rounded-corners(10px); +} + +.box-shadow (@x: 0, @y: 0, @blur: 1px, @alpha) { + @val: @x @y @blur rgba(0, 0, 0, @alpha); + + box-shadow: @val; + -webkit-box-shadow: @val; + -moz-box-shadow: @val; +} +.box { @base: #f938ab; + color: saturate(@base, 5%); + border-color: lighten(@base, 30%); + div { .box-shadow(0, 0, 5px, 0.4) } +} + +@import url("something.css"); + +@light-blue: hsl(190, 50%, 65%); +@light-yellow: desaturate(#fefec8, 10%); +@dark-yellow: desaturate(darken(@light-yellow, 10%), 40%); +@darkest: hsl(20, 0%, 15%); +@dark: hsl(190, 20%, 30%); +@medium: hsl(10, 60%, 30%); +@light: hsl(90, 40%, 20%); +@lightest: hsl(90, 20%, 90%); +@highlight: hsl(80, 50%, 90%); +@blue: hsl(210, 60%, 20%); +@alpha-blue: hsla(210, 60%, 40%, 0.5); + +.box-shadow (@x, @y, @blur, @alpha) { + @value: @x @y @blur rgba(0, 0, 0, @alpha); + box-shadow: @value; + -moz-box-shadow: @value; + -webkit-box-shadow: @value; +} +.border-radius (@radius) { + border-radius: @radius; + -moz-border-radius: @radius; + -webkit-border-radius: @radius; +} + +.border-radius (@radius, bottom) { + border-top-right-radius: 0; + border-top-left-radius: 0; + -moz-border-top-right-radius: 0; + -moz-border-top-left-radius: 0; + -webkit-border-top-left-radius: 0; + -webkit-border-top-right-radius: 0; +} +.border-radius (@radius, right) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + -moz-border-bottom-left-radius: 0; + -moz-border-top-left-radius: 0; + -webkit-border-bottom-left-radius: 0; + -webkit-border-top-left-radius: 0; +} +.box-shadow-inset (@x, @y, @blur, @color) { + box-shadow: @x @y @blur @color inset; + -moz-box-shadow: @x @y @blur @color inset; + -webkit-box-shadow: @x @y @blur @color inset; +} +.code () { + font-family: 'Bitstream Vera Sans Mono', + 'DejaVu Sans Mono', + 'Monaco', + Courier, + monospace !important; +} +.wrap () { + text-wrap: wrap; + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +html { margin: 0 } +body { + background-color: @darkest; + margin: 0 auto; + font-family: Arial, sans-serif; + font-size: 100%; + overflow-x: hidden; +} +nav, header, footer, section, article { + display: block; +} +a { + color: #b83000; +} +h1 a { + color: black; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +h1, h2, h3, h4 { + margin: 0; + font-weight: normal; +} +ul, li { + list-style-type: none; +} +code { .code; } +code { + .string, .regexp { color: @dark } + .keyword { font-weight: bold } + .comment { color: rgba(0, 0, 0, 0.5) } + .number { color: @blue } + .class, .special { color: rgba(0, 50, 100, 0.8) } +} +pre { + padding: 0 30px; + .wrap; +} +blockquote { + font-style: italic; +} +body > footer { + text-align: left; + margin-left: 10px; + font-style: italic; + font-size: 18px; + color: #888; +} + +#logo { + margin-top: 30px; + margin-bottom: 30px; + display: block; + width: 199px; + height: 81px; + background: url(/images/logo.png) no-repeat; +} +nav { + margin-left: 15px; +} +nav a, #dropdown li { + display: inline-block; + color: white; + line-height: 42px; + margin: 0; + padding: 0px 15px; + text-shadow: -1px -1px 1px rgba(0, 0, 0, 0.5); + text-decoration: none; + border: 2px solid transparent; + border-width: 0 2px; + &:hover { + .dark-red; + text-decoration: none; + } +} +.dark-red { + @red: @medium; + border: 2px solid darken(@red, 25%); + border-left-color: darken(@red, 15%); + border-right-color: darken(@red, 15%); + border-bottom: 0; + border-top: 0; + background-color: darken(@red, 10%); +} + +.content { + margin: 0 auto; + width: 980px; +} + +#menu { + position: absolute; + width: 100%; + z-index: 3; + clear: both; + display: block; + background-color: @blue; + height: 42px; + border-top: 2px solid lighten(@alpha-blue, 20%); + border-bottom: 2px solid darken(@alpha-blue, 25%); + .box-shadow(0, 1px, 8px, 0.6); + -moz-box-shadow: 0 0 0 #000; // Because firefox sucks. + + &.docked { + background-color: hsla(210, 60%, 40%, 0.4); + } + &:hover { + background-color: @blue; + } + + #dropdown { + margin: 0 0 0 117px; + padding: 0; + padding-top: 5px; + display: none; + width: 190px; + border-top: 2px solid @medium; + color: @highlight; + border: 2px solid darken(@medium, 25%); + border-left-color: darken(@medium, 15%); + border-right-color: darken(@medium, 15%); + border-top-width: 0; + background-color: darken(@medium, 10%); + ul { + padding: 0px; + } + li { + font-size: 14px; + display: block; + text-align: left; + padding: 0; + border: 0; + a { + display: block; + padding: 0px 15px; + text-decoration: none; + color: white; + &:hover { + background-color: darken(@medium, 15%); + text-decoration: none; + } + } + } + .border-radius(5px, bottom); + .box-shadow(0, 6px, 8px, 0.5); + } +} + +#main { + margin: 0 auto; + width: 100%; + background-color: @light-blue; + border-top: 8px solid darken(@light-blue, 5%); + + #intro { + background-color: lighten(@light-blue, 25%); + float: left; + margin-top: -8px; + margin-right: 5px; + + height: 380px; + position: relative; + z-index: 2; + font-family: 'Droid Serif', 'Georgia'; + width: 395px; + padding: 45px 20px 23px 30px; + border: 2px dashed darken(@light-blue, 10%); + .box-shadow(1px, 0px, 6px, 0.5); + border-bottom: 0; + border-top: 0; + #download { color: transparent; border: 0; float: left; display: inline-block; margin: 15px 0 15px -5px; } + #download img { display: inline-block} + #download-info { + code { + font-size: 13px; + } + color: @blue + #333; display: inline; float: left; margin: 36px 0 0 15px } + } + h2 { + span { + color: @medium; + } + color: @blue; + margin: 20px 0; + font-size: 24px; + line-height: 1.2em; + } + h3 { + color: @blue; + line-height: 1.4em; + margin: 30px 0 15px 0; + font-size: 1em; + text-shadow: 0px 0px 0px @lightest; + span { color: @medium } + } + #example { + p { + font-size: 18px; + color: @blue; + font-weight: bold; + text-shadow: 0px 1px 1px @lightest; + } + pre { + margin: 0; + text-shadow: 0 -1px 1px @darkest; + margin-top: 20px; + background-color: desaturate(@darkest, 8%); + border: 0; + width: 450px; + color: lighten(@lightest, 2%); + background-repeat: repeat; + padding: 15px; + border: 1px dashed @lightest; + line-height: 15px; + .box-shadow(0, 0px, 15px, 0.5); + .code; + .border-radius(2px); + code .attribute { color: hsl(40, 50%, 70%) } + code .variable { color: hsl(120, 10%, 50%) } + code .element { color: hsl(170, 20%, 50%) } + + code .string, .regexp { color: hsl(75, 50%, 65%) } + code .class { color: hsl(40, 40%, 60%); font-weight: normal } + code .id { color: hsl(50, 40%, 60%); font-weight: normal } + code .comment { color: rgba(255, 255, 255, 0.2) } + code .number, .color { color: hsl(10, 40%, 50%) } + code .class, code .mixin, .special { color: hsl(190, 20%, 50%) } + #time { color: #aaa } + } + float: right; + font-size: 12px; + margin: 0; + margin-top: 15px; + padding: 0; + width: 500px; + } +} + + +.page { + .content { + width: 870px; + padding: 45px; + } + margin: 0 auto; + font-family: 'Georgia', serif; + font-size: 18px; + line-height: 26px; + padding: 0 60px; + code { + font-size: 16px; + } + pre { + border-width: 1px; + border-style: dashed; + padding: 15px; + margin: 15px 0; + } + h1 { + text-align: left; + font-size: 40px; + margin-top: 15px; + margin-bottom: 35px; + } + p + h1 { margin-top: 60px } + h2, h3 { + margin: 30px 0 15px 0; + } + p + h2, pre + h2, code + h2 { + border-top: 6px solid rgba(255, 255, 255, 0.1); + padding-top: 30px; + } + h3 { + margin: 15px 0; + } +} + + +#docs { + @bg: lighten(@light-blue, 5%); + border-top: 2px solid lighten(@bg, 5%); + color: @blue; + background-color: @light-blue; + .box-shadow(0, -2px, 5px, 0.2); + + h1 { + font-family: 'Droid Serif', 'Georgia', serif; + padding-top: 30px; + padding-left: 45px; + font-size: 44px; + text-align: left; + margin: 30px 0 !important; + text-shadow: 0px 1px 1px @lightest; + font-weight: bold; + } + .content { + clear: both; + border-color: transparent; + background-color: lighten(@light-blue, 25%); + .box-shadow(0, 5px, 5px, 0.4); + } + pre { + @background: lighten(@bg, 30%); + color: lighten(@blue, 10%); + background-color: @background; + border-color: lighten(@light-blue, 25%); + border-width: 2px; + code .attribute { color: hsl(40, 50%, 30%) } + code .variable { color: hsl(120, 10%, 30%) } + code .element { color: hsl(170, 20%, 30%) } + + code .string, .regexp { color: hsl(75, 50%, 35%) } + code .class { color: hsl(40, 40%, 30%); font-weight: normal } + code .id { color: hsl(50, 40%, 30%); font-weight: normal } + code .comment { color: rgba(0, 0, 0, 0.4) } + code .number, .color { color: hsl(10, 40%, 30%) } + code .class, code .mixin, .special { color: hsl(190, 20%, 30%) } + } + pre code { font-size: 15px } + p + h2, pre + h2, code + h2 { border-top-color: rgba(0, 0, 0, 0.1) } +} + +td { + padding-right: 30px; +} +#synopsis { + .box-shadow(0, 5px, 5px, 0.2); +} +#synopsis, #about { + h2 { + font-size: 30px; + padding: 10px 0; + } + h1 + h2 { + margin-top: 15px; + } + h3 { font-size: 22px } + + .code-example { + border-spacing: 0; + border-width: 1px; + border-style: dashed; + padding: 0; + pre { border: 0; margin: 0 } + td { + border: 0; + margin: 0; + background-color: desaturate(darken(@darkest, 5%), 20%); + vertical-align: top; + padding: 0; + } + tr { padding: 0 } + } + .css-output { + td { + border-left: 0; + } + } + .less-example { + //border-right: 1px dotted rgba(255, 255, 255, 0.5) !important; + } + .css-output, .less-example { + width: 390px; + } + pre { + padding: 20px; + line-height: 20px; + font-size: 14px; + } +} +#about, #synopsis, #guide { + a { + text-decoration: none; + color: @light-yellow; + border-bottom: 1px dashed rgba(255, 255, 255, 0.2); + &:hover { + text-decoration: none; + border-bottom: 1px dashed @light-yellow; + } + } + @bg: desaturate(darken(@darkest, 5%), 20%); + text-shadow: 0 -1px 1px lighten(@bg, 5%); + color: @highlight; + background-color: @bg; + .content { + background-color: desaturate(@darkest, 20%); + clear: both; + .box-shadow(0, 5px, 5px, 0.4); + } + h1, h2, h3 { + color: @dark-yellow; + } + pre { + code .attribute { color: hsl(40, 50%, 70%) } + code .variable { color: hsl(120, 10%, 50%) } + code .element { color: hsl(170, 20%, 50%) } + + code .string, .regexp { color: hsl(75, 50%, 65%) } + code .class { color: hsl(40, 40%, 60%); font-weight: normal } + code .id { color: hsl(50, 40%, 60%); font-weight: normal } + code .comment { color: rgba(255, 255, 255, 0.2) } + code .number, .color { color: hsl(10, 40%, 50%) } + code .class, code .mixin, .special { color: hsl(190, 20%, 50%) } + background-color: @bg; + border-color: darken(@light-yellow, 5%); + } + code { + color: darken(@dark-yellow, 5%); + .string, .regexp { color: desaturate(@light-blue, 15%) } + .keyword { color: hsl(40, 40%, 60%); font-weight: normal } + .comment { color: rgba(255, 255, 255, 0.2) } + .number { color: lighten(@blue, 10%) } + .class, .special { color: hsl(190, 20%, 50%) } + } +} +#guide { + background-color: @darkest; + .content { + background-color: transparent; + } + +} + +#about { + background-color: @darkest !important; + .content { + background-color: desaturate(lighten(@darkest, 3%), 5%); + } +} +#synopsis { + background-color: desaturate(lighten(@darkest, 3%), 5%) !important; + .content { + background-color: desaturate(lighten(@darkest, 3%), 5%); + } + pre {} +} +#synopsis, #guide { + .content { + .box-shadow(0, 0px, 0px, 0.0); + } +} +#about footer { + margin-top: 30px; + padding-top: 30px; + border-top: 6px solid rgba(0, 0, 0, 0.1); + text-align: center; + font-size: 16px; + color: rgba(255, 255, 255, 0.35); + #copy { font-size: 12px } + text-shadow: -1px -1px 1px rgba(0, 0, 0, 0.02); +} +</textarea></form> + <script> + var editor = CodeMirror.fromTextArea(document.getElementById("code"), { + theme: "lesser-dark", + lineNumbers : true, + matchBrackets : true + }); + </script> + + <p><strong>MIME types defined:</strong> <code>text/x-less</code>, <code>text/css</code> (if not previously defined).</p> + </body> +</html> diff --git a/codemirror_ui/lib/CodeMirror-2.3/mode/less/less.js b/codemirror_ui/lib/CodeMirror-2.3/mode/less/less.js new file mode 100644 index 0000000..5116389 --- /dev/null +++ b/codemirror_ui/lib/CodeMirror-2.3/mode/less/less.js @@ -0,0 +1,232 @@ +/* +LESS mode - http://www.lesscss.org/ +Ported to CodeMirror by Peter Kroon +*/ + +CodeMirror.defineMode("less", function(config) { + var indentUnit = config.indentUnit, type; + function ret(style, tp) {type = tp; return style;} + //html5 tags + var tags = ["a","abbr","acronym","address","applet","area","article","aside","audio","b","base","basefont","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","dir","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","legend","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","tt","u","ul","var","video","wbr"]; + + function inTagsArray(val){ + for(var i=0; i<tags.length; i++){ + if(val === tags[i]){ + return true; + } + } + } + + function tokenBase(stream, state) { + var ch = stream.next(); + + if (ch == "@") {stream.eatWhile(/[\w\-]/); return ret("meta", stream.current());} + else if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + else if (ch == "<" && stream.eat("!")) { + state.tokenize = tokenSGMLComment; + return tokenSGMLComment(stream, state); + } + else if (ch == "=") ret(null, "compare"); + else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare"); + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + else if (ch == "/") { // lesscss e.g.: .png will not be parsed as a class + if(stream.eat("/")){ + state.tokenize = tokenSComment + return tokenSComment(stream, state); + }else{ + stream.eatWhile(/[\a-zA-Z0-9\-_.\s]/); + if(/\/|\)|#/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == ")")))return ret("string", "string");//let url(/images/logo.png) without quotes return as string + return ret("number", "unit"); + } + } + else if (ch == "!") { + stream.match(/^\s*\w*/); + return ret("keyword", "important"); + } + else if (/\d/.test(ch)) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } + else if (/[,+<>*\/]/.test(ch)) {//removed . dot character original was [,.+>*\/] + return ret(null, "select-op"); + } + else if (/[;{}:\[\]()]/.test(ch)) { //added () char for lesscss original was [;{}:\[\]] + if(ch == ":"){ + stream.eatWhile(/[active|hover|link|visited]/); + if( stream.current().match(/active|hover|link|visited/)){ + return ret("tag", "tag"); + }else{ + return ret(null, ch); + } + }else{ + return ret(null, ch); + } + } + else if (ch == ".") { // lesscss + stream.eatWhile(/[\a-zA-Z0-9\-_]/); + return ret("tag", "tag"); + } + else if (ch == "#") { // lesscss + //we don't eat white-space, we want the hex color and or id only + stream.eatWhile(/[A-Za-z0-9]/); + //check if there is a proper hex color length e.g. #eee || #eeeEEE + if(stream.current().length ===4 || stream.current().length ===7){ + if(stream.current().match(/[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/,false) != null){//is there a valid hex color value present in the current stream + //when not a valid hex value, parse as id + if(stream.current().substring(1) != stream.current().match(/[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/,false))return ret("atom", "tag"); + //eat white-space + stream.eatSpace(); + //when hex value declaration doesn't end with [;,] but is does with a slash/cc comment treat it as an id, just like the other hex values that don't end with[;,] + if( /[\/<>.(){!$%^&*_\-\\?=+\|#'~`]/.test(stream.peek()) )return ret("atom", "tag"); + //#time { color: #aaa } + else if(stream.peek() == "}" )return ret("number", "unit"); + //we have a valid hex color value, parse as id whenever an element/class is defined after the hex(id) value e.g. #eee aaa || #eee .aaa + else if( /[a-zA-Z\\]/.test(stream.peek()) )return ret("atom", "tag"); + //when a hex value is on the end of a line, parse as id + else if(stream.eol())return ret("atom", "tag"); + //default + else return ret("number", "unit"); + }else{//when not a valid hexvalue in the current stream e.g. #footer + stream.eatWhile(/[\w\\\-]/); + return ret("atom", "tag"); + } + }else{ + stream.eatWhile(/[\w\\\-]/); + return ret("atom", "tag"); + } + } + else if (ch == "&") { + stream.eatWhile(/[\w\-]/); + return ret(null, ch); + } + else { + stream.eatWhile(/[\w\\\-_%.{]/); + if(stream.current().match(/http|https/) != null){ + stream.eatWhile(/[\w\\\-_%.{:\/]/); + return ret("string", "string"); + }else if(stream.peek() == "<" || stream.peek() == ">"){ + return ret("tag", "tag"); + }else if( stream.peek().match(/\(/) != null ){// lessc + return ret(null, ch); + }else if (stream.peek() == "/" && state.stack[state.stack.length-1] != undefined){ // url(dir/center/image.png) + return ret("string", "string"); + }else if( stream.current().match(/\-\d|\-.\d/) ){ // lesscss match e.g.: -5px -0.4 etc... only colorize the minus sign + //stream.backUp(stream.current().length-1); //commment out these 2 comment if you want the minus sign to be parsed as null -500px + //return ret(null, ch); + return ret("number", "unit"); + }else if( inTagsArray(stream.current()) ){ // lesscss match html tags + return ret("tag", "tag"); + }else if( /\/|[\s\)]/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == "/")) && stream.current().indexOf(".") !== -1){ + if(stream.current().substring(stream.current().length-1,stream.current().length) == "{"){ + stream.backUp(1); + return ret("tag", "tag"); + }//end if + if( (stream.eatSpace() && stream.peek().match(/[{<>.a-zA-Z]/) != null) || stream.eol() )return ret("tag", "tag");//e.g. button.icon-plus + return ret("string", "string");//let url(/images/logo.png) without quotes return as string + }else if( stream.eol() ){ + if(stream.current().substring(stream.current().length-1,stream.current().length) == "{")stream.backUp(1); + return ret("tag", "tag"); + }else{ + return ret("variable", "variable"); + } + } + + } + + function tokenSComment(stream, state) {// SComment = Slash comment + stream.skipToEnd(); + state.tokenize = tokenBase; + return ret("comment", "comment"); + } + + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenSGMLComment(stream, state) { + var dashes = 0, ch; + while ((ch = stream.next()) != null) { + if (dashes >= 2 && ch == ">") { + state.tokenize = tokenBase; + break; + } + dashes = (ch == "-") ? dashes + 1 : 0; + } + return ret("comment", "comment"); + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) + break; + escaped = !escaped && ch == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + + return { + startState: function(base) { + return {tokenize: tokenBase, + baseIndent: base || 0, + stack: []}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + + var context = state.stack[state.stack.length-1]; + if (type == "hash" && context == "rule") style = "atom"; + else if (style == "variable") { + if (context == "rule") style = null; //"tag" + else if (!context || context == "@media{"){ + style = stream.current() == "when" ? "variable" : + stream.string.match(/#/g) != undefined ? null : + /[\s,|\s\)]/.test(stream.peek()) ? "tag" : null; + } + } + + if (context == "rule" && /^[\{\};]$/.test(type)) + state.stack.pop(); + if (type == "{") { + if (context == "@media") state.stack[state.stack.length-1] = "@media{"; + else state.stack.push("{"); + } + else if (type == "}") state.stack.pop(); + else if (type == "@media") state.stack.push("@media"); + else if (context == "{" && type != "comment") state.stack.push("rule"); + return style; + }, + + indent: function(state, textAfter) { + var n = state.stack.length; + if (/^\}/.test(textAfter)) + n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1; + return state.baseIndent + n * indentUnit; + }, + + electricChars: "}" + }; +}); + +CodeMirror.defineMIME("text/x-less", "less"); +if (!CodeMirror.mimeModes.hasOwnProperty("text/css")) + CodeMirror.defineMIME("text/css", "less"); |