Projekt

Obecné

Profil

Stáhnout (119 KB) Statistiky
| Větev: | Tag: | Revize:
1
ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) {
2
"use strict";
3

    
4
var oop = require("../lib/oop");
5
var lang = require("../lib/lang");
6
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
7
var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|max-zoom|min-height|min-width|min-zoom|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|user-select|user-zoom|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index";
8
var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters";
9
var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero|zoom";
10
var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen";
11
var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace";
12

    
13
var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))";
14
var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b";
15
var pseudoClasses  = exports.pseudoClasses =  "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b";
16

    
17
var CssHighlightRules = function() {
18

    
19
    var keywordMapper = this.createKeywordMapper({
20
        "support.function": supportFunction,
21
        "support.constant": supportConstant,
22
        "support.type": supportType,
23
        "support.constant.color": supportConstantColor,
24
        "support.constant.fonts": supportConstantFonts
25
    }, "text", true);
26

    
27
    this.$rules = {
28
        "start" : [{
29
            include : ["strings", "url", "comments"]
30
        }, {
31
            token: "paren.lparen",
32
            regex: "\\{",
33
            next:  "ruleset"
34
        }, {
35
            token: "paren.rparen",
36
            regex: "\\}"
37
        }, {
38
            token: "string",
39
            regex: "@(?!viewport)",
40
            next:  "media"
41
        }, {
42
            token: "keyword",
43
            regex: "#[a-z0-9-_]+"
44
        }, {
45
            token: "keyword",
46
            regex: "%"
47
        }, {
48
            token: "variable",
49
            regex: "\\.[a-z0-9-_]+"
50
        }, {
51
            token: "string",
52
            regex: ":[a-z0-9-_]+"
53
        }, {
54
            token : "constant.numeric",
55
            regex : numRe
56
        }, {
57
            token: "constant",
58
            regex: "[a-z0-9-_]+"
59
        }, {
60
            caseInsensitive: true
61
        }],
62

    
63
        "media": [{
64
            include : ["strings", "url", "comments"]
65
        }, {
66
            token: "paren.lparen",
67
            regex: "\\{",
68
            next:  "start"
69
        }, {
70
            token: "paren.rparen",
71
            regex: "\\}",
72
            next:  "start"
73
        }, {
74
            token: "string",
75
            regex: ";",
76
            next:  "start"
77
        }, {
78
            token: "keyword",
79
            regex: "(?:media|supports|document|charset|import|namespace|media|supports|document"
80
                + "|page|font|keyframes|viewport|counter-style|font-feature-values"
81
                + "|swash|ornaments|annotation|stylistic|styleset|character-variant)"
82
        }],
83

    
84
        "comments" : [{
85
            token: "comment", // multi line comment
86
            regex: "\\/\\*",
87
            push: [{
88
                token : "comment",
89
                regex : "\\*\\/",
90
                next : "pop"
91
            }, {
92
                defaultToken : "comment"
93
            }]
94
        }],
95

    
96
        "ruleset" : [{
97
            regex : "-(webkit|ms|moz|o)-",
98
            token : "text"
99
        }, {
100
            token : "punctuation.operator",
101
            regex : "[:;]"
102
        }, {
103
            token : "paren.rparen",
104
            regex : "\\}",
105
            next : "start"
106
        }, {
107
            include : ["strings", "url", "comments"]
108
        }, {
109
            token : ["constant.numeric", "keyword"],
110
            regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vmax|vmin|vm|vw|%)"
111
        }, {
112
            token : "constant.numeric",
113
            regex : numRe
114
        }, {
115
            token : "constant.numeric",  // hex6 color
116
            regex : "#[a-f0-9]{6}"
117
        }, {
118
            token : "constant.numeric", // hex3 color
119
            regex : "#[a-f0-9]{3}"
120
        }, {
121
            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],
122
            regex : pseudoElements
123
        }, {
124
            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],
125
            regex : pseudoClasses
126
        }, {
127
            include: "url"
128
        }, {
129
            token : keywordMapper,
130
            regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"
131
        }, {
132
            caseInsensitive: true
133
        }],
134

    
135
        url: [{
136
            token : "support.function",
137
            regex : "(?:url(:?-prefix)?|domain|regexp)\\(",
138
            push: [{
139
                token : "support.function",
140
                regex : "\\)",
141
                next : "pop"
142
            }, {
143
                defaultToken: "string"
144
            }]
145
        }],
146

    
147
        strings: [{
148
            token : "string.start",
149
            regex : "'",
150
            push : [{
151
                token : "string.end",
152
                regex : "'|$",
153
                next: "pop"
154
            }, {
155
                include : "escapes"
156
            }, {
157
                token : "constant.language.escape",
158
                regex : /\\$/,
159
                consumeLineEnd: true
160
            }, {
161
                defaultToken: "string"
162
            }]
163
        }, {
164
            token : "string.start",
165
            regex : '"',
166
            push : [{
167
                token : "string.end",
168
                regex : '"|$',
169
                next: "pop"
170
            }, {
171
                include : "escapes"
172
            }, {
173
                token : "constant.language.escape",
174
                regex : /\\$/,
175
                consumeLineEnd: true
176
            }, {
177
                defaultToken: "string"
178
            }]
179
        }],
180
        escapes: [{
181
            token : "constant.language.escape",
182
            regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/
183
        }]
184

    
185
    };
186

    
187
    this.normalizeRules();
188
};
189

    
190
oop.inherits(CssHighlightRules, TextHighlightRules);
191

    
192
exports.CssHighlightRules = CssHighlightRules;
193

    
194
});
195

    
196
ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
197
"use strict";
198

    
199
var oop = require("../lib/oop");
200
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
201

    
202
var DocCommentHighlightRules = function() {
203
    this.$rules = {
204
        "start" : [ {
205
            token : "comment.doc.tag",
206
            regex : "@[\\w\\d_]+" // TODO: fix email addresses
207
        }, 
208
        DocCommentHighlightRules.getTagRule(),
209
        {
210
            defaultToken : "comment.doc",
211
            caseInsensitive: true
212
        }]
213
    };
214
};
215

    
216
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
217

    
218
DocCommentHighlightRules.getTagRule = function(start) {
219
    return {
220
        token : "comment.doc.tag.storage.type",
221
        regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b"
222
    };
223
};
224

    
225
DocCommentHighlightRules.getStartRule = function(start) {
226
    return {
227
        token : "comment.doc", // doc comment
228
        regex : "\\/\\*(?=\\*)",
229
        next  : start
230
    };
231
};
232

    
233
DocCommentHighlightRules.getEndRule = function (start) {
234
    return {
235
        token : "comment.doc", // closing comment
236
        regex : "\\*\\/",
237
        next  : start
238
    };
239
};
240

    
241

    
242
exports.DocCommentHighlightRules = DocCommentHighlightRules;
243

    
244
});
245

    
246
ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) {
247
"use strict";
248

    
249
var oop = require("../lib/oop");
250
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
251
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
252
var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*";
253

    
254
var JavaScriptHighlightRules = function(options) {
255
    var keywordMapper = this.createKeywordMapper({
256
        "variable.language":
257
            "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|"  + // Constructors
258
            "Namespace|QName|XML|XMLList|"                                             + // E4X
259
            "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|"   +
260
            "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|"                    +
261
            "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|"   + // Errors
262
            "SyntaxError|TypeError|URIError|"                                          +
263
            "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions
264
            "isNaN|parseFloat|parseInt|"                                               +
265
            "JSON|Math|"                                                               + // Other
266
            "this|arguments|prototype|window|document"                                 , // Pseudo
267
        "keyword":
268
            "const|yield|import|get|set|async|await|" +
269
            "break|case|catch|continue|default|delete|do|else|finally|for|function|" +
270
            "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" +
271
            "__parent__|__count__|escape|unescape|with|__proto__|" +
272
            "class|enum|extends|super|export|implements|private|public|interface|package|protected|static",
273
        "storage.type":
274
            "const|let|var|function",
275
        "constant.language":
276
            "null|Infinity|NaN|undefined",
277
        "support.function":
278
            "alert",
279
        "constant.language.boolean": "true|false"
280
    }, "identifier");
281
    var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";
282

    
283
    var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex
284
        "u[0-9a-fA-F]{4}|" + // unicode
285
        "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode
286
        "[0-2][0-7]{0,2}|" + // oct
287
        "3[0-7][0-7]?|" + // oct
288
        "[4-7][0-7]?|" + //oct
289
        ".)";
290

    
291
    this.$rules = {
292
        "no_regex" : [
293
            DocCommentHighlightRules.getStartRule("doc-start"),
294
            comments("no_regex"),
295
            {
296
                token : "string",
297
                regex : "'(?=.)",
298
                next  : "qstring"
299
            }, {
300
                token : "string",
301
                regex : '"(?=.)',
302
                next  : "qqstring"
303
            }, {
304
                token : "constant.numeric", // hexadecimal, octal and binary
305
                regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/
306
            }, {
307
                token : "constant.numeric", // decimal integers and floats
308
                regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/
309
            }, {
310
                token : [
311
                    "storage.type", "punctuation.operator", "support.function",
312
                    "punctuation.operator", "entity.name.function", "text","keyword.operator"
313
                ],
314
                regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)",
315
                next: "function_arguments"
316
            }, {
317
                token : [
318
                    "storage.type", "punctuation.operator", "entity.name.function", "text",
319
                    "keyword.operator", "text", "storage.type", "text", "paren.lparen"
320
                ],
321
                regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
322
                next: "function_arguments"
323
            }, {
324
                token : [
325
                    "entity.name.function", "text", "keyword.operator", "text", "storage.type",
326
                    "text", "paren.lparen"
327
                ],
328
                regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
329
                next: "function_arguments"
330
            }, {
331
                token : [
332
                    "storage.type", "punctuation.operator", "entity.name.function", "text",
333
                    "keyword.operator", "text",
334
                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"
335
                ],
336
                regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",
337
                next: "function_arguments"
338
            }, {
339
                token : [
340
                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"
341
                ],
342
                regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()",
343
                next: "function_arguments"
344
            }, {
345
                token : [
346
                    "entity.name.function", "text", "punctuation.operator",
347
                    "text", "storage.type", "text", "paren.lparen"
348
                ],
349
                regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",
350
                next: "function_arguments"
351
            }, {
352
                token : [
353
                    "text", "text", "storage.type", "text", "paren.lparen"
354
                ],
355
                regex : "(:)(\\s*)(function)(\\s*)(\\()",
356
                next: "function_arguments"
357
            }, {
358
                token : "keyword",
359
                regex : "from(?=\\s*('|\"))"
360
            }, {
361
                token : "keyword",
362
                regex : "(?:" + kwBeforeRe + ")\\b",
363
                next : "start"
364
            }, {
365
                token : ["support.constant"],
366
                regex : /that\b/
367
            }, {
368
                token : ["storage.type", "punctuation.operator", "support.function.firebug"],
369
                regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/
370
            }, {
371
                token : keywordMapper,
372
                regex : identifierRe
373
            }, {
374
                token : "punctuation.operator",
375
                regex : /[.](?![.])/,
376
                next  : "property"
377
            }, {
378
                token : "storage.type",
379
                regex : /=>/,
380
                next  : "start"
381
            }, {
382
                token : "keyword.operator",
383
                regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,
384
                next  : "start"
385
            }, {
386
                token : "punctuation.operator",
387
                regex : /[?:,;.]/,
388
                next  : "start"
389
            }, {
390
                token : "paren.lparen",
391
                regex : /[\[({]/,
392
                next  : "start"
393
            }, {
394
                token : "paren.rparen",
395
                regex : /[\])}]/
396
            }, {
397
                token: "comment",
398
                regex: /^#!.*$/
399
            }
400
        ],
401
        property: [{
402
                token : "text",
403
                regex : "\\s+"
404
            }, {
405
                token : [
406
                    "storage.type", "punctuation.operator", "entity.name.function", "text",
407
                    "keyword.operator", "text",
408
                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"
409
                ],
410
                regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",
411
                next: "function_arguments"
412
            }, {
413
                token : "punctuation.operator",
414
                regex : /[.](?![.])/
415
            }, {
416
                token : "support.function",
417
                regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/
418
            }, {
419
                token : "support.function.dom",
420
                regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/
421
            }, {
422
                token :  "support.constant",
423
                regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/
424
            }, {
425
                token : "identifier",
426
                regex : identifierRe
427
            }, {
428
                regex: "",
429
                token: "empty",
430
                next: "no_regex"
431
            }
432
        ],
433
        "start": [
434
            DocCommentHighlightRules.getStartRule("doc-start"),
435
            comments("start"),
436
            {
437
                token: "string.regexp",
438
                regex: "\\/",
439
                next: "regex"
440
            }, {
441
                token : "text",
442
                regex : "\\s+|^$",
443
                next : "start"
444
            }, {
445
                token: "empty",
446
                regex: "",
447
                next: "no_regex"
448
            }
449
        ],
450
        "regex": [
451
            {
452
                token: "regexp.keyword.operator",
453
                regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
454
            }, {
455
                token: "string.regexp",
456
                regex: "/[sxngimy]*",
457
                next: "no_regex"
458
            }, {
459
                token : "invalid",
460
                regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
461
            }, {
462
                token : "constant.language.escape",
463
                regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
464
            }, {
465
                token : "constant.language.delimiter",
466
                regex: /\|/
467
            }, {
468
                token: "constant.language.escape",
469
                regex: /\[\^?/,
470
                next: "regex_character_class"
471
            }, {
472
                token: "empty",
473
                regex: "$",
474
                next: "no_regex"
475
            }, {
476
                defaultToken: "string.regexp"
477
            }
478
        ],
479
        "regex_character_class": [
480
            {
481
                token: "regexp.charclass.keyword.operator",
482
                regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
483
            }, {
484
                token: "constant.language.escape",
485
                regex: "]",
486
                next: "regex"
487
            }, {
488
                token: "constant.language.escape",
489
                regex: "-"
490
            }, {
491
                token: "empty",
492
                regex: "$",
493
                next: "no_regex"
494
            }, {
495
                defaultToken: "string.regexp.charachterclass"
496
            }
497
        ],
498
        "function_arguments": [
499
            {
500
                token: "variable.parameter",
501
                regex: identifierRe
502
            }, {
503
                token: "punctuation.operator",
504
                regex: "[, ]+"
505
            }, {
506
                token: "punctuation.operator",
507
                regex: "$"
508
            }, {
509
                token: "empty",
510
                regex: "",
511
                next: "no_regex"
512
            }
513
        ],
514
        "qqstring" : [
515
            {
516
                token : "constant.language.escape",
517
                regex : escapedRe
518
            }, {
519
                token : "string",
520
                regex : "\\\\$",
521
                consumeLineEnd  : true
522
            }, {
523
                token : "string",
524
                regex : '"|$',
525
                next  : "no_regex"
526
            }, {
527
                defaultToken: "string"
528
            }
529
        ],
530
        "qstring" : [
531
            {
532
                token : "constant.language.escape",
533
                regex : escapedRe
534
            }, {
535
                token : "string",
536
                regex : "\\\\$",
537
                consumeLineEnd  : true
538
            }, {
539
                token : "string",
540
                regex : "'|$",
541
                next  : "no_regex"
542
            }, {
543
                defaultToken: "string"
544
            }
545
        ]
546
    };
547

    
548

    
549
    if (!options || !options.noES6) {
550
        this.$rules.no_regex.unshift({
551
            regex: "[{}]", onMatch: function(val, state, stack) {
552
                this.next = val == "{" ? this.nextState : "";
553
                if (val == "{" && stack.length) {
554
                    stack.unshift("start", state);
555
                }
556
                else if (val == "}" && stack.length) {
557
                    stack.shift();
558
                    this.next = stack.shift();
559
                    if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1)
560
                        return "paren.quasi.end";
561
                }
562
                return val == "{" ? "paren.lparen" : "paren.rparen";
563
            },
564
            nextState: "start"
565
        }, {
566
            token : "string.quasi.start",
567
            regex : /`/,
568
            push  : [{
569
                token : "constant.language.escape",
570
                regex : escapedRe
571
            }, {
572
                token : "paren.quasi.start",
573
                regex : /\${/,
574
                push  : "start"
575
            }, {
576
                token : "string.quasi.end",
577
                regex : /`/,
578
                next  : "pop"
579
            }, {
580
                defaultToken: "string.quasi"
581
            }]
582
        });
583

    
584
        if (!options || options.jsx != false)
585
            JSX.call(this);
586
    }
587

    
588
    this.embedRules(DocCommentHighlightRules, "doc-",
589
        [ DocCommentHighlightRules.getEndRule("no_regex") ]);
590

    
591
    this.normalizeRules();
592
};
593

    
594
oop.inherits(JavaScriptHighlightRules, TextHighlightRules);
595

    
596
function JSX() {
597
    var tagRegex = identifierRe.replace("\\d", "\\d\\-");
598
    var jsxTag = {
599
        onMatch : function(val, state, stack) {
600
            var offset = val.charAt(1) == "/" ? 2 : 1;
601
            if (offset == 1) {
602
                if (state != this.nextState)
603
                    stack.unshift(this.next, this.nextState, 0);
604
                else
605
                    stack.unshift(this.next);
606
                stack[2]++;
607
            } else if (offset == 2) {
608
                if (state == this.nextState) {
609
                    stack[1]--;
610
                    if (!stack[1] || stack[1] < 0) {
611
                        stack.shift();
612
                        stack.shift();
613
                    }
614
                }
615
            }
616
            return [{
617
                type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml",
618
                value: val.slice(0, offset)
619
            }, {
620
                type: "meta.tag.tag-name.xml",
621
                value: val.substr(offset)
622
            }];
623
        },
624
        regex : "</?" + tagRegex + "",
625
        next: "jsxAttributes",
626
        nextState: "jsx"
627
    };
628
    this.$rules.start.unshift(jsxTag);
629
    var jsxJsRule = {
630
        regex: "{",
631
        token: "paren.quasi.start",
632
        push: "start"
633
    };
634
    this.$rules.jsx = [
635
        jsxJsRule,
636
        jsxTag,
637
        {include : "reference"},
638
        {defaultToken: "string"}
639
    ];
640
    this.$rules.jsxAttributes = [{
641
        token : "meta.tag.punctuation.tag-close.xml",
642
        regex : "/?>",
643
        onMatch : function(value, currentState, stack) {
644
            if (currentState == stack[0])
645
                stack.shift();
646
            if (value.length == 2) {
647
                if (stack[0] == this.nextState)
648
                    stack[1]--;
649
                if (!stack[1] || stack[1] < 0) {
650
                    stack.splice(0, 2);
651
                }
652
            }
653
            this.next = stack[0] || "start";
654
            return [{type: this.token, value: value}];
655
        },
656
        nextState: "jsx"
657
    },
658
    jsxJsRule,
659
    comments("jsxAttributes"),
660
    {
661
        token : "entity.other.attribute-name.xml",
662
        regex : tagRegex
663
    }, {
664
        token : "keyword.operator.attribute-equals.xml",
665
        regex : "="
666
    }, {
667
        token : "text.tag-whitespace.xml",
668
        regex : "\\s+"
669
    }, {
670
        token : "string.attribute-value.xml",
671
        regex : "'",
672
        stateName : "jsx_attr_q",
673
        push : [
674
            {token : "string.attribute-value.xml", regex: "'", next: "pop"},
675
            {include : "reference"},
676
            {defaultToken : "string.attribute-value.xml"}
677
        ]
678
    }, {
679
        token : "string.attribute-value.xml",
680
        regex : '"',
681
        stateName : "jsx_attr_qq",
682
        push : [
683
            {token : "string.attribute-value.xml", regex: '"', next: "pop"},
684
            {include : "reference"},
685
            {defaultToken : "string.attribute-value.xml"}
686
        ]
687
    },
688
    jsxTag
689
    ];
690
    this.$rules.reference = [{
691
        token : "constant.language.escape.reference.xml",
692
        regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
693
    }];
694
}
695

    
696
function comments(next) {
697
    return [
698
        {
699
            token : "comment", // multi line comment
700
            regex : /\/\*/,
701
            next: [
702
                DocCommentHighlightRules.getTagRule(),
703
                {token : "comment", regex : "\\*\\/", next : next || "pop"},
704
                {defaultToken : "comment", caseInsensitive: true}
705
            ]
706
        }, {
707
            token : "comment",
708
            regex : "\\/\\/",
709
            next: [
710
                DocCommentHighlightRules.getTagRule(),
711
                {token : "comment", regex : "$|^", next : next || "pop"},
712
                {defaultToken : "comment", caseInsensitive: true}
713
            ]
714
        }
715
    ];
716
}
717
exports.JavaScriptHighlightRules = JavaScriptHighlightRules;
718
});
719

    
720
ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
721
"use strict";
722

    
723
var oop = require("../lib/oop");
724
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
725

    
726
var XmlHighlightRules = function(normalize) {
727
    var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*";
728

    
729
    this.$rules = {
730
        start : [
731
            {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"},
732
            {
733
                token : ["punctuation.instruction.xml", "keyword.instruction.xml"],
734
                regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction"
735
            },
736
            {token : "comment.start.xml", regex : "<\\!--", next : "comment"},
737
            {
738
                token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"],
739
                regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true
740
            },
741
            {include : "tag"},
742
            {token : "text.end-tag-open.xml", regex: "</"},
743
            {token : "text.tag-open.xml", regex: "<"},
744
            {include : "reference"},
745
            {defaultToken : "text.xml"}
746
        ],
747

    
748
        processing_instruction : [{
749
            token : "entity.other.attribute-name.decl-attribute-name.xml",
750
            regex : tagRegex
751
        }, {
752
            token : "keyword.operator.decl-attribute-equals.xml",
753
            regex : "="
754
        }, {
755
            include: "whitespace"
756
        }, {
757
            include: "string"
758
        }, {
759
            token : "punctuation.xml-decl.xml",
760
            regex : "\\?>",
761
            next : "start"
762
        }],
763

    
764
        doctype : [
765
            {include : "whitespace"},
766
            {include : "string"},
767
            {token : "xml-pe.doctype.xml", regex : ">", next : "start"},
768
            {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"},
769
            {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"}
770
        ],
771

    
772
        int_subset : [{
773
            token : "text.xml",
774
            regex : "\\s+"
775
        }, {
776
            token: "punctuation.int-subset.xml",
777
            regex: "]",
778
            next: "pop"
779
        }, {
780
            token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"],
781
            regex : "(<\\!)(" + tagRegex + ")",
782
            push : [{
783
                token : "text",
784
                regex : "\\s+"
785
            },
786
            {
787
                token : "punctuation.markup-decl.xml",
788
                regex : ">",
789
                next : "pop"
790
            },
791
            {include : "string"}]
792
        }],
793

    
794
        cdata : [
795
            {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"},
796
            {token : "text.xml", regex : "\\s+"},
797
            {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"}
798
        ],
799

    
800
        comment : [
801
            {token : "comment.end.xml", regex : "-->", next : "start"},
802
            {defaultToken : "comment.xml"}
803
        ],
804

    
805
        reference : [{
806
            token : "constant.language.escape.reference.xml",
807
            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
808
        }],
809

    
810
        attr_reference : [{
811
            token : "constant.language.escape.reference.attribute-value.xml",
812
            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
813
        }],
814

    
815
        tag : [{
816
            token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"],
817
            regex : "(?:(<)|(</))((?:" + tagRegex + ":)?" + tagRegex + ")",
818
            next: [
819
                {include : "attributes"},
820
                {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : "start"}
821
            ]
822
        }],
823

    
824
        tag_whitespace : [
825
            {token : "text.tag-whitespace.xml", regex : "\\s+"}
826
        ],
827
        whitespace : [
828
            {token : "text.whitespace.xml", regex : "\\s+"}
829
        ],
830
        string: [{
831
            token : "string.xml",
832
            regex : "'",
833
            push : [
834
                {token : "string.xml", regex: "'", next: "pop"},
835
                {defaultToken : "string.xml"}
836
            ]
837
        }, {
838
            token : "string.xml",
839
            regex : '"',
840
            push : [
841
                {token : "string.xml", regex: '"', next: "pop"},
842
                {defaultToken : "string.xml"}
843
            ]
844
        }],
845

    
846
        attributes: [{
847
            token : "entity.other.attribute-name.xml",
848
            regex : tagRegex
849
        }, {
850
            token : "keyword.operator.attribute-equals.xml",
851
            regex : "="
852
        }, {
853
            include: "tag_whitespace"
854
        }, {
855
            include: "attribute_value"
856
        }],
857

    
858
        attribute_value: [{
859
            token : "string.attribute-value.xml",
860
            regex : "'",
861
            push : [
862
                {token : "string.attribute-value.xml", regex: "'", next: "pop"},
863
                {include : "attr_reference"},
864
                {defaultToken : "string.attribute-value.xml"}
865
            ]
866
        }, {
867
            token : "string.attribute-value.xml",
868
            regex : '"',
869
            push : [
870
                {token : "string.attribute-value.xml", regex: '"', next: "pop"},
871
                {include : "attr_reference"},
872
                {defaultToken : "string.attribute-value.xml"}
873
            ]
874
        }]
875
    };
876

    
877
    if (this.constructor === XmlHighlightRules)
878
        this.normalizeRules();
879
};
880

    
881

    
882
(function() {
883

    
884
    this.embedTagRules = function(HighlightRules, prefix, tag){
885
        this.$rules.tag.unshift({
886
            token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"],
887
            regex : "(<)(" + tag + "(?=\\s|>|$))",
888
            next: [
889
                {include : "attributes"},
890
                {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"}
891
            ]
892
        });
893

    
894
        this.$rules[tag + "-end"] = [
895
            {include : "attributes"},
896
            {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>",  next: "start",
897
                onMatch : function(value, currentState, stack) {
898
                    stack.splice(0);
899
                    return this.token;
900
            }}
901
        ];
902

    
903
        this.embedRules(HighlightRules, prefix, [{
904
            token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"],
905
            regex : "(</)(" + tag + "(?=\\s|>|$))",
906
            next: tag + "-end"
907
        }, {
908
            token: "string.cdata.xml",
909
            regex : "<\\!\\[CDATA\\["
910
        }, {
911
            token: "string.cdata.xml",
912
            regex : "\\]\\]>"
913
        }]);
914
    };
915

    
916
}).call(TextHighlightRules.prototype);
917

    
918
oop.inherits(XmlHighlightRules, TextHighlightRules);
919

    
920
exports.XmlHighlightRules = XmlHighlightRules;
921
});
922

    
923
ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) {
924
"use strict";
925

    
926
var oop = require("../lib/oop");
927
var lang = require("../lib/lang");
928
var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;
929
var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;
930
var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;
931

    
932
var tagMap = lang.createMap({
933
    a           : 'anchor',
934
    button 	    : 'form',
935
    form        : 'form',
936
    img         : 'image',
937
    input       : 'form',
938
    label       : 'form',
939
    option      : 'form',
940
    script      : 'script',
941
    select      : 'form',
942
    textarea    : 'form',
943
    style       : 'style',
944
    table       : 'table',
945
    tbody       : 'table',
946
    td          : 'table',
947
    tfoot       : 'table',
948
    th          : 'table',
949
    tr          : 'table'
950
});
951

    
952
var HtmlHighlightRules = function() {
953
    XmlHighlightRules.call(this);
954

    
955
    this.addRules({
956
        attributes: [{
957
            include : "tag_whitespace"
958
        }, {
959
            token : "entity.other.attribute-name.xml",
960
            regex : "[-_a-zA-Z0-9:.]+"
961
        }, {
962
            token : "keyword.operator.attribute-equals.xml",
963
            regex : "=",
964
            push : [{
965
                include: "tag_whitespace"
966
            }, {
967
                token : "string.unquoted.attribute-value.html",
968
                regex : "[^<>='\"`\\s]+",
969
                next : "pop"
970
            }, {
971
                token : "empty",
972
                regex : "",
973
                next : "pop"
974
            }]
975
        }, {
976
            include : "attribute_value"
977
        }],
978
        tag: [{
979
            token : function(start, tag) {
980
                var group = tagMap[tag];
981
                return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml",
982
                    "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"];
983
            },
984
            regex : "(</?)([-_a-zA-Z0-9:.]+)",
985
            next: "tag_stuff"
986
        }],
987
        tag_stuff: [
988
            {include : "attributes"},
989
            {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : "start"}
990
        ]
991
    });
992

    
993
    this.embedTagRules(CssHighlightRules, "css-", "style");
994
    this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script");
995

    
996
    if (this.constructor === HtmlHighlightRules)
997
        this.normalizeRules();
998
};
999

    
1000
oop.inherits(HtmlHighlightRules, XmlHighlightRules);
1001

    
1002
exports.HtmlHighlightRules = HtmlHighlightRules;
1003
});
1004

    
1005
ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) {
1006
"use strict";
1007

    
1008
var Range = require("../range").Range;
1009

    
1010
var MatchingBraceOutdent = function() {};
1011

    
1012
(function() {
1013

    
1014
    this.checkOutdent = function(line, input) {
1015
        if (! /^\s+$/.test(line))
1016
            return false;
1017

    
1018
        return /^\s*\}/.test(input);
1019
    };
1020

    
1021
    this.autoOutdent = function(doc, row) {
1022
        var line = doc.getLine(row);
1023
        var match = line.match(/^(\s*\})/);
1024

    
1025
        if (!match) return 0;
1026

    
1027
        var column = match[1].length;
1028
        var openBracePos = doc.findMatchingBracket({row: row, column: column});
1029

    
1030
        if (!openBracePos || openBracePos.row == row) return 0;
1031

    
1032
        var indent = this.$getIndent(doc.getLine(openBracePos.row));
1033
        doc.replace(new Range(row, 0, row, column-1), indent);
1034
    };
1035

    
1036
    this.$getIndent = function(line) {
1037
        return line.match(/^\s*/)[0];
1038
    };
1039

    
1040
}).call(MatchingBraceOutdent.prototype);
1041

    
1042
exports.MatchingBraceOutdent = MatchingBraceOutdent;
1043
});
1044

    
1045
ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) {
1046
"use strict";
1047

    
1048
var oop = require("../../lib/oop");
1049
var Range = require("../../range").Range;
1050
var BaseFoldMode = require("./fold_mode").FoldMode;
1051

    
1052
var FoldMode = exports.FoldMode = function(commentRegex) {
1053
    if (commentRegex) {
1054
        this.foldingStartMarker = new RegExp(
1055
            this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
1056
        );
1057
        this.foldingStopMarker = new RegExp(
1058
            this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
1059
        );
1060
    }
1061
};
1062
oop.inherits(FoldMode, BaseFoldMode);
1063

    
1064
(function() {
1065
    
1066
    this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/;
1067
    this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/;
1068
    this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/;
1069
    this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/;
1070
    this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/;
1071
    this._getFoldWidgetBase = this.getFoldWidget;
1072
    this.getFoldWidget = function(session, foldStyle, row) {
1073
        var line = session.getLine(row);
1074
    
1075
        if (this.singleLineBlockCommentRe.test(line)) {
1076
            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))
1077
                return "";
1078
        }
1079
    
1080
        var fw = this._getFoldWidgetBase(session, foldStyle, row);
1081
    
1082
        if (!fw && this.startRegionRe.test(line))
1083
            return "start"; // lineCommentRegionStart
1084
    
1085
        return fw;
1086
    };
1087

    
1088
    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
1089
        var line = session.getLine(row);
1090
        
1091
        if (this.startRegionRe.test(line))
1092
            return this.getCommentRegionBlock(session, line, row);
1093
        
1094
        var match = line.match(this.foldingStartMarker);
1095
        if (match) {
1096
            var i = match.index;
1097

    
1098
            if (match[1])
1099
                return this.openingBracketBlock(session, match[1], row, i);
1100
                
1101
            var range = session.getCommentFoldRange(row, i + match[0].length, 1);
1102
            
1103
            if (range && !range.isMultiLine()) {
1104
                if (forceMultiline) {
1105
                    range = this.getSectionRange(session, row);
1106
                } else if (foldStyle != "all")
1107
                    range = null;
1108
            }
1109
            
1110
            return range;
1111
        }
1112

    
1113
        if (foldStyle === "markbegin")
1114
            return;
1115

    
1116
        var match = line.match(this.foldingStopMarker);
1117
        if (match) {
1118
            var i = match.index + match[0].length;
1119

    
1120
            if (match[1])
1121
                return this.closingBracketBlock(session, match[1], row, i);
1122

    
1123
            return session.getCommentFoldRange(row, i, -1);
1124
        }
1125
    };
1126
    
1127
    this.getSectionRange = function(session, row) {
1128
        var line = session.getLine(row);
1129
        var startIndent = line.search(/\S/);
1130
        var startRow = row;
1131
        var startColumn = line.length;
1132
        row = row + 1;
1133
        var endRow = row;
1134
        var maxRow = session.getLength();
1135
        while (++row < maxRow) {
1136
            line = session.getLine(row);
1137
            var indent = line.search(/\S/);
1138
            if (indent === -1)
1139
                continue;
1140
            if  (startIndent > indent)
1141
                break;
1142
            var subRange = this.getFoldWidgetRange(session, "all", row);
1143
            
1144
            if (subRange) {
1145
                if (subRange.start.row <= startRow) {
1146
                    break;
1147
                } else if (subRange.isMultiLine()) {
1148
                    row = subRange.end.row;
1149
                } else if (startIndent == indent) {
1150
                    break;
1151
                }
1152
            }
1153
            endRow = row;
1154
        }
1155
        
1156
        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
1157
    };
1158
    this.getCommentRegionBlock = function(session, line, row) {
1159
        var startColumn = line.search(/\s*$/);
1160
        var maxRow = session.getLength();
1161
        var startRow = row;
1162
        
1163
        var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/;
1164
        var depth = 1;
1165
        while (++row < maxRow) {
1166
            line = session.getLine(row);
1167
            var m = re.exec(line);
1168
            if (!m) continue;
1169
            if (m[1]) depth--;
1170
            else depth++;
1171

    
1172
            if (!depth) break;
1173
        }
1174

    
1175
        var endRow = row;
1176
        if (endRow > startRow) {
1177
            return new Range(startRow, startColumn, endRow, line.length);
1178
        }
1179
    };
1180

    
1181
}).call(FoldMode.prototype);
1182

    
1183
});
1184

    
1185
ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) {
1186
"use strict";
1187

    
1188
var oop = require("../lib/oop");
1189
var TextMode = require("./text").Mode;
1190
var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;
1191
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
1192
var WorkerClient = require("../worker/worker_client").WorkerClient;
1193
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
1194
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
1195

    
1196
var Mode = function() {
1197
    this.HighlightRules = JavaScriptHighlightRules;
1198
    
1199
    this.$outdent = new MatchingBraceOutdent();
1200
    this.$behaviour = new CstyleBehaviour();
1201
    this.foldingRules = new CStyleFoldMode();
1202
};
1203
oop.inherits(Mode, TextMode);
1204

    
1205
(function() {
1206

    
1207
    this.lineCommentStart = "//";
1208
    this.blockComment = {start: "/*", end: "*/"};
1209
    this.$quotes = {'"': '"', "'": "'", "`": "`"};
1210

    
1211
    this.getNextLineIndent = function(state, line, tab) {
1212
        var indent = this.$getIndent(line);
1213

    
1214
        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
1215
        var tokens = tokenizedLine.tokens;
1216
        var endState = tokenizedLine.state;
1217

    
1218
        if (tokens.length && tokens[tokens.length-1].type == "comment") {
1219
            return indent;
1220
        }
1221

    
1222
        if (state == "start" || state == "no_regex") {
1223
            var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);
1224
            if (match) {
1225
                indent += tab;
1226
            }
1227
        } else if (state == "doc-start") {
1228
            if (endState == "start" || endState == "no_regex") {
1229
                return "";
1230
            }
1231
            var match = line.match(/^\s*(\/?)\*/);
1232
            if (match) {
1233
                if (match[1]) {
1234
                    indent += " ";
1235
                }
1236
                indent += "* ";
1237
            }
1238
        }
1239

    
1240
        return indent;
1241
    };
1242

    
1243
    this.checkOutdent = function(state, line, input) {
1244
        return this.$outdent.checkOutdent(line, input);
1245
    };
1246

    
1247
    this.autoOutdent = function(state, doc, row) {
1248
        this.$outdent.autoOutdent(doc, row);
1249
    };
1250

    
1251
    this.createWorker = function(session) {
1252
        var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker");
1253
        worker.attachToDocument(session.getDocument());
1254

    
1255
        worker.on("annotate", function(results) {
1256
            session.setAnnotations(results.data);
1257
        });
1258

    
1259
        worker.on("terminate", function() {
1260
            session.clearAnnotations();
1261
        });
1262

    
1263
        return worker;
1264
    };
1265

    
1266
    this.$id = "ace/mode/javascript";
1267
    this.snippetFileId = "ace/snippets/javascript";
1268
}).call(Mode.prototype);
1269

    
1270
exports.Mode = Mode;
1271
});
1272

    
1273
ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) {
1274
"use strict";
1275

    
1276
var propertyMap = {
1277
    "background": {"#$0": 1},
1278
    "background-color": {"#$0": 1, "transparent": 1, "fixed": 1},
1279
    "background-image": {"url('/$0')": 1},
1280
    "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1},
1281
    "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2},
1282
    "background-attachment": {"scroll": 1, "fixed": 1},
1283
    "background-size": {"cover": 1, "contain": 1},
1284
    "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1},
1285
    "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1},
1286
    "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1},
1287
    "border-color": {"#$0": 1},
1288
    "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2},
1289
    "border-collapse": {"collapse": 1, "separate": 1},
1290
    "bottom": {"px": 1, "em": 1, "%": 1},
1291
    "clear": {"left": 1, "right": 1, "both": 1, "none": 1},
1292
    "color": {"#$0": 1, "rgb(#$00,0,0)": 1},
1293
    "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1},
1294
    "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1},
1295
    "empty-cells": {"show": 1, "hide": 1},
1296
    "float": {"left": 1, "right": 1, "none": 1},
1297
    "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1},
1298
    "font-size": {"px": 1, "em": 1, "%": 1},
1299
    "font-weight": {"bold": 1, "normal": 1},
1300
    "font-style": {"italic": 1, "normal": 1},
1301
    "font-variant": {"normal": 1, "small-caps": 1},
1302
    "height": {"px": 1, "em": 1, "%": 1},
1303
    "left": {"px": 1, "em": 1, "%": 1},
1304
    "letter-spacing": {"normal": 1},
1305
    "line-height": {"normal": 1},
1306
    "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1},
1307
    "margin": {"px": 1, "em": 1, "%": 1},
1308
    "margin-right": {"px": 1, "em": 1, "%": 1},
1309
    "margin-left": {"px": 1, "em": 1, "%": 1},
1310
    "margin-top": {"px": 1, "em": 1, "%": 1},
1311
    "margin-bottom": {"px": 1, "em": 1, "%": 1},
1312
    "max-height": {"px": 1, "em": 1, "%": 1},
1313
    "max-width": {"px": 1, "em": 1, "%": 1},
1314
    "min-height": {"px": 1, "em": 1, "%": 1},
1315
    "min-width": {"px": 1, "em": 1, "%": 1},
1316
    "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
1317
    "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
1318
    "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
1319
    "padding": {"px": 1, "em": 1, "%": 1},
1320
    "padding-top": {"px": 1, "em": 1, "%": 1},
1321
    "padding-right": {"px": 1, "em": 1, "%": 1},
1322
    "padding-bottom": {"px": 1, "em": 1, "%": 1},
1323
    "padding-left": {"px": 1, "em": 1, "%": 1},
1324
    "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1},
1325
    "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1},
1326
    "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1},
1327
    "right": {"px": 1, "em": 1, "%": 1},
1328
    "table-layout": {"fixed": 1, "auto": 1},
1329
    "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1},
1330
    "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1},
1331
    "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1},
1332
    "top": {"px": 1, "em": 1, "%": 1},
1333
    "vertical-align": {"top": 1, "bottom": 1},
1334
    "visibility": {"hidden": 1, "visible": 1},
1335
    "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1},
1336
    "width": {"px": 1, "em": 1, "%": 1},
1337
    "word-spacing": {"normal": 1},
1338
    "filter": {"alpha(opacity=$0100)": 1},
1339

    
1340
    "text-shadow": {"$02px 2px 2px #777": 1},
1341
    "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1},
1342
    "-moz-border-radius": 1,
1343
    "-moz-border-radius-topright": 1,
1344
    "-moz-border-radius-bottomright": 1,
1345
    "-moz-border-radius-topleft": 1,
1346
    "-moz-border-radius-bottomleft": 1,
1347
    "-webkit-border-radius": 1,
1348
    "-webkit-border-top-right-radius": 1,
1349
    "-webkit-border-top-left-radius": 1,
1350
    "-webkit-border-bottom-right-radius": 1,
1351
    "-webkit-border-bottom-left-radius": 1,
1352
    "-moz-box-shadow": 1,
1353
    "-webkit-box-shadow": 1,
1354
    "transform": {"rotate($00deg)": 1, "skew($00deg)": 1},
1355
    "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1},
1356
    "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 }
1357
};
1358

    
1359
var CssCompletions = function() {
1360

    
1361
};
1362

    
1363
(function() {
1364

    
1365
    this.completionsDefined = false;
1366

    
1367
    this.defineCompletions = function() {
1368
        if (document) {
1369
            var style = document.createElement('c').style;
1370

    
1371
            for (var i in style) {
1372
                if (typeof style[i] !== 'string')
1373
                    continue;
1374

    
1375
                var name = i.replace(/[A-Z]/g, function(x) {
1376
                    return '-' + x.toLowerCase();
1377
                });
1378

    
1379
                if (!propertyMap.hasOwnProperty(name))
1380
                    propertyMap[name] = 1;
1381
            }
1382
        }
1383

    
1384
        this.completionsDefined = true;
1385
    };
1386

    
1387
    this.getCompletions = function(state, session, pos, prefix) {
1388
        if (!this.completionsDefined) {
1389
            this.defineCompletions();
1390
        }
1391

    
1392
        if (state==='ruleset' || session.$mode.$id == "ace/mode/scss") {
1393
            var line = session.getLine(pos.row).substr(0, pos.column);
1394
            if (/:[^;]+$/.test(line)) {
1395
                /([\w\-]+):[^:]*$/.test(line);
1396

    
1397
                return this.getPropertyValueCompletions(state, session, pos, prefix);
1398
            } else {
1399
                return this.getPropertyCompletions(state, session, pos, prefix);
1400
            }
1401
        }
1402

    
1403
        return [];
1404
    };
1405

    
1406
    this.getPropertyCompletions = function(state, session, pos, prefix) {
1407
        var properties = Object.keys(propertyMap);
1408
        return properties.map(function(property){
1409
            return {
1410
                caption: property,
1411
                snippet: property + ': $0;',
1412
                meta: "property",
1413
                score: 1000000
1414
            };
1415
        });
1416
    };
1417

    
1418
    this.getPropertyValueCompletions = function(state, session, pos, prefix) {
1419
        var line = session.getLine(pos.row).substr(0, pos.column);
1420
        var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1];
1421

    
1422
        if (!property)
1423
            return [];
1424
        var values = [];
1425
        if (property in propertyMap && typeof propertyMap[property] === "object") {
1426
            values = Object.keys(propertyMap[property]);
1427
        }
1428
        return values.map(function(value){
1429
            return {
1430
                caption: value,
1431
                snippet: value,
1432
                meta: "property value",
1433
                score: 1000000
1434
            };
1435
        });
1436
    };
1437

    
1438
}).call(CssCompletions.prototype);
1439

    
1440
exports.CssCompletions = CssCompletions;
1441
});
1442

    
1443
ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) {
1444
"use strict";
1445

    
1446
var oop = require("../../lib/oop");
1447
var Behaviour = require("../behaviour").Behaviour;
1448
var CstyleBehaviour = require("./cstyle").CstyleBehaviour;
1449
var TokenIterator = require("../../token_iterator").TokenIterator;
1450

    
1451
var CssBehaviour = function () {
1452

    
1453
    this.inherit(CstyleBehaviour);
1454

    
1455
    this.add("colon", "insertion", function (state, action, editor, session, text) {
1456
        if (text === ':' && editor.selection.isEmpty()) {
1457
            var cursor = editor.getCursorPosition();
1458
            var iterator = new TokenIterator(session, cursor.row, cursor.column);
1459
            var token = iterator.getCurrentToken();
1460
            if (token && token.value.match(/\s+/)) {
1461
                token = iterator.stepBackward();
1462
            }
1463
            if (token && token.type === 'support.type') {
1464
                var line = session.doc.getLine(cursor.row);
1465
                var rightChar = line.substring(cursor.column, cursor.column + 1);
1466
                if (rightChar === ':') {
1467
                    return {
1468
                       text: '',
1469
                       selection: [1, 1]
1470
                    };
1471
                }
1472
                if (/^(\s+[^;]|\s*$)/.test(line.substring(cursor.column))) {
1473
                    return {
1474
                       text: ':;',
1475
                       selection: [1, 1]
1476
                    };
1477
                }
1478
            }
1479
        }
1480
    });
1481

    
1482
    this.add("colon", "deletion", function (state, action, editor, session, range) {
1483
        var selected = session.doc.getTextRange(range);
1484
        if (!range.isMultiLine() && selected === ':') {
1485
            var cursor = editor.getCursorPosition();
1486
            var iterator = new TokenIterator(session, cursor.row, cursor.column);
1487
            var token = iterator.getCurrentToken();
1488
            if (token && token.value.match(/\s+/)) {
1489
                token = iterator.stepBackward();
1490
            }
1491
            if (token && token.type === 'support.type') {
1492
                var line = session.doc.getLine(range.start.row);
1493
                var rightChar = line.substring(range.end.column, range.end.column + 1);
1494
                if (rightChar === ';') {
1495
                    range.end.column ++;
1496
                    return range;
1497
                }
1498
            }
1499
        }
1500
    });
1501

    
1502
    this.add("semicolon", "insertion", function (state, action, editor, session, text) {
1503
        if (text === ';' && editor.selection.isEmpty()) {
1504
            var cursor = editor.getCursorPosition();
1505
            var line = session.doc.getLine(cursor.row);
1506
            var rightChar = line.substring(cursor.column, cursor.column + 1);
1507
            if (rightChar === ';') {
1508
                return {
1509
                   text: '',
1510
                   selection: [1, 1]
1511
                };
1512
            }
1513
        }
1514
    });
1515

    
1516
    this.add("!important", "insertion", function (state, action, editor, session, text) {
1517
        if (text === '!' && editor.selection.isEmpty()) {
1518
            var cursor = editor.getCursorPosition();
1519
            var line = session.doc.getLine(cursor.row);
1520

    
1521
            if (/^\s*(;|}|$)/.test(line.substring(cursor.column))) {
1522
                return {
1523
                    text: '!important',
1524
                    selection: [10, 10]
1525
                };
1526
            }
1527
        }
1528
    });
1529

    
1530
};
1531
oop.inherits(CssBehaviour, CstyleBehaviour);
1532

    
1533
exports.CssBehaviour = CssBehaviour;
1534
});
1535

    
1536
ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) {
1537
"use strict";
1538

    
1539
var oop = require("../lib/oop");
1540
var TextMode = require("./text").Mode;
1541
var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;
1542
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
1543
var WorkerClient = require("../worker/worker_client").WorkerClient;
1544
var CssCompletions = require("./css_completions").CssCompletions;
1545
var CssBehaviour = require("./behaviour/css").CssBehaviour;
1546
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
1547

    
1548
var Mode = function() {
1549
    this.HighlightRules = CssHighlightRules;
1550
    this.$outdent = new MatchingBraceOutdent();
1551
    this.$behaviour = new CssBehaviour();
1552
    this.$completer = new CssCompletions();
1553
    this.foldingRules = new CStyleFoldMode();
1554
};
1555
oop.inherits(Mode, TextMode);
1556

    
1557
(function() {
1558

    
1559
    this.foldingRules = "cStyle";
1560
    this.blockComment = {start: "/*", end: "*/"};
1561

    
1562
    this.getNextLineIndent = function(state, line, tab) {
1563
        var indent = this.$getIndent(line);
1564
        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;
1565
        if (tokens.length && tokens[tokens.length-1].type == "comment") {
1566
            return indent;
1567
        }
1568

    
1569
        var match = line.match(/^.*\{\s*$/);
1570
        if (match) {
1571
            indent += tab;
1572
        }
1573

    
1574
        return indent;
1575
    };
1576

    
1577
    this.checkOutdent = function(state, line, input) {
1578
        return this.$outdent.checkOutdent(line, input);
1579
    };
1580

    
1581
    this.autoOutdent = function(state, doc, row) {
1582
        this.$outdent.autoOutdent(doc, row);
1583
    };
1584

    
1585
    this.getCompletions = function(state, session, pos, prefix) {
1586
        return this.$completer.getCompletions(state, session, pos, prefix);
1587
    };
1588

    
1589
    this.createWorker = function(session) {
1590
        var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker");
1591
        worker.attachToDocument(session.getDocument());
1592

    
1593
        worker.on("annotate", function(e) {
1594
            session.setAnnotations(e.data);
1595
        });
1596

    
1597
        worker.on("terminate", function() {
1598
            session.clearAnnotations();
1599
        });
1600

    
1601
        return worker;
1602
    };
1603

    
1604
    this.$id = "ace/mode/css";
1605
    this.snippetFileId = "ace/snippets/css";
1606
}).call(Mode.prototype);
1607

    
1608
exports.Mode = Mode;
1609

    
1610
});
1611

    
1612
ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) {
1613
"use strict";
1614

    
1615
var oop = require("../../lib/oop");
1616
var Behaviour = require("../behaviour").Behaviour;
1617
var TokenIterator = require("../../token_iterator").TokenIterator;
1618
var lang = require("../../lib/lang");
1619

    
1620
function is(token, type) {
1621
    return token && token.type.lastIndexOf(type + ".xml") > -1;
1622
}
1623

    
1624
var XmlBehaviour = function () {
1625

    
1626
    this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {
1627
        if (text == '"' || text == "'") {
1628
            var quote = text;
1629
            var selected = session.doc.getTextRange(editor.getSelectionRange());
1630
            if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) {
1631
                return {
1632
                    text: quote + selected + quote,
1633
                    selection: false
1634
                };
1635
            }
1636

    
1637
            var cursor = editor.getCursorPosition();
1638
            var line = session.doc.getLine(cursor.row);
1639
            var rightChar = line.substring(cursor.column, cursor.column + 1);
1640
            var iterator = new TokenIterator(session, cursor.row, cursor.column);
1641
            var token = iterator.getCurrentToken();
1642

    
1643
            if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) {
1644
                return {
1645
                    text: "",
1646
                    selection: [1, 1]
1647
                };
1648
            }
1649

    
1650
            if (!token)
1651
                token = iterator.stepBackward();
1652

    
1653
            if (!token)
1654
                return;
1655

    
1656
            while (is(token, "tag-whitespace") || is(token, "whitespace")) {
1657
                token = iterator.stepBackward();
1658
            }
1659
            var rightSpace = !rightChar || rightChar.match(/\s/);
1660
            if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) {
1661
                return {
1662
                    text: quote + quote,
1663
                    selection: [1, 1]
1664
                };
1665
            }
1666
        }
1667
    });
1668

    
1669
    this.add("string_dquotes", "deletion", function(state, action, editor, session, range) {
1670
        var selected = session.doc.getTextRange(range);
1671
        if (!range.isMultiLine() && (selected == '"' || selected == "'")) {
1672
            var line = session.doc.getLine(range.start.row);
1673
            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
1674
            if (rightChar == selected) {
1675
                range.end.column++;
1676
                return range;
1677
            }
1678
        }
1679
    });
1680

    
1681
    this.add("autoclosing", "insertion", function (state, action, editor, session, text) {
1682
        if (text == '>') {
1683
            var position = editor.getSelectionRange().start;
1684
            var iterator = new TokenIterator(session, position.row, position.column);
1685
            var token = iterator.getCurrentToken() || iterator.stepBackward();
1686
            if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value")))
1687
                return;
1688
            if (is(token, "reference.attribute-value"))
1689
                return;
1690
            if (is(token, "attribute-value")) {
1691
                var tokenEndColumn = iterator.getCurrentTokenColumn() + token.value.length;
1692
                if (position.column < tokenEndColumn)
1693
                    return;
1694
                if (position.column == tokenEndColumn) {
1695
                    var nextToken = iterator.stepForward();
1696
                    if (nextToken && is(nextToken, "attribute-value"))
1697
                        return;
1698
                    iterator.stepBackward();
1699
                }
1700
            }
1701
            
1702
            if (/^\s*>/.test(session.getLine(position.row).slice(position.column)))
1703
                return;
1704
            while (!is(token, "tag-name")) {
1705
                token = iterator.stepBackward();
1706
                if (token.value == "<") {
1707
                    token = iterator.stepForward();
1708
                    break;
1709
                }
1710
            }
1711

    
1712
            var tokenRow = iterator.getCurrentTokenRow();
1713
            var tokenColumn = iterator.getCurrentTokenColumn();
1714
            if (is(iterator.stepBackward(), "end-tag-open"))
1715
                return;
1716

    
1717
            var element = token.value;
1718
            if (tokenRow == position.row)
1719
                element = element.substring(0, position.column - tokenColumn);
1720

    
1721
            if (this.voidElements.hasOwnProperty(element.toLowerCase()))
1722
                 return;
1723

    
1724
            return {
1725
               text: ">" + "</" + element + ">",
1726
               selection: [1, 1]
1727
            };
1728
        }
1729
    });
1730

    
1731
    this.add("autoindent", "insertion", function (state, action, editor, session, text) {
1732
        if (text == "\n") {
1733
            var cursor = editor.getCursorPosition();
1734
            var line = session.getLine(cursor.row);
1735
            var iterator = new TokenIterator(session, cursor.row, cursor.column);
1736
            var token = iterator.getCurrentToken();
1737

    
1738
            if (token && token.type.indexOf("tag-close") !== -1) {
1739
                if (token.value == "/>")
1740
                    return;
1741
                while (token && token.type.indexOf("tag-name") === -1) {
1742
                    token = iterator.stepBackward();
1743
                }
1744

    
1745
                if (!token) {
1746
                    return;
1747
                }
1748

    
1749
                var tag = token.value;
1750
                var row = iterator.getCurrentTokenRow();
1751
                token = iterator.stepBackward();
1752
                if (!token || token.type.indexOf("end-tag") !== -1) {
1753
                    return;
1754
                }
1755

    
1756
                if (this.voidElements && !this.voidElements[tag]) {
1757
                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);
1758
                    var line = session.getLine(row);
1759
                    var nextIndent = this.$getIndent(line);
1760
                    var indent = nextIndent + session.getTabString();
1761

    
1762
                    if (nextToken && nextToken.value === "</") {
1763
                        return {
1764
                            text: "\n" + indent + "\n" + nextIndent,
1765
                            selection: [1, indent.length, 1, indent.length]
1766
                        };
1767
                    } else {
1768
                        return {
1769
                            text: "\n" + indent
1770
                        };
1771
                    }
1772
                }
1773
            }
1774
        }
1775
    });
1776

    
1777
};
1778

    
1779
oop.inherits(XmlBehaviour, Behaviour);
1780

    
1781
exports.XmlBehaviour = XmlBehaviour;
1782
});
1783

    
1784
ace.define("ace/mode/folding/mixed",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"], function(require, exports, module) {
1785
"use strict";
1786

    
1787
var oop = require("../../lib/oop");
1788
var BaseFoldMode = require("./fold_mode").FoldMode;
1789

    
1790
var FoldMode = exports.FoldMode = function(defaultMode, subModes) {
1791
    this.defaultMode = defaultMode;
1792
    this.subModes = subModes;
1793
};
1794
oop.inherits(FoldMode, BaseFoldMode);
1795

    
1796
(function() {
1797

    
1798

    
1799
    this.$getMode = function(state) {
1800
        if (typeof state != "string") 
1801
            state = state[0];
1802
        for (var key in this.subModes) {
1803
            if (state.indexOf(key) === 0)
1804
                return this.subModes[key];
1805
        }
1806
        return null;
1807
    };
1808
    
1809
    this.$tryMode = function(state, session, foldStyle, row) {
1810
        var mode = this.$getMode(state);
1811
        return (mode ? mode.getFoldWidget(session, foldStyle, row) : "");
1812
    };
1813

    
1814
    this.getFoldWidget = function(session, foldStyle, row) {
1815
        return (
1816
            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||
1817
            this.$tryMode(session.getState(row), session, foldStyle, row) ||
1818
            this.defaultMode.getFoldWidget(session, foldStyle, row)
1819
        );
1820
    };
1821

    
1822
    this.getFoldWidgetRange = function(session, foldStyle, row) {
1823
        var mode = this.$getMode(session.getState(row-1));
1824
        
1825
        if (!mode || !mode.getFoldWidget(session, foldStyle, row))
1826
            mode = this.$getMode(session.getState(row));
1827
        
1828
        if (!mode || !mode.getFoldWidget(session, foldStyle, row))
1829
            mode = this.defaultMode;
1830
        
1831
        return mode.getFoldWidgetRange(session, foldStyle, row);
1832
    };
1833

    
1834
}).call(FoldMode.prototype);
1835

    
1836
});
1837

    
1838
ace.define("ace/mode/folding/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/range","ace/mode/folding/fold_mode","ace/token_iterator"], function(require, exports, module) {
1839
"use strict";
1840

    
1841
var oop = require("../../lib/oop");
1842
var lang = require("../../lib/lang");
1843
var Range = require("../../range").Range;
1844
var BaseFoldMode = require("./fold_mode").FoldMode;
1845
var TokenIterator = require("../../token_iterator").TokenIterator;
1846

    
1847
var FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {
1848
    BaseFoldMode.call(this);
1849
    this.voidElements = voidElements || {};
1850
    this.optionalEndTags = oop.mixin({}, this.voidElements);
1851
    if (optionalEndTags)
1852
        oop.mixin(this.optionalEndTags, optionalEndTags);
1853
    
1854
};
1855
oop.inherits(FoldMode, BaseFoldMode);
1856

    
1857
var Tag = function() {
1858
    this.tagName = "";
1859
    this.closing = false;
1860
    this.selfClosing = false;
1861
    this.start = {row: 0, column: 0};
1862
    this.end = {row: 0, column: 0};
1863
};
1864

    
1865
function is(token, type) {
1866
    return token.type.lastIndexOf(type + ".xml") > -1;
1867
}
1868

    
1869
(function() {
1870

    
1871
    this.getFoldWidget = function(session, foldStyle, row) {
1872
        var tag = this._getFirstTagInLine(session, row);
1873

    
1874
        if (!tag)
1875
            return this.getCommentFoldWidget(session, row);
1876

    
1877
        if (tag.closing || (!tag.tagName && tag.selfClosing))
1878
            return foldStyle == "markbeginend" ? "end" : "";
1879

    
1880
        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))
1881
            return "";
1882

    
1883
        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))
1884
            return "";
1885

    
1886
        return "start";
1887
    };
1888
    
1889
    this.getCommentFoldWidget = function(session, row) {
1890
        if (/comment/.test(session.getState(row)) && /<!-/.test(session.getLine(row)))
1891
            return "start";
1892
        return "";
1893
    };
1894
    this._getFirstTagInLine = function(session, row) {
1895
        var tokens = session.getTokens(row);
1896
        var tag = new Tag();
1897

    
1898
        for (var i = 0; i < tokens.length; i++) {
1899
            var token = tokens[i];
1900
            if (is(token, "tag-open")) {
1901
                tag.end.column = tag.start.column + token.value.length;
1902
                tag.closing = is(token, "end-tag-open");
1903
                token = tokens[++i];
1904
                if (!token)
1905
                    return null;
1906
                tag.tagName = token.value;
1907
                tag.end.column += token.value.length;
1908
                for (i++; i < tokens.length; i++) {
1909
                    token = tokens[i];
1910
                    tag.end.column += token.value.length;
1911
                    if (is(token, "tag-close")) {
1912
                        tag.selfClosing = token.value == '/>';
1913
                        break;
1914
                    }
1915
                }
1916
                return tag;
1917
            } else if (is(token, "tag-close")) {
1918
                tag.selfClosing = token.value == '/>';
1919
                return tag;
1920
            }
1921
            tag.start.column += token.value.length;
1922
        }
1923

    
1924
        return null;
1925
    };
1926

    
1927
    this._findEndTagInLine = function(session, row, tagName, startColumn) {
1928
        var tokens = session.getTokens(row);
1929
        var column = 0;
1930
        for (var i = 0; i < tokens.length; i++) {
1931
            var token = tokens[i];
1932
            column += token.value.length;
1933
            if (column < startColumn)
1934
                continue;
1935
            if (is(token, "end-tag-open")) {
1936
                token = tokens[i + 1];
1937
                if (token && token.value == tagName)
1938
                    return true;
1939
            }
1940
        }
1941
        return false;
1942
    };
1943
    this._readTagForward = function(iterator) {
1944
        var token = iterator.getCurrentToken();
1945
        if (!token)
1946
            return null;
1947

    
1948
        var tag = new Tag();
1949
        do {
1950
            if (is(token, "tag-open")) {
1951
                tag.closing = is(token, "end-tag-open");
1952
                tag.start.row = iterator.getCurrentTokenRow();
1953
                tag.start.column = iterator.getCurrentTokenColumn();
1954
            } else if (is(token, "tag-name")) {
1955
                tag.tagName = token.value;
1956
            } else if (is(token, "tag-close")) {
1957
                tag.selfClosing = token.value == "/>";
1958
                tag.end.row = iterator.getCurrentTokenRow();
1959
                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;
1960
                iterator.stepForward();
1961
                return tag;
1962
            }
1963
        } while(token = iterator.stepForward());
1964

    
1965
        return null;
1966
    };
1967
    
1968
    this._readTagBackward = function(iterator) {
1969
        var token = iterator.getCurrentToken();
1970
        if (!token)
1971
            return null;
1972

    
1973
        var tag = new Tag();
1974
        do {
1975
            if (is(token, "tag-open")) {
1976
                tag.closing = is(token, "end-tag-open");
1977
                tag.start.row = iterator.getCurrentTokenRow();
1978
                tag.start.column = iterator.getCurrentTokenColumn();
1979
                iterator.stepBackward();
1980
                return tag;
1981
            } else if (is(token, "tag-name")) {
1982
                tag.tagName = token.value;
1983
            } else if (is(token, "tag-close")) {
1984
                tag.selfClosing = token.value == "/>";
1985
                tag.end.row = iterator.getCurrentTokenRow();
1986
                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;
1987
            }
1988
        } while(token = iterator.stepBackward());
1989

    
1990
        return null;
1991
    };
1992
    
1993
    this._pop = function(stack, tag) {
1994
        while (stack.length) {
1995
            
1996
            var top = stack[stack.length-1];
1997
            if (!tag || top.tagName == tag.tagName) {
1998
                return stack.pop();
1999
            }
2000
            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {
2001
                stack.pop();
2002
                continue;
2003
            } else {
2004
                return null;
2005
            }
2006
        }
2007
    };
2008
    
2009
    this.getFoldWidgetRange = function(session, foldStyle, row) {
2010
        var firstTag = this._getFirstTagInLine(session, row);
2011
        
2012
        if (!firstTag) {
2013
            return this.getCommentFoldWidget(session, row)
2014
                && session.getCommentFoldRange(row, session.getLine(row).length);
2015
        }
2016
        
2017
        var isBackward = firstTag.closing || firstTag.selfClosing;
2018
        var stack = [];
2019
        var tag;
2020
        
2021
        if (!isBackward) {
2022
            var iterator = new TokenIterator(session, row, firstTag.start.column);
2023
            var start = {
2024
                row: row,
2025
                column: firstTag.start.column + firstTag.tagName.length + 2
2026
            };
2027
            if (firstTag.start.row == firstTag.end.row)
2028
                start.column = firstTag.end.column;
2029
            while (tag = this._readTagForward(iterator)) {
2030
                if (tag.selfClosing) {
2031
                    if (!stack.length) {
2032
                        tag.start.column += tag.tagName.length + 2;
2033
                        tag.end.column -= 2;
2034
                        return Range.fromPoints(tag.start, tag.end);
2035
                    } else
2036
                        continue;
2037
                }
2038
                
2039
                if (tag.closing) {
2040
                    this._pop(stack, tag);
2041
                    if (stack.length == 0)
2042
                        return Range.fromPoints(start, tag.start);
2043
                }
2044
                else {
2045
                    stack.push(tag);
2046
                }
2047
            }
2048
        }
2049
        else {
2050
            var iterator = new TokenIterator(session, row, firstTag.end.column);
2051
            var end = {
2052
                row: row,
2053
                column: firstTag.start.column
2054
            };
2055
            
2056
            while (tag = this._readTagBackward(iterator)) {
2057
                if (tag.selfClosing) {
2058
                    if (!stack.length) {
2059
                        tag.start.column += tag.tagName.length + 2;
2060
                        tag.end.column -= 2;
2061
                        return Range.fromPoints(tag.start, tag.end);
2062
                    } else
2063
                        continue;
2064
                }
2065
                
2066
                if (!tag.closing) {
2067
                    this._pop(stack, tag);
2068
                    if (stack.length == 0) {
2069
                        tag.start.column += tag.tagName.length + 2;
2070
                        if (tag.start.row == tag.end.row && tag.start.column < tag.end.column)
2071
                            tag.start.column = tag.end.column;
2072
                        return Range.fromPoints(tag.start, end);
2073
                    }
2074
                }
2075
                else {
2076
                    stack.push(tag);
2077
                }
2078
            }
2079
        }
2080
        
2081
    };
2082

    
2083
}).call(FoldMode.prototype);
2084

    
2085
});
2086

    
2087
ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) {
2088
"use strict";
2089

    
2090
var oop = require("../../lib/oop");
2091
var MixedFoldMode = require("./mixed").FoldMode;
2092
var XmlFoldMode = require("./xml").FoldMode;
2093
var CStyleFoldMode = require("./cstyle").FoldMode;
2094

    
2095
var FoldMode = exports.FoldMode = function(voidElements, optionalTags) {
2096
    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {
2097
        "js-": new CStyleFoldMode(),
2098
        "css-": new CStyleFoldMode()
2099
    });
2100
};
2101

    
2102
oop.inherits(FoldMode, MixedFoldMode);
2103

    
2104
});
2105

    
2106
ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) {
2107
"use strict";
2108

    
2109
var TokenIterator = require("../token_iterator").TokenIterator;
2110

    
2111
var commonAttributes = [
2112
    "accesskey",
2113
    "class",
2114
    "contenteditable",
2115
    "contextmenu",
2116
    "dir",
2117
    "draggable",
2118
    "dropzone",
2119
    "hidden",
2120
    "id",
2121
    "inert",
2122
    "itemid",
2123
    "itemprop",
2124
    "itemref",
2125
    "itemscope",
2126
    "itemtype",
2127
    "lang",
2128
    "spellcheck",
2129
    "style",
2130
    "tabindex",
2131
    "title",
2132
    "translate"
2133
];
2134

    
2135
var eventAttributes = [
2136
    "onabort",
2137
    "onblur",
2138
    "oncancel",
2139
    "oncanplay",
2140
    "oncanplaythrough",
2141
    "onchange",
2142
    "onclick",
2143
    "onclose",
2144
    "oncontextmenu",
2145
    "oncuechange",
2146
    "ondblclick",
2147
    "ondrag",
2148
    "ondragend",
2149
    "ondragenter",
2150
    "ondragleave",
2151
    "ondragover",
2152
    "ondragstart",
2153
    "ondrop",
2154
    "ondurationchange",
2155
    "onemptied",
2156
    "onended",
2157
    "onerror",
2158
    "onfocus",
2159
    "oninput",
2160
    "oninvalid",
2161
    "onkeydown",
2162
    "onkeypress",
2163
    "onkeyup",
2164
    "onload",
2165
    "onloadeddata",
2166
    "onloadedmetadata",
2167
    "onloadstart",
2168
    "onmousedown",
2169
    "onmousemove",
2170
    "onmouseout",
2171
    "onmouseover",
2172
    "onmouseup",
2173
    "onmousewheel",
2174
    "onpause",
2175
    "onplay",
2176
    "onplaying",
2177
    "onprogress",
2178
    "onratechange",
2179
    "onreset",
2180
    "onscroll",
2181
    "onseeked",
2182
    "onseeking",
2183
    "onselect",
2184
    "onshow",
2185
    "onstalled",
2186
    "onsubmit",
2187
    "onsuspend",
2188
    "ontimeupdate",
2189
    "onvolumechange",
2190
    "onwaiting"
2191
];
2192

    
2193
var globalAttributes = commonAttributes.concat(eventAttributes);
2194

    
2195
var attributeMap = {
2196
    "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1},
2197
    "abbr": {},
2198
    "address": {},
2199
    "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1},
2200
    "article": {"pubdate": 1},
2201
    "aside": {},
2202
    "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }},
2203
    "b": {},
2204
    "base": {"href": 1, "target": 1},
2205
    "bdi": {},
2206
    "bdo": {},
2207
    "blockquote": {"cite": 1},
2208
    "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1},
2209
    "br": {},
2210
    "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}},
2211
    "canvas": {"width": 1, "height": 1},
2212
    "caption": {},
2213
    "cite": {},
2214
    "code": {},
2215
    "col": {"span": 1},
2216
    "colgroup": {"span": 1},
2217
    "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1},
2218
    "data": {},
2219
    "datalist": {},
2220
    "dd": {},
2221
    "del": {"cite": 1, "datetime": 1},
2222
    "details": {"open": 1},
2223
    "dfn": {},
2224
    "dialog": {"open": 1},
2225
    "div": {},
2226
    "dl": {},
2227
    "dt": {},
2228
    "em": {},
2229
    "embed": {"src": 1, "height": 1, "width": 1, "type": 1},
2230
    "fieldset": {"disabled": 1, "form": 1, "name": 1},
2231
    "figcaption": {},
2232
    "figure": {},
2233
    "footer": {},
2234
    "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}},
2235
    "h1": {},
2236
    "h2": {},
2237
    "h3": {},
2238
    "h4": {},
2239
    "h5": {},
2240
    "h6": {},
2241
    "head": {},
2242
    "header": {},
2243
    "hr": {},
2244
    "html": {"manifest": 1},
2245
    "i": {},
2246
    "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}},
2247
    "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1},
2248
    "input": {
2249
        "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1},
2250
        "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1},
2251
    "ins": {"cite": 1, "datetime": 1},
2252
    "kbd": {},
2253
    "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1},
2254
    "label": {"form": 1, "for": 1},
2255
    "legend": {},
2256
    "li": {"value": 1},
2257
    "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1},
2258
    "main": {},
2259
    "map": {"name": 1},
2260
    "mark": {},
2261
    "math": {},
2262
    "menu": {"type": 1, "label": 1},
2263
    "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1},
2264
    "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1},
2265
    "nav": {},
2266
    "noscript": {"href": 1},
2267
    "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1},
2268
    "ol": {"start": 1, "reversed": 1},
2269
    "optgroup": {"disabled": 1, "label": 1},
2270
    "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1},
2271
    "output": {"for": 1, "form": 1, "name": 1},
2272
    "p": {},
2273
    "param": {"name": 1, "value": 1},
2274
    "pre": {},
2275
    "progress": {"value": 1, "max": 1},
2276
    "q": {"cite": 1},
2277
    "rp": {},
2278
    "rt": {},
2279
    "ruby": {},
2280
    "s": {},
2281
    "samp": {},
2282
    "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1},
2283
    "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}},
2284
    "small": {},
2285
    "source": {"src": 1, "type": 1, "media": 1},
2286
    "span": {},
2287
    "strong": {},
2288
    "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1},
2289
    "sub": {},
2290
    "sup": {},
2291
    "svg": {},
2292
    "table": {"summary": 1},
2293
    "tbody": {},
2294
    "td": {"headers": 1, "rowspan": 1, "colspan": 1},
2295
    "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}},
2296
    "tfoot": {},
2297
    "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1},
2298
    "thead": {},
2299
    "time": {"datetime": 1},
2300
    "title": {},
2301
    "tr": {},
2302
    "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1},
2303
    "section": {},
2304
    "summary": {},
2305
    "u": {},
2306
    "ul": {},
2307
    "var": {},
2308
    "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}},
2309
    "wbr": {}
2310
};
2311

    
2312
var elements = Object.keys(attributeMap);
2313

    
2314
function is(token, type) {
2315
    return token.type.lastIndexOf(type + ".xml") > -1;
2316
}
2317

    
2318
function findTagName(session, pos) {
2319
    var iterator = new TokenIterator(session, pos.row, pos.column);
2320
    var token = iterator.getCurrentToken();
2321
    while (token && !is(token, "tag-name")){
2322
        token = iterator.stepBackward();
2323
    }
2324
    if (token)
2325
        return token.value;
2326
}
2327

    
2328
function findAttributeName(session, pos) {
2329
    var iterator = new TokenIterator(session, pos.row, pos.column);
2330
    var token = iterator.getCurrentToken();
2331
    while (token && !is(token, "attribute-name")){
2332
        token = iterator.stepBackward();
2333
    }
2334
    if (token)
2335
        return token.value;
2336
}
2337

    
2338
var HtmlCompletions = function() {
2339

    
2340
};
2341

    
2342
(function() {
2343

    
2344
    this.getCompletions = function(state, session, pos, prefix) {
2345
        var token = session.getTokenAt(pos.row, pos.column);
2346

    
2347
        if (!token)
2348
            return [];
2349
        if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open"))
2350
            return this.getTagCompletions(state, session, pos, prefix);
2351
        if (is(token, "tag-whitespace") || is(token, "attribute-name"))
2352
            return this.getAttributeCompletions(state, session, pos, prefix);
2353
        if (is(token, "attribute-value"))
2354
            return this.getAttributeValueCompletions(state, session, pos, prefix);
2355
        var line = session.getLine(pos.row).substr(0, pos.column);
2356
        if (/&[a-z]*$/i.test(line))
2357
            return this.getHTMLEntityCompletions(state, session, pos, prefix);
2358

    
2359
        return [];
2360
    };
2361

    
2362
    this.getTagCompletions = function(state, session, pos, prefix) {
2363
        return elements.map(function(element){
2364
            return {
2365
                value: element,
2366
                meta: "tag",
2367
                score: 1000000
2368
            };
2369
        });
2370
    };
2371

    
2372
    this.getAttributeCompletions = function(state, session, pos, prefix) {
2373
        var tagName = findTagName(session, pos);
2374
        if (!tagName)
2375
            return [];
2376
        var attributes = globalAttributes;
2377
        if (tagName in attributeMap) {
2378
            attributes = attributes.concat(Object.keys(attributeMap[tagName]));
2379
        }
2380
        return attributes.map(function(attribute){
2381
            return {
2382
                caption: attribute,
2383
                snippet: attribute + '="$0"',
2384
                meta: "attribute",
2385
                score: 1000000
2386
            };
2387
        });
2388
    };
2389

    
2390
    this.getAttributeValueCompletions = function(state, session, pos, prefix) {
2391
        var tagName = findTagName(session, pos);
2392
        var attributeName = findAttributeName(session, pos);
2393
        
2394
        if (!tagName)
2395
            return [];
2396
        var values = [];
2397
        if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") {
2398
            values = Object.keys(attributeMap[tagName][attributeName]);
2399
        }
2400
        return values.map(function(value){
2401
            return {
2402
                caption: value,
2403
                snippet: value,
2404
                meta: "attribute value",
2405
                score: 1000000
2406
            };
2407
        });
2408
    };
2409

    
2410
    this.getHTMLEntityCompletions = function(state, session, pos, prefix) {
2411
        var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;'];
2412

    
2413
        return values.map(function(value){
2414
            return {
2415
                caption: value,
2416
                snippet: value,
2417
                meta: "html entity",
2418
                score: 1000000
2419
            };
2420
        });
2421
    };
2422

    
2423
}).call(HtmlCompletions.prototype);
2424

    
2425
exports.HtmlCompletions = HtmlCompletions;
2426
});
2427

    
2428
ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) {
2429
"use strict";
2430

    
2431
var oop = require("../lib/oop");
2432
var lang = require("../lib/lang");
2433
var TextMode = require("./text").Mode;
2434
var JavaScriptMode = require("./javascript").Mode;
2435
var CssMode = require("./css").Mode;
2436
var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;
2437
var XmlBehaviour = require("./behaviour/xml").XmlBehaviour;
2438
var HtmlFoldMode = require("./folding/html").FoldMode;
2439
var HtmlCompletions = require("./html_completions").HtmlCompletions;
2440
var WorkerClient = require("../worker/worker_client").WorkerClient;
2441
var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"];
2442
var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"];
2443

    
2444
var Mode = function(options) {
2445
    this.fragmentContext = options && options.fragmentContext;
2446
    this.HighlightRules = HtmlHighlightRules;
2447
    this.$behaviour = new XmlBehaviour();
2448
    this.$completer = new HtmlCompletions();
2449
    
2450
    this.createModeDelegates({
2451
        "js-": JavaScriptMode,
2452
        "css-": CssMode
2453
    });
2454
    
2455
    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));
2456
};
2457
oop.inherits(Mode, TextMode);
2458

    
2459
(function() {
2460

    
2461
    this.blockComment = {start: "<!--", end: "-->"};
2462

    
2463
    this.voidElements = lang.arrayToMap(voidElements);
2464

    
2465
    this.getNextLineIndent = function(state, line, tab) {
2466
        return this.$getIndent(line);
2467
    };
2468

    
2469
    this.checkOutdent = function(state, line, input) {
2470
        return false;
2471
    };
2472

    
2473
    this.getCompletions = function(state, session, pos, prefix) {
2474
        return this.$completer.getCompletions(state, session, pos, prefix);
2475
    };
2476

    
2477
    this.createWorker = function(session) {
2478
        if (this.constructor != Mode)
2479
            return;
2480
        var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker");
2481
        worker.attachToDocument(session.getDocument());
2482

    
2483
        if (this.fragmentContext)
2484
            worker.call("setOptions", [{context: this.fragmentContext}]);
2485

    
2486
        worker.on("error", function(e) {
2487
            session.setAnnotations(e.data);
2488
        });
2489

    
2490
        worker.on("terminate", function() {
2491
            session.clearAnnotations();
2492
        });
2493

    
2494
        return worker;
2495
    };
2496

    
2497
    this.$id = "ace/mode/html";
2498
    this.snippetFileId = "ace/snippets/html";
2499
}).call(Mode.prototype);
2500

    
2501
exports.Mode = Mode;
2502
});
2503

    
2504
ace.define("ace/mode/ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
2505
"use strict";
2506

    
2507
var oop = require("../lib/oop");
2508
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
2509
var constantOtherSymbol = exports.constantOtherSymbol = {
2510
    token : "constant.other.symbol.ruby", // symbol
2511
    regex : "[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?"
2512
};
2513

    
2514
var qString = exports.qString = {
2515
    token : "string", // single line
2516
    regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
2517
};
2518

    
2519
var qqString = exports.qqString = {
2520
    token : "string", // single line
2521
    regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
2522
};
2523

    
2524
var tString = exports.tString = {
2525
    token : "string", // backtick string
2526
    regex : "[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]"
2527
};
2528

    
2529
var constantNumericHex = exports.constantNumericHex = {
2530
    token : "constant.numeric", // hex
2531
    regex : "0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b"
2532
};
2533

    
2534
var constantNumericFloat = exports.constantNumericFloat = {
2535
    token : "constant.numeric", // float
2536
    regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b"
2537
};
2538

    
2539
var instanceVariable = exports.instanceVariable = {
2540
    token : "variable.instance", // instance variable
2541
    regex : "@{1,2}[a-zA-Z_\\d]+"
2542
};
2543

    
2544
var RubyHighlightRules = function() {
2545

    
2546
    var builtinFunctions = (
2547
        "abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|" +
2548
        "assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|" +
2549
        "assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|" +
2550
        "assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|" +
2551
        "assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|" +
2552
        "assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|" +
2553
        "attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|" +
2554
        "caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|" +
2555
        "exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|" +
2556
        "gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|" +
2557
        "link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|" +
2558
        "p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|" +
2559
        "raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|" +
2560
        "set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|" +
2561
        "throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|" +
2562
        "render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|" +
2563
        "content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|" +
2564
        "fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|" +
2565
        "time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|" +
2566
        "select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|" +
2567
        "file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|" +
2568
        "protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|" +
2569
        "send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|" +
2570
        "validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|" +
2571
        "validates_inclusion_of|validates_numericality_of|validates_with|validates_each|" +
2572
        "authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|" +
2573
        "filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|" +
2574
        "translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|" +
2575
        "cache|expire_fragment|expire_cache_for|observe|cache_sweeper|" +
2576
        "has_many|has_one|belongs_to|has_and_belongs_to_many"
2577
    );
2578

    
2579
    var keywords = (
2580
        "alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|" +
2581
        "__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|" +
2582
        "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield"
2583
    );
2584

    
2585
    var buildinConstants = (
2586
        "true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|" +
2587
        "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING"
2588
    );
2589

    
2590
    var builtinVariables = (
2591
        "$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|" +
2592
        "$!|root_url|flash|session|cookies|params|request|response|logger|self"
2593
    );
2594

    
2595
    var keywordMapper = this.$keywords = this.createKeywordMapper({
2596
        "keyword": keywords,
2597
        "constant.language": buildinConstants,
2598
        "variable.language": builtinVariables,
2599
        "support.function": builtinFunctions,
2600
        "invalid.deprecated": "debugger" // TODO is this a remnant from js mode?
2601
    }, "identifier");
2602

    
2603
    this.$rules = {
2604
        "start" : [
2605
            {
2606
                token : "comment",
2607
                regex : "#.*$"
2608
            }, {
2609
                token : "comment", // multi line comment
2610
                regex : "^=begin(?:$|\\s.*$)",
2611
                next : "comment"
2612
            }, {
2613
                token : "string.regexp",
2614
                regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"
2615
            },
2616

    
2617
            [{
2618
                regex: "[{}]", onMatch: function(val, state, stack) {
2619
                    this.next = val == "{" ? this.nextState : "";
2620
                    if (val == "{" && stack.length) {
2621
                        stack.unshift("start", state);
2622
                        return "paren.lparen";
2623
                    }
2624
                    if (val == "}" && stack.length) {
2625
                        stack.shift();
2626
                        this.next = stack.shift();
2627
                        if (this.next.indexOf("string") != -1)
2628
                            return "paren.end";
2629
                    }
2630
                    return val == "{" ? "paren.lparen" : "paren.rparen";
2631
                },
2632
                nextState: "start"
2633
            }, {
2634
                token : "string.start",
2635
                regex : /"/,
2636
                push  : [{
2637
                    token : "constant.language.escape",
2638
                    regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/
2639
                }, {
2640
                    token : "paren.start",
2641
                    regex : /#{/,
2642
                    push  : "start"
2643
                }, {
2644
                    token : "string.end",
2645
                    regex : /"/,
2646
                    next  : "pop"
2647
                }, {
2648
                    defaultToken: "string"
2649
                }]
2650
            }, {
2651
                token : "string.start",
2652
                regex : /`/,
2653
                push  : [{
2654
                    token : "constant.language.escape",
2655
                    regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/
2656
                }, {
2657
                    token : "paren.start",
2658
                    regex : /#{/,
2659
                    push  : "start"
2660
                }, {
2661
                    token : "string.end",
2662
                    regex : /`/,
2663
                    next  : "pop"
2664
                }, {
2665
                    defaultToken: "string"
2666
                }]
2667
            }, {
2668
                token : "string.start",
2669
                regex : /'/,
2670
                push  : [{
2671
                    token : "constant.language.escape",
2672
                    regex : /\\['\\]/
2673
                },  {
2674
                    token : "string.end",
2675
                    regex : /'/,
2676
                    next  : "pop"
2677
                }, {
2678
                    defaultToken: "string"
2679
                }]
2680
            }],
2681

    
2682
            {
2683
                token : "text", // namespaces aren't symbols
2684
                regex : "::"
2685
            }, {
2686
                token : "variable.instance", // instance variable
2687
                regex : "@{1,2}[a-zA-Z_\\d]+"
2688
            }, {
2689
                token : "support.class", // class name
2690
                regex : "[A-Z][a-zA-Z_\\d]+"
2691
            },
2692

    
2693
            constantOtherSymbol,
2694
            constantNumericHex,
2695
            constantNumericFloat,
2696

    
2697
            {
2698
                token : "constant.language.boolean",
2699
                regex : "(?:true|false)\\b"
2700
            }, {
2701
                token : keywordMapper,
2702
                regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
2703
            }, {
2704
                token : "punctuation.separator.key-value",
2705
                regex : "=>"
2706
            }, {
2707
                stateName: "heredoc",
2708
                onMatch : function(value, currentState, stack) {
2709
                    var next = value[2] == '-' ? "indentedHeredoc" : "heredoc";
2710
                    var tokens = value.split(this.splitRegex);
2711
                    stack.push(next, tokens[3]);
2712
                    return [
2713
                        {type:"constant", value: tokens[1]},
2714
                        {type:"string", value: tokens[2]},
2715
                        {type:"support.class", value: tokens[3]},
2716
                        {type:"string", value: tokens[4]}
2717
                    ];
2718
                },
2719
                regex : "(<<-?)(['\"`]?)([\\w]+)(['\"`]?)",
2720
                rules: {
2721
                    heredoc: [{
2722
                        onMatch:  function(value, currentState, stack) {
2723
                            if (value === stack[1]) {
2724
                                stack.shift();
2725
                                stack.shift();
2726
                                this.next = stack[0] || "start";
2727
                                return "support.class";
2728
                            }
2729
                            this.next = "";
2730
                            return "string";
2731
                        },
2732
                        regex: ".*$",
2733
                        next: "start"
2734
                    }],
2735
                    indentedHeredoc: [{
2736
                        token: "string",
2737
                        regex: "^ +"
2738
                    }, {
2739
                        onMatch:  function(value, currentState, stack) {
2740
                            if (value === stack[1]) {
2741
                                stack.shift();
2742
                                stack.shift();
2743
                                this.next = stack[0] || "start";
2744
                                return "support.class";
2745
                            }
2746
                            this.next = "";
2747
                            return "string";
2748
                        },
2749
                        regex: ".*$",
2750
                        next: "start"
2751
                    }]
2752
                }
2753
            }, {
2754
                regex : "$",
2755
                token : "empty",
2756
                next : function(currentState, stack) {
2757
                    if (stack[0] === "heredoc" || stack[0] === "indentedHeredoc")
2758
                        return stack[0];
2759
                    return currentState;
2760
                }
2761
            }, {
2762
               token : "string.character",
2763
               regex : "\\B\\?."
2764
            }, {
2765
                token : "keyword.operator",
2766
                regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"
2767
            }, {
2768
                token : "paren.lparen",
2769
                regex : "[[({]"
2770
            }, {
2771
                token : "paren.rparen",
2772
                regex : "[\\])}]"
2773
            }, {
2774
                token : "text",
2775
                regex : "\\s+"
2776
            }
2777
        ],
2778
        "comment" : [
2779
            {
2780
                token : "comment", // closing comment
2781
                regex : "^=end(?:$|\\s.*$)",
2782
                next : "start"
2783
            }, {
2784
                token : "comment", // comment spanning whole line
2785
                regex : ".+"
2786
            }
2787
        ]
2788
    };
2789

    
2790
    this.normalizeRules();
2791
};
2792

    
2793
oop.inherits(RubyHighlightRules, TextHighlightRules);
2794

    
2795
exports.RubyHighlightRules = RubyHighlightRules;
2796
});
2797

    
2798
ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) {
2799
"use strict";
2800

    
2801
var oop = require("../../lib/oop");
2802
var BaseFoldMode = require("./fold_mode").FoldMode;
2803
var Range = require("../../range").Range;
2804

    
2805
var FoldMode = exports.FoldMode = function() {};
2806
oop.inherits(FoldMode, BaseFoldMode);
2807

    
2808
(function() {
2809

    
2810
    this.getFoldWidgetRange = function(session, foldStyle, row) {
2811
        var range = this.indentationBlock(session, row);
2812
        if (range)
2813
            return range;
2814

    
2815
        var re = /\S/;
2816
        var line = session.getLine(row);
2817
        var startLevel = line.search(re);
2818
        if (startLevel == -1 || line[startLevel] != "#")
2819
            return;
2820

    
2821
        var startColumn = line.length;
2822
        var maxRow = session.getLength();
2823
        var startRow = row;
2824
        var endRow = row;
2825

    
2826
        while (++row < maxRow) {
2827
            line = session.getLine(row);
2828
            var level = line.search(re);
2829

    
2830
            if (level == -1)
2831
                continue;
2832

    
2833
            if (line[level] != "#")
2834
                break;
2835

    
2836
            endRow = row;
2837
        }
2838

    
2839
        if (endRow > startRow) {
2840
            var endColumn = session.getLine(endRow).length;
2841
            return new Range(startRow, startColumn, endRow, endColumn);
2842
        }
2843
    };
2844
    this.getFoldWidget = function(session, foldStyle, row) {
2845
        var line = session.getLine(row);
2846
        var indent = line.search(/\S/);
2847
        var next = session.getLine(row + 1);
2848
        var prev = session.getLine(row - 1);
2849
        var prevIndent = prev.search(/\S/);
2850
        var nextIndent = next.search(/\S/);
2851

    
2852
        if (indent == -1) {
2853
            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : "";
2854
            return "";
2855
        }
2856
        if (prevIndent == -1) {
2857
            if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") {
2858
                session.foldWidgets[row - 1] = "";
2859
                session.foldWidgets[row + 1] = "";
2860
                return "start";
2861
            }
2862
        } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") {
2863
            if (session.getLine(row - 2).search(/\S/) == -1) {
2864
                session.foldWidgets[row - 1] = "start";
2865
                session.foldWidgets[row + 1] = "";
2866
                return "";
2867
            }
2868
        }
2869

    
2870
        if (prevIndent!= -1 && prevIndent < indent)
2871
            session.foldWidgets[row - 1] = "start";
2872
        else
2873
            session.foldWidgets[row - 1] = "";
2874

    
2875
        if (indent < nextIndent)
2876
            return "start";
2877
        else
2878
            return "";
2879
    };
2880

    
2881
}).call(FoldMode.prototype);
2882

    
2883
});
2884

    
2885
ace.define("ace/mode/ruby",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ruby_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/coffee"], function(require, exports, module) {
2886
"use strict";
2887

    
2888
var oop = require("../lib/oop");
2889
var TextMode = require("./text").Mode;
2890
var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules;
2891
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
2892
var Range = require("../range").Range;
2893
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
2894
var FoldMode = require("./folding/coffee").FoldMode;
2895

    
2896
var Mode = function() {
2897
    this.HighlightRules = RubyHighlightRules;
2898
    this.$outdent = new MatchingBraceOutdent();
2899
    this.$behaviour = new CstyleBehaviour();
2900
    this.foldingRules = new FoldMode();
2901
};
2902
oop.inherits(Mode, TextMode);
2903

    
2904
(function() {
2905

    
2906

    
2907
    this.lineCommentStart = "#";
2908

    
2909
    this.getNextLineIndent = function(state, line, tab) {
2910
        var indent = this.$getIndent(line);
2911

    
2912
        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
2913
        var tokens = tokenizedLine.tokens;
2914

    
2915
        if (tokens.length && tokens[tokens.length-1].type == "comment") {
2916
            return indent;
2917
        }
2918

    
2919
        if (state == "start") {
2920
            var match = line.match(/^.*[\{\(\[]\s*$/);
2921
            var startingClassOrMethod = line.match(/^\s*(class|def|module)\s.*$/);
2922
            var startingDoBlock = line.match(/.*do(\s*|\s+\|.*\|\s*)$/);
2923
            var startingConditional = line.match(/^\s*(if|else|when)\s*/);
2924
            if (match || startingClassOrMethod || startingDoBlock || startingConditional) {
2925
                indent += tab;
2926
            }
2927
        }
2928

    
2929
        return indent;
2930
    };
2931

    
2932
    this.checkOutdent = function(state, line, input) {
2933
        return /^\s+(end|else)$/.test(line + input) || this.$outdent.checkOutdent(line, input);
2934
    };
2935

    
2936
    this.autoOutdent = function(state, session, row) {
2937
        var line = session.getLine(row);
2938
        if (/}/.test(line))
2939
            return this.$outdent.autoOutdent(session, row);
2940
        var indent = this.$getIndent(line);
2941
        var prevLine = session.getLine(row - 1);
2942
        var prevIndent = this.$getIndent(prevLine);
2943
        var tab = session.getTabString();
2944
        if (prevIndent.length <= indent.length) {
2945
            if (indent.slice(-tab.length) == tab)
2946
                session.remove(new Range(row, indent.length-tab.length, row, indent.length));
2947
        }
2948
    };
2949

    
2950
    this.$id = "ace/mode/ruby";
2951
    this.snippetFileId = "ace/snippets/ruby";
2952
}).call(Mode.prototype);
2953

    
2954
exports.Mode = Mode;
2955
});
2956

    
2957
ace.define("ace/mode/ejs",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules","ace/mode/javascript_highlight_rules","ace/lib/oop","ace/mode/html","ace/mode/javascript","ace/mode/css","ace/mode/ruby"], function(require, exports, module) {
2958
"use strict";
2959

    
2960
var oop = require("../lib/oop");
2961
var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;
2962
var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;
2963

    
2964
var EjsHighlightRules = function(start, end) {
2965
    HtmlHighlightRules.call(this);
2966
    
2967
    if (!start)
2968
        start = "(?:<%|<\\?|{{)";
2969
    if (!end)
2970
        end = "(?:%>|\\?>|}})";
2971

    
2972
    for (var i in this.$rules) {
2973
        this.$rules[i].unshift({
2974
            token : "markup.list.meta.tag",
2975
            regex : start + "(?![>}])[-=]?",
2976
            push  : "ejs-start"
2977
        });
2978
    }
2979
    
2980
    this.embedRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "ejs-", [{
2981
        token : "markup.list.meta.tag",
2982
        regex : "-?" + end,
2983
        next  : "pop"
2984
    }, {
2985
        token: "comment",
2986
        regex: "//.*?" + end,
2987
        next: "pop"
2988
    }]);
2989
    
2990
    this.normalizeRules();
2991
};
2992

    
2993

    
2994
oop.inherits(EjsHighlightRules, HtmlHighlightRules);
2995

    
2996
exports.EjsHighlightRules = EjsHighlightRules;
2997

    
2998

    
2999
var oop = require("../lib/oop");
3000
var HtmlMode = require("./html").Mode;
3001
var JavaScriptMode = require("./javascript").Mode;
3002
var CssMode = require("./css").Mode;
3003
var RubyMode = require("./ruby").Mode;
3004

    
3005
var Mode = function() {
3006
    HtmlMode.call(this);
3007
    this.HighlightRules = EjsHighlightRules;    
3008
    this.createModeDelegates({
3009
        "js-": JavaScriptMode,
3010
        "css-": CssMode,
3011
        "ejs-": JavaScriptMode
3012
    });
3013
};
3014
oop.inherits(Mode, HtmlMode);
3015

    
3016
(function() {
3017

    
3018
    this.$id = "ace/mode/ejs";
3019
}).call(Mode.prototype);
3020

    
3021
exports.Mode = Mode;
3022
});                (function() {
3023
                    ace.require(["ace/mode/ejs"], function(m) {
3024
                        if (typeof module == "object" && typeof exports == "object" && module) {
3025
                            module.exports = m;
3026
                        }
3027
                    });
3028
                })();
3029
            
(65-65/244)