Projekt

Obecné

Profil

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

    
4
var oop = require("../lib/oop");
5
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
6

    
7
var DocCommentHighlightRules = function() {
8
    this.$rules = {
9
        "start" : [ {
10
            token : "comment.doc.tag",
11
            regex : "@[\\w\\d_]+" // TODO: fix email addresses
12
        }, 
13
        DocCommentHighlightRules.getTagRule(),
14
        {
15
            defaultToken : "comment.doc",
16
            caseInsensitive: true
17
        }]
18
    };
19
};
20

    
21
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
22

    
23
DocCommentHighlightRules.getTagRule = function(start) {
24
    return {
25
        token : "comment.doc.tag.storage.type",
26
        regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b"
27
    };
28
};
29

    
30
DocCommentHighlightRules.getStartRule = function(start) {
31
    return {
32
        token : "comment.doc", // doc comment
33
        regex : "\\/\\*(?=\\*)",
34
        next  : start
35
    };
36
};
37

    
38
DocCommentHighlightRules.getEndRule = function (start) {
39
    return {
40
        token : "comment.doc", // closing comment
41
        regex : "\\*\\/",
42
        next  : start
43
    };
44
};
45

    
46

    
47
exports.DocCommentHighlightRules = DocCommentHighlightRules;
48

    
49
});
50

    
51
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) {
52
"use strict";
53

    
54
var oop = require("../lib/oop");
55
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
56
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
57
var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*";
58

    
59
var JavaScriptHighlightRules = function(options) {
60
    var keywordMapper = this.createKeywordMapper({
61
        "variable.language":
62
            "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|"  + // Constructors
63
            "Namespace|QName|XML|XMLList|"                                             + // E4X
64
            "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|"   +
65
            "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|"                    +
66
            "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|"   + // Errors
67
            "SyntaxError|TypeError|URIError|"                                          +
68
            "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions
69
            "isNaN|parseFloat|parseInt|"                                               +
70
            "JSON|Math|"                                                               + // Other
71
            "this|arguments|prototype|window|document"                                 , // Pseudo
72
        "keyword":
73
            "const|yield|import|get|set|async|await|" +
74
            "break|case|catch|continue|default|delete|do|else|finally|for|function|" +
75
            "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" +
76
            "__parent__|__count__|escape|unescape|with|__proto__|" +
77
            "class|enum|extends|super|export|implements|private|public|interface|package|protected|static",
78
        "storage.type":
79
            "const|let|var|function",
80
        "constant.language":
81
            "null|Infinity|NaN|undefined",
82
        "support.function":
83
            "alert",
84
        "constant.language.boolean": "true|false"
85
    }, "identifier");
86
    var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";
87

    
88
    var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex
89
        "u[0-9a-fA-F]{4}|" + // unicode
90
        "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode
91
        "[0-2][0-7]{0,2}|" + // oct
92
        "3[0-7][0-7]?|" + // oct
93
        "[4-7][0-7]?|" + //oct
94
        ".)";
95

    
96
    this.$rules = {
97
        "no_regex" : [
98
            DocCommentHighlightRules.getStartRule("doc-start"),
99
            comments("no_regex"),
100
            {
101
                token : "string",
102
                regex : "'(?=.)",
103
                next  : "qstring"
104
            }, {
105
                token : "string",
106
                regex : '"(?=.)',
107
                next  : "qqstring"
108
            }, {
109
                token : "constant.numeric", // hexadecimal, octal and binary
110
                regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/
111
            }, {
112
                token : "constant.numeric", // decimal integers and floats
113
                regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/
114
            }, {
115
                token : [
116
                    "storage.type", "punctuation.operator", "support.function",
117
                    "punctuation.operator", "entity.name.function", "text","keyword.operator"
118
                ],
119
                regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)",
120
                next: "function_arguments"
121
            }, {
122
                token : [
123
                    "storage.type", "punctuation.operator", "entity.name.function", "text",
124
                    "keyword.operator", "text", "storage.type", "text", "paren.lparen"
125
                ],
126
                regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
127
                next: "function_arguments"
128
            }, {
129
                token : [
130
                    "entity.name.function", "text", "keyword.operator", "text", "storage.type",
131
                    "text", "paren.lparen"
132
                ],
133
                regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
134
                next: "function_arguments"
135
            }, {
136
                token : [
137
                    "storage.type", "punctuation.operator", "entity.name.function", "text",
138
                    "keyword.operator", "text",
139
                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"
140
                ],
141
                regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",
142
                next: "function_arguments"
143
            }, {
144
                token : [
145
                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"
146
                ],
147
                regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()",
148
                next: "function_arguments"
149
            }, {
150
                token : [
151
                    "entity.name.function", "text", "punctuation.operator",
152
                    "text", "storage.type", "text", "paren.lparen"
153
                ],
154
                regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",
155
                next: "function_arguments"
156
            }, {
157
                token : [
158
                    "text", "text", "storage.type", "text", "paren.lparen"
159
                ],
160
                regex : "(:)(\\s*)(function)(\\s*)(\\()",
161
                next: "function_arguments"
162
            }, {
163
                token : "keyword",
164
                regex : "from(?=\\s*('|\"))"
165
            }, {
166
                token : "keyword",
167
                regex : "(?:" + kwBeforeRe + ")\\b",
168
                next : "start"
169
            }, {
170
                token : ["support.constant"],
171
                regex : /that\b/
172
            }, {
173
                token : ["storage.type", "punctuation.operator", "support.function.firebug"],
174
                regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/
175
            }, {
176
                token : keywordMapper,
177
                regex : identifierRe
178
            }, {
179
                token : "punctuation.operator",
180
                regex : /[.](?![.])/,
181
                next  : "property"
182
            }, {
183
                token : "storage.type",
184
                regex : /=>/,
185
                next  : "start"
186
            }, {
187
                token : "keyword.operator",
188
                regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,
189
                next  : "start"
190
            }, {
191
                token : "punctuation.operator",
192
                regex : /[?:,;.]/,
193
                next  : "start"
194
            }, {
195
                token : "paren.lparen",
196
                regex : /[\[({]/,
197
                next  : "start"
198
            }, {
199
                token : "paren.rparen",
200
                regex : /[\])}]/
201
            }, {
202
                token: "comment",
203
                regex: /^#!.*$/
204
            }
205
        ],
206
        property: [{
207
                token : "text",
208
                regex : "\\s+"
209
            }, {
210
                token : [
211
                    "storage.type", "punctuation.operator", "entity.name.function", "text",
212
                    "keyword.operator", "text",
213
                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"
214
                ],
215
                regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",
216
                next: "function_arguments"
217
            }, {
218
                token : "punctuation.operator",
219
                regex : /[.](?![.])/
220
            }, {
221
                token : "support.function",
222
                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(?=\()/
223
            }, {
224
                token : "support.function.dom",
225
                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(?=\()/
226
            }, {
227
                token :  "support.constant",
228
                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/
229
            }, {
230
                token : "identifier",
231
                regex : identifierRe
232
            }, {
233
                regex: "",
234
                token: "empty",
235
                next: "no_regex"
236
            }
237
        ],
238
        "start": [
239
            DocCommentHighlightRules.getStartRule("doc-start"),
240
            comments("start"),
241
            {
242
                token: "string.regexp",
243
                regex: "\\/",
244
                next: "regex"
245
            }, {
246
                token : "text",
247
                regex : "\\s+|^$",
248
                next : "start"
249
            }, {
250
                token: "empty",
251
                regex: "",
252
                next: "no_regex"
253
            }
254
        ],
255
        "regex": [
256
            {
257
                token: "regexp.keyword.operator",
258
                regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
259
            }, {
260
                token: "string.regexp",
261
                regex: "/[sxngimy]*",
262
                next: "no_regex"
263
            }, {
264
                token : "invalid",
265
                regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
266
            }, {
267
                token : "constant.language.escape",
268
                regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
269
            }, {
270
                token : "constant.language.delimiter",
271
                regex: /\|/
272
            }, {
273
                token: "constant.language.escape",
274
                regex: /\[\^?/,
275
                next: "regex_character_class"
276
            }, {
277
                token: "empty",
278
                regex: "$",
279
                next: "no_regex"
280
            }, {
281
                defaultToken: "string.regexp"
282
            }
283
        ],
284
        "regex_character_class": [
285
            {
286
                token: "regexp.charclass.keyword.operator",
287
                regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
288
            }, {
289
                token: "constant.language.escape",
290
                regex: "]",
291
                next: "regex"
292
            }, {
293
                token: "constant.language.escape",
294
                regex: "-"
295
            }, {
296
                token: "empty",
297
                regex: "$",
298
                next: "no_regex"
299
            }, {
300
                defaultToken: "string.regexp.charachterclass"
301
            }
302
        ],
303
        "function_arguments": [
304
            {
305
                token: "variable.parameter",
306
                regex: identifierRe
307
            }, {
308
                token: "punctuation.operator",
309
                regex: "[, ]+"
310
            }, {
311
                token: "punctuation.operator",
312
                regex: "$"
313
            }, {
314
                token: "empty",
315
                regex: "",
316
                next: "no_regex"
317
            }
318
        ],
319
        "qqstring" : [
320
            {
321
                token : "constant.language.escape",
322
                regex : escapedRe
323
            }, {
324
                token : "string",
325
                regex : "\\\\$",
326
                consumeLineEnd  : true
327
            }, {
328
                token : "string",
329
                regex : '"|$',
330
                next  : "no_regex"
331
            }, {
332
                defaultToken: "string"
333
            }
334
        ],
335
        "qstring" : [
336
            {
337
                token : "constant.language.escape",
338
                regex : escapedRe
339
            }, {
340
                token : "string",
341
                regex : "\\\\$",
342
                consumeLineEnd  : true
343
            }, {
344
                token : "string",
345
                regex : "'|$",
346
                next  : "no_regex"
347
            }, {
348
                defaultToken: "string"
349
            }
350
        ]
351
    };
352

    
353

    
354
    if (!options || !options.noES6) {
355
        this.$rules.no_regex.unshift({
356
            regex: "[{}]", onMatch: function(val, state, stack) {
357
                this.next = val == "{" ? this.nextState : "";
358
                if (val == "{" && stack.length) {
359
                    stack.unshift("start", state);
360
                }
361
                else if (val == "}" && stack.length) {
362
                    stack.shift();
363
                    this.next = stack.shift();
364
                    if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1)
365
                        return "paren.quasi.end";
366
                }
367
                return val == "{" ? "paren.lparen" : "paren.rparen";
368
            },
369
            nextState: "start"
370
        }, {
371
            token : "string.quasi.start",
372
            regex : /`/,
373
            push  : [{
374
                token : "constant.language.escape",
375
                regex : escapedRe
376
            }, {
377
                token : "paren.quasi.start",
378
                regex : /\${/,
379
                push  : "start"
380
            }, {
381
                token : "string.quasi.end",
382
                regex : /`/,
383
                next  : "pop"
384
            }, {
385
                defaultToken: "string.quasi"
386
            }]
387
        });
388

    
389
        if (!options || options.jsx != false)
390
            JSX.call(this);
391
    }
392

    
393
    this.embedRules(DocCommentHighlightRules, "doc-",
394
        [ DocCommentHighlightRules.getEndRule("no_regex") ]);
395

    
396
    this.normalizeRules();
397
};
398

    
399
oop.inherits(JavaScriptHighlightRules, TextHighlightRules);
400

    
401
function JSX() {
402
    var tagRegex = identifierRe.replace("\\d", "\\d\\-");
403
    var jsxTag = {
404
        onMatch : function(val, state, stack) {
405
            var offset = val.charAt(1) == "/" ? 2 : 1;
406
            if (offset == 1) {
407
                if (state != this.nextState)
408
                    stack.unshift(this.next, this.nextState, 0);
409
                else
410
                    stack.unshift(this.next);
411
                stack[2]++;
412
            } else if (offset == 2) {
413
                if (state == this.nextState) {
414
                    stack[1]--;
415
                    if (!stack[1] || stack[1] < 0) {
416
                        stack.shift();
417
                        stack.shift();
418
                    }
419
                }
420
            }
421
            return [{
422
                type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml",
423
                value: val.slice(0, offset)
424
            }, {
425
                type: "meta.tag.tag-name.xml",
426
                value: val.substr(offset)
427
            }];
428
        },
429
        regex : "</?" + tagRegex + "",
430
        next: "jsxAttributes",
431
        nextState: "jsx"
432
    };
433
    this.$rules.start.unshift(jsxTag);
434
    var jsxJsRule = {
435
        regex: "{",
436
        token: "paren.quasi.start",
437
        push: "start"
438
    };
439
    this.$rules.jsx = [
440
        jsxJsRule,
441
        jsxTag,
442
        {include : "reference"},
443
        {defaultToken: "string"}
444
    ];
445
    this.$rules.jsxAttributes = [{
446
        token : "meta.tag.punctuation.tag-close.xml",
447
        regex : "/?>",
448
        onMatch : function(value, currentState, stack) {
449
            if (currentState == stack[0])
450
                stack.shift();
451
            if (value.length == 2) {
452
                if (stack[0] == this.nextState)
453
                    stack[1]--;
454
                if (!stack[1] || stack[1] < 0) {
455
                    stack.splice(0, 2);
456
                }
457
            }
458
            this.next = stack[0] || "start";
459
            return [{type: this.token, value: value}];
460
        },
461
        nextState: "jsx"
462
    },
463
    jsxJsRule,
464
    comments("jsxAttributes"),
465
    {
466
        token : "entity.other.attribute-name.xml",
467
        regex : tagRegex
468
    }, {
469
        token : "keyword.operator.attribute-equals.xml",
470
        regex : "="
471
    }, {
472
        token : "text.tag-whitespace.xml",
473
        regex : "\\s+"
474
    }, {
475
        token : "string.attribute-value.xml",
476
        regex : "'",
477
        stateName : "jsx_attr_q",
478
        push : [
479
            {token : "string.attribute-value.xml", regex: "'", next: "pop"},
480
            {include : "reference"},
481
            {defaultToken : "string.attribute-value.xml"}
482
        ]
483
    }, {
484
        token : "string.attribute-value.xml",
485
        regex : '"',
486
        stateName : "jsx_attr_qq",
487
        push : [
488
            {token : "string.attribute-value.xml", regex: '"', next: "pop"},
489
            {include : "reference"},
490
            {defaultToken : "string.attribute-value.xml"}
491
        ]
492
    },
493
    jsxTag
494
    ];
495
    this.$rules.reference = [{
496
        token : "constant.language.escape.reference.xml",
497
        regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
498
    }];
499
}
500

    
501
function comments(next) {
502
    return [
503
        {
504
            token : "comment", // multi line comment
505
            regex : /\/\*/,
506
            next: [
507
                DocCommentHighlightRules.getTagRule(),
508
                {token : "comment", regex : "\\*\\/", next : next || "pop"},
509
                {defaultToken : "comment", caseInsensitive: true}
510
            ]
511
        }, {
512
            token : "comment",
513
            regex : "\\/\\/",
514
            next: [
515
                DocCommentHighlightRules.getTagRule(),
516
                {token : "comment", regex : "$|^", next : next || "pop"},
517
                {defaultToken : "comment", caseInsensitive: true}
518
            ]
519
        }
520
    ];
521
}
522
exports.JavaScriptHighlightRules = JavaScriptHighlightRules;
523
});
524

    
525
ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) {
526
"use strict";
527

    
528
var Range = require("../range").Range;
529

    
530
var MatchingBraceOutdent = function() {};
531

    
532
(function() {
533

    
534
    this.checkOutdent = function(line, input) {
535
        if (! /^\s+$/.test(line))
536
            return false;
537

    
538
        return /^\s*\}/.test(input);
539
    };
540

    
541
    this.autoOutdent = function(doc, row) {
542
        var line = doc.getLine(row);
543
        var match = line.match(/^(\s*\})/);
544

    
545
        if (!match) return 0;
546

    
547
        var column = match[1].length;
548
        var openBracePos = doc.findMatchingBracket({row: row, column: column});
549

    
550
        if (!openBracePos || openBracePos.row == row) return 0;
551

    
552
        var indent = this.$getIndent(doc.getLine(openBracePos.row));
553
        doc.replace(new Range(row, 0, row, column-1), indent);
554
    };
555

    
556
    this.$getIndent = function(line) {
557
        return line.match(/^\s*/)[0];
558
    };
559

    
560
}).call(MatchingBraceOutdent.prototype);
561

    
562
exports.MatchingBraceOutdent = MatchingBraceOutdent;
563
});
564

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

    
568
var oop = require("../../lib/oop");
569
var Range = require("../../range").Range;
570
var BaseFoldMode = require("./fold_mode").FoldMode;
571

    
572
var FoldMode = exports.FoldMode = function(commentRegex) {
573
    if (commentRegex) {
574
        this.foldingStartMarker = new RegExp(
575
            this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
576
        );
577
        this.foldingStopMarker = new RegExp(
578
            this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
579
        );
580
    }
581
};
582
oop.inherits(FoldMode, BaseFoldMode);
583

    
584
(function() {
585
    
586
    this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/;
587
    this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/;
588
    this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/;
589
    this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/;
590
    this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/;
591
    this._getFoldWidgetBase = this.getFoldWidget;
592
    this.getFoldWidget = function(session, foldStyle, row) {
593
        var line = session.getLine(row);
594
    
595
        if (this.singleLineBlockCommentRe.test(line)) {
596
            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))
597
                return "";
598
        }
599
    
600
        var fw = this._getFoldWidgetBase(session, foldStyle, row);
601
    
602
        if (!fw && this.startRegionRe.test(line))
603
            return "start"; // lineCommentRegionStart
604
    
605
        return fw;
606
    };
607

    
608
    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
609
        var line = session.getLine(row);
610
        
611
        if (this.startRegionRe.test(line))
612
            return this.getCommentRegionBlock(session, line, row);
613
        
614
        var match = line.match(this.foldingStartMarker);
615
        if (match) {
616
            var i = match.index;
617

    
618
            if (match[1])
619
                return this.openingBracketBlock(session, match[1], row, i);
620
                
621
            var range = session.getCommentFoldRange(row, i + match[0].length, 1);
622
            
623
            if (range && !range.isMultiLine()) {
624
                if (forceMultiline) {
625
                    range = this.getSectionRange(session, row);
626
                } else if (foldStyle != "all")
627
                    range = null;
628
            }
629
            
630
            return range;
631
        }
632

    
633
        if (foldStyle === "markbegin")
634
            return;
635

    
636
        var match = line.match(this.foldingStopMarker);
637
        if (match) {
638
            var i = match.index + match[0].length;
639

    
640
            if (match[1])
641
                return this.closingBracketBlock(session, match[1], row, i);
642

    
643
            return session.getCommentFoldRange(row, i, -1);
644
        }
645
    };
646
    
647
    this.getSectionRange = function(session, row) {
648
        var line = session.getLine(row);
649
        var startIndent = line.search(/\S/);
650
        var startRow = row;
651
        var startColumn = line.length;
652
        row = row + 1;
653
        var endRow = row;
654
        var maxRow = session.getLength();
655
        while (++row < maxRow) {
656
            line = session.getLine(row);
657
            var indent = line.search(/\S/);
658
            if (indent === -1)
659
                continue;
660
            if  (startIndent > indent)
661
                break;
662
            var subRange = this.getFoldWidgetRange(session, "all", row);
663
            
664
            if (subRange) {
665
                if (subRange.start.row <= startRow) {
666
                    break;
667
                } else if (subRange.isMultiLine()) {
668
                    row = subRange.end.row;
669
                } else if (startIndent == indent) {
670
                    break;
671
                }
672
            }
673
            endRow = row;
674
        }
675
        
676
        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
677
    };
678
    this.getCommentRegionBlock = function(session, line, row) {
679
        var startColumn = line.search(/\s*$/);
680
        var maxRow = session.getLength();
681
        var startRow = row;
682
        
683
        var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/;
684
        var depth = 1;
685
        while (++row < maxRow) {
686
            line = session.getLine(row);
687
            var m = re.exec(line);
688
            if (!m) continue;
689
            if (m[1]) depth--;
690
            else depth++;
691

    
692
            if (!depth) break;
693
        }
694

    
695
        var endRow = row;
696
        if (endRow > startRow) {
697
            return new Range(startRow, startColumn, endRow, line.length);
698
        }
699
    };
700

    
701
}).call(FoldMode.prototype);
702

    
703
});
704

    
705
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) {
706
"use strict";
707

    
708
var oop = require("../lib/oop");
709
var TextMode = require("./text").Mode;
710
var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;
711
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
712
var WorkerClient = require("../worker/worker_client").WorkerClient;
713
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
714
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
715

    
716
var Mode = function() {
717
    this.HighlightRules = JavaScriptHighlightRules;
718
    
719
    this.$outdent = new MatchingBraceOutdent();
720
    this.$behaviour = new CstyleBehaviour();
721
    this.foldingRules = new CStyleFoldMode();
722
};
723
oop.inherits(Mode, TextMode);
724

    
725
(function() {
726

    
727
    this.lineCommentStart = "//";
728
    this.blockComment = {start: "/*", end: "*/"};
729
    this.$quotes = {'"': '"', "'": "'", "`": "`"};
730

    
731
    this.getNextLineIndent = function(state, line, tab) {
732
        var indent = this.$getIndent(line);
733

    
734
        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
735
        var tokens = tokenizedLine.tokens;
736
        var endState = tokenizedLine.state;
737

    
738
        if (tokens.length && tokens[tokens.length-1].type == "comment") {
739
            return indent;
740
        }
741

    
742
        if (state == "start" || state == "no_regex") {
743
            var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);
744
            if (match) {
745
                indent += tab;
746
            }
747
        } else if (state == "doc-start") {
748
            if (endState == "start" || endState == "no_regex") {
749
                return "";
750
            }
751
            var match = line.match(/^\s*(\/?)\*/);
752
            if (match) {
753
                if (match[1]) {
754
                    indent += " ";
755
                }
756
                indent += "* ";
757
            }
758
        }
759

    
760
        return indent;
761
    };
762

    
763
    this.checkOutdent = function(state, line, input) {
764
        return this.$outdent.checkOutdent(line, input);
765
    };
766

    
767
    this.autoOutdent = function(state, doc, row) {
768
        this.$outdent.autoOutdent(doc, row);
769
    };
770

    
771
    this.createWorker = function(session) {
772
        var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker");
773
        worker.attachToDocument(session.getDocument());
774

    
775
        worker.on("annotate", function(results) {
776
            session.setAnnotations(results.data);
777
        });
778

    
779
        worker.on("terminate", function() {
780
            session.clearAnnotations();
781
        });
782

    
783
        return worker;
784
    };
785

    
786
    this.$id = "ace/mode/javascript";
787
    this.snippetFileId = "ace/snippets/javascript";
788
}).call(Mode.prototype);
789

    
790
exports.Mode = Mode;
791
});
792

    
793
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) {
794
"use strict";
795

    
796
var oop = require("../lib/oop");
797
var lang = require("../lib/lang");
798
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
799
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";
800
var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters";
801
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";
802
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";
803
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";
804

    
805
var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))";
806
var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b";
807
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";
808

    
809
var CssHighlightRules = function() {
810

    
811
    var keywordMapper = this.createKeywordMapper({
812
        "support.function": supportFunction,
813
        "support.constant": supportConstant,
814
        "support.type": supportType,
815
        "support.constant.color": supportConstantColor,
816
        "support.constant.fonts": supportConstantFonts
817
    }, "text", true);
818

    
819
    this.$rules = {
820
        "start" : [{
821
            include : ["strings", "url", "comments"]
822
        }, {
823
            token: "paren.lparen",
824
            regex: "\\{",
825
            next:  "ruleset"
826
        }, {
827
            token: "paren.rparen",
828
            regex: "\\}"
829
        }, {
830
            token: "string",
831
            regex: "@(?!viewport)",
832
            next:  "media"
833
        }, {
834
            token: "keyword",
835
            regex: "#[a-z0-9-_]+"
836
        }, {
837
            token: "keyword",
838
            regex: "%"
839
        }, {
840
            token: "variable",
841
            regex: "\\.[a-z0-9-_]+"
842
        }, {
843
            token: "string",
844
            regex: ":[a-z0-9-_]+"
845
        }, {
846
            token : "constant.numeric",
847
            regex : numRe
848
        }, {
849
            token: "constant",
850
            regex: "[a-z0-9-_]+"
851
        }, {
852
            caseInsensitive: true
853
        }],
854

    
855
        "media": [{
856
            include : ["strings", "url", "comments"]
857
        }, {
858
            token: "paren.lparen",
859
            regex: "\\{",
860
            next:  "start"
861
        }, {
862
            token: "paren.rparen",
863
            regex: "\\}",
864
            next:  "start"
865
        }, {
866
            token: "string",
867
            regex: ";",
868
            next:  "start"
869
        }, {
870
            token: "keyword",
871
            regex: "(?:media|supports|document|charset|import|namespace|media|supports|document"
872
                + "|page|font|keyframes|viewport|counter-style|font-feature-values"
873
                + "|swash|ornaments|annotation|stylistic|styleset|character-variant)"
874
        }],
875

    
876
        "comments" : [{
877
            token: "comment", // multi line comment
878
            regex: "\\/\\*",
879
            push: [{
880
                token : "comment",
881
                regex : "\\*\\/",
882
                next : "pop"
883
            }, {
884
                defaultToken : "comment"
885
            }]
886
        }],
887

    
888
        "ruleset" : [{
889
            regex : "-(webkit|ms|moz|o)-",
890
            token : "text"
891
        }, {
892
            token : "punctuation.operator",
893
            regex : "[:;]"
894
        }, {
895
            token : "paren.rparen",
896
            regex : "\\}",
897
            next : "start"
898
        }, {
899
            include : ["strings", "url", "comments"]
900
        }, {
901
            token : ["constant.numeric", "keyword"],
902
            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|%)"
903
        }, {
904
            token : "constant.numeric",
905
            regex : numRe
906
        }, {
907
            token : "constant.numeric",  // hex6 color
908
            regex : "#[a-f0-9]{6}"
909
        }, {
910
            token : "constant.numeric", // hex3 color
911
            regex : "#[a-f0-9]{3}"
912
        }, {
913
            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],
914
            regex : pseudoElements
915
        }, {
916
            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],
917
            regex : pseudoClasses
918
        }, {
919
            include: "url"
920
        }, {
921
            token : keywordMapper,
922
            regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"
923
        }, {
924
            caseInsensitive: true
925
        }],
926

    
927
        url: [{
928
            token : "support.function",
929
            regex : "(?:url(:?-prefix)?|domain|regexp)\\(",
930
            push: [{
931
                token : "support.function",
932
                regex : "\\)",
933
                next : "pop"
934
            }, {
935
                defaultToken: "string"
936
            }]
937
        }],
938

    
939
        strings: [{
940
            token : "string.start",
941
            regex : "'",
942
            push : [{
943
                token : "string.end",
944
                regex : "'|$",
945
                next: "pop"
946
            }, {
947
                include : "escapes"
948
            }, {
949
                token : "constant.language.escape",
950
                regex : /\\$/,
951
                consumeLineEnd: true
952
            }, {
953
                defaultToken: "string"
954
            }]
955
        }, {
956
            token : "string.start",
957
            regex : '"',
958
            push : [{
959
                token : "string.end",
960
                regex : '"|$',
961
                next: "pop"
962
            }, {
963
                include : "escapes"
964
            }, {
965
                token : "constant.language.escape",
966
                regex : /\\$/,
967
                consumeLineEnd: true
968
            }, {
969
                defaultToken: "string"
970
            }]
971
        }],
972
        escapes: [{
973
            token : "constant.language.escape",
974
            regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/
975
        }]
976

    
977
    };
978

    
979
    this.normalizeRules();
980
};
981

    
982
oop.inherits(CssHighlightRules, TextHighlightRules);
983

    
984
exports.CssHighlightRules = CssHighlightRules;
985

    
986
});
987

    
988
ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) {
989
"use strict";
990

    
991
var propertyMap = {
992
    "background": {"#$0": 1},
993
    "background-color": {"#$0": 1, "transparent": 1, "fixed": 1},
994
    "background-image": {"url('/$0')": 1},
995
    "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1},
996
    "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2},
997
    "background-attachment": {"scroll": 1, "fixed": 1},
998
    "background-size": {"cover": 1, "contain": 1},
999
    "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1},
1000
    "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1},
1001
    "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1},
1002
    "border-color": {"#$0": 1},
1003
    "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2},
1004
    "border-collapse": {"collapse": 1, "separate": 1},
1005
    "bottom": {"px": 1, "em": 1, "%": 1},
1006
    "clear": {"left": 1, "right": 1, "both": 1, "none": 1},
1007
    "color": {"#$0": 1, "rgb(#$00,0,0)": 1},
1008
    "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},
1009
    "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1},
1010
    "empty-cells": {"show": 1, "hide": 1},
1011
    "float": {"left": 1, "right": 1, "none": 1},
1012
    "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},
1013
    "font-size": {"px": 1, "em": 1, "%": 1},
1014
    "font-weight": {"bold": 1, "normal": 1},
1015
    "font-style": {"italic": 1, "normal": 1},
1016
    "font-variant": {"normal": 1, "small-caps": 1},
1017
    "height": {"px": 1, "em": 1, "%": 1},
1018
    "left": {"px": 1, "em": 1, "%": 1},
1019
    "letter-spacing": {"normal": 1},
1020
    "line-height": {"normal": 1},
1021
    "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},
1022
    "margin": {"px": 1, "em": 1, "%": 1},
1023
    "margin-right": {"px": 1, "em": 1, "%": 1},
1024
    "margin-left": {"px": 1, "em": 1, "%": 1},
1025
    "margin-top": {"px": 1, "em": 1, "%": 1},
1026
    "margin-bottom": {"px": 1, "em": 1, "%": 1},
1027
    "max-height": {"px": 1, "em": 1, "%": 1},
1028
    "max-width": {"px": 1, "em": 1, "%": 1},
1029
    "min-height": {"px": 1, "em": 1, "%": 1},
1030
    "min-width": {"px": 1, "em": 1, "%": 1},
1031
    "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
1032
    "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
1033
    "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
1034
    "padding": {"px": 1, "em": 1, "%": 1},
1035
    "padding-top": {"px": 1, "em": 1, "%": 1},
1036
    "padding-right": {"px": 1, "em": 1, "%": 1},
1037
    "padding-bottom": {"px": 1, "em": 1, "%": 1},
1038
    "padding-left": {"px": 1, "em": 1, "%": 1},
1039
    "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1},
1040
    "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1},
1041
    "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1},
1042
    "right": {"px": 1, "em": 1, "%": 1},
1043
    "table-layout": {"fixed": 1, "auto": 1},
1044
    "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1},
1045
    "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1},
1046
    "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1},
1047
    "top": {"px": 1, "em": 1, "%": 1},
1048
    "vertical-align": {"top": 1, "bottom": 1},
1049
    "visibility": {"hidden": 1, "visible": 1},
1050
    "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1},
1051
    "width": {"px": 1, "em": 1, "%": 1},
1052
    "word-spacing": {"normal": 1},
1053
    "filter": {"alpha(opacity=$0100)": 1},
1054

    
1055
    "text-shadow": {"$02px 2px 2px #777": 1},
1056
    "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1},
1057
    "-moz-border-radius": 1,
1058
    "-moz-border-radius-topright": 1,
1059
    "-moz-border-radius-bottomright": 1,
1060
    "-moz-border-radius-topleft": 1,
1061
    "-moz-border-radius-bottomleft": 1,
1062
    "-webkit-border-radius": 1,
1063
    "-webkit-border-top-right-radius": 1,
1064
    "-webkit-border-top-left-radius": 1,
1065
    "-webkit-border-bottom-right-radius": 1,
1066
    "-webkit-border-bottom-left-radius": 1,
1067
    "-moz-box-shadow": 1,
1068
    "-webkit-box-shadow": 1,
1069
    "transform": {"rotate($00deg)": 1, "skew($00deg)": 1},
1070
    "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1},
1071
    "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 }
1072
};
1073

    
1074
var CssCompletions = function() {
1075

    
1076
};
1077

    
1078
(function() {
1079

    
1080
    this.completionsDefined = false;
1081

    
1082
    this.defineCompletions = function() {
1083
        if (document) {
1084
            var style = document.createElement('c').style;
1085

    
1086
            for (var i in style) {
1087
                if (typeof style[i] !== 'string')
1088
                    continue;
1089

    
1090
                var name = i.replace(/[A-Z]/g, function(x) {
1091
                    return '-' + x.toLowerCase();
1092
                });
1093

    
1094
                if (!propertyMap.hasOwnProperty(name))
1095
                    propertyMap[name] = 1;
1096
            }
1097
        }
1098

    
1099
        this.completionsDefined = true;
1100
    };
1101

    
1102
    this.getCompletions = function(state, session, pos, prefix) {
1103
        if (!this.completionsDefined) {
1104
            this.defineCompletions();
1105
        }
1106

    
1107
        if (state==='ruleset' || session.$mode.$id == "ace/mode/scss") {
1108
            var line = session.getLine(pos.row).substr(0, pos.column);
1109
            if (/:[^;]+$/.test(line)) {
1110
                /([\w\-]+):[^:]*$/.test(line);
1111

    
1112
                return this.getPropertyValueCompletions(state, session, pos, prefix);
1113
            } else {
1114
                return this.getPropertyCompletions(state, session, pos, prefix);
1115
            }
1116
        }
1117

    
1118
        return [];
1119
    };
1120

    
1121
    this.getPropertyCompletions = function(state, session, pos, prefix) {
1122
        var properties = Object.keys(propertyMap);
1123
        return properties.map(function(property){
1124
            return {
1125
                caption: property,
1126
                snippet: property + ': $0;',
1127
                meta: "property",
1128
                score: 1000000
1129
            };
1130
        });
1131
    };
1132

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

    
1137
        if (!property)
1138
            return [];
1139
        var values = [];
1140
        if (property in propertyMap && typeof propertyMap[property] === "object") {
1141
            values = Object.keys(propertyMap[property]);
1142
        }
1143
        return values.map(function(value){
1144
            return {
1145
                caption: value,
1146
                snippet: value,
1147
                meta: "property value",
1148
                score: 1000000
1149
            };
1150
        });
1151
    };
1152

    
1153
}).call(CssCompletions.prototype);
1154

    
1155
exports.CssCompletions = CssCompletions;
1156
});
1157

    
1158
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) {
1159
"use strict";
1160

    
1161
var oop = require("../../lib/oop");
1162
var Behaviour = require("../behaviour").Behaviour;
1163
var CstyleBehaviour = require("./cstyle").CstyleBehaviour;
1164
var TokenIterator = require("../../token_iterator").TokenIterator;
1165

    
1166
var CssBehaviour = function () {
1167

    
1168
    this.inherit(CstyleBehaviour);
1169

    
1170
    this.add("colon", "insertion", function (state, action, editor, session, text) {
1171
        if (text === ':' && editor.selection.isEmpty()) {
1172
            var cursor = editor.getCursorPosition();
1173
            var iterator = new TokenIterator(session, cursor.row, cursor.column);
1174
            var token = iterator.getCurrentToken();
1175
            if (token && token.value.match(/\s+/)) {
1176
                token = iterator.stepBackward();
1177
            }
1178
            if (token && token.type === 'support.type') {
1179
                var line = session.doc.getLine(cursor.row);
1180
                var rightChar = line.substring(cursor.column, cursor.column + 1);
1181
                if (rightChar === ':') {
1182
                    return {
1183
                       text: '',
1184
                       selection: [1, 1]
1185
                    };
1186
                }
1187
                if (/^(\s+[^;]|\s*$)/.test(line.substring(cursor.column))) {
1188
                    return {
1189
                       text: ':;',
1190
                       selection: [1, 1]
1191
                    };
1192
                }
1193
            }
1194
        }
1195
    });
1196

    
1197
    this.add("colon", "deletion", function (state, action, editor, session, range) {
1198
        var selected = session.doc.getTextRange(range);
1199
        if (!range.isMultiLine() && selected === ':') {
1200
            var cursor = editor.getCursorPosition();
1201
            var iterator = new TokenIterator(session, cursor.row, cursor.column);
1202
            var token = iterator.getCurrentToken();
1203
            if (token && token.value.match(/\s+/)) {
1204
                token = iterator.stepBackward();
1205
            }
1206
            if (token && token.type === 'support.type') {
1207
                var line = session.doc.getLine(range.start.row);
1208
                var rightChar = line.substring(range.end.column, range.end.column + 1);
1209
                if (rightChar === ';') {
1210
                    range.end.column ++;
1211
                    return range;
1212
                }
1213
            }
1214
        }
1215
    });
1216

    
1217
    this.add("semicolon", "insertion", function (state, action, editor, session, text) {
1218
        if (text === ';' && editor.selection.isEmpty()) {
1219
            var cursor = editor.getCursorPosition();
1220
            var line = session.doc.getLine(cursor.row);
1221
            var rightChar = line.substring(cursor.column, cursor.column + 1);
1222
            if (rightChar === ';') {
1223
                return {
1224
                   text: '',
1225
                   selection: [1, 1]
1226
                };
1227
            }
1228
        }
1229
    });
1230

    
1231
    this.add("!important", "insertion", function (state, action, editor, session, text) {
1232
        if (text === '!' && editor.selection.isEmpty()) {
1233
            var cursor = editor.getCursorPosition();
1234
            var line = session.doc.getLine(cursor.row);
1235

    
1236
            if (/^\s*(;|}|$)/.test(line.substring(cursor.column))) {
1237
                return {
1238
                    text: '!important',
1239
                    selection: [10, 10]
1240
                };
1241
            }
1242
        }
1243
    });
1244

    
1245
};
1246
oop.inherits(CssBehaviour, CstyleBehaviour);
1247

    
1248
exports.CssBehaviour = CssBehaviour;
1249
});
1250

    
1251
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) {
1252
"use strict";
1253

    
1254
var oop = require("../lib/oop");
1255
var TextMode = require("./text").Mode;
1256
var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;
1257
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
1258
var WorkerClient = require("../worker/worker_client").WorkerClient;
1259
var CssCompletions = require("./css_completions").CssCompletions;
1260
var CssBehaviour = require("./behaviour/css").CssBehaviour;
1261
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
1262

    
1263
var Mode = function() {
1264
    this.HighlightRules = CssHighlightRules;
1265
    this.$outdent = new MatchingBraceOutdent();
1266
    this.$behaviour = new CssBehaviour();
1267
    this.$completer = new CssCompletions();
1268
    this.foldingRules = new CStyleFoldMode();
1269
};
1270
oop.inherits(Mode, TextMode);
1271

    
1272
(function() {
1273

    
1274
    this.foldingRules = "cStyle";
1275
    this.blockComment = {start: "/*", end: "*/"};
1276

    
1277
    this.getNextLineIndent = function(state, line, tab) {
1278
        var indent = this.$getIndent(line);
1279
        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;
1280
        if (tokens.length && tokens[tokens.length-1].type == "comment") {
1281
            return indent;
1282
        }
1283

    
1284
        var match = line.match(/^.*\{\s*$/);
1285
        if (match) {
1286
            indent += tab;
1287
        }
1288

    
1289
        return indent;
1290
    };
1291

    
1292
    this.checkOutdent = function(state, line, input) {
1293
        return this.$outdent.checkOutdent(line, input);
1294
    };
1295

    
1296
    this.autoOutdent = function(state, doc, row) {
1297
        this.$outdent.autoOutdent(doc, row);
1298
    };
1299

    
1300
    this.getCompletions = function(state, session, pos, prefix) {
1301
        return this.$completer.getCompletions(state, session, pos, prefix);
1302
    };
1303

    
1304
    this.createWorker = function(session) {
1305
        var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker");
1306
        worker.attachToDocument(session.getDocument());
1307

    
1308
        worker.on("annotate", function(e) {
1309
            session.setAnnotations(e.data);
1310
        });
1311

    
1312
        worker.on("terminate", function() {
1313
            session.clearAnnotations();
1314
        });
1315

    
1316
        return worker;
1317
    };
1318

    
1319
    this.$id = "ace/mode/css";
1320
    this.snippetFileId = "ace/snippets/css";
1321
}).call(Mode.prototype);
1322

    
1323
exports.Mode = Mode;
1324

    
1325
});
1326

    
1327
ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
1328
"use strict";
1329

    
1330
var oop = require("../lib/oop");
1331
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
1332

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

    
1336
    this.$rules = {
1337
        start : [
1338
            {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"},
1339
            {
1340
                token : ["punctuation.instruction.xml", "keyword.instruction.xml"],
1341
                regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction"
1342
            },
1343
            {token : "comment.start.xml", regex : "<\\!--", next : "comment"},
1344
            {
1345
                token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"],
1346
                regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true
1347
            },
1348
            {include : "tag"},
1349
            {token : "text.end-tag-open.xml", regex: "</"},
1350
            {token : "text.tag-open.xml", regex: "<"},
1351
            {include : "reference"},
1352
            {defaultToken : "text.xml"}
1353
        ],
1354

    
1355
        processing_instruction : [{
1356
            token : "entity.other.attribute-name.decl-attribute-name.xml",
1357
            regex : tagRegex
1358
        }, {
1359
            token : "keyword.operator.decl-attribute-equals.xml",
1360
            regex : "="
1361
        }, {
1362
            include: "whitespace"
1363
        }, {
1364
            include: "string"
1365
        }, {
1366
            token : "punctuation.xml-decl.xml",
1367
            regex : "\\?>",
1368
            next : "start"
1369
        }],
1370

    
1371
        doctype : [
1372
            {include : "whitespace"},
1373
            {include : "string"},
1374
            {token : "xml-pe.doctype.xml", regex : ">", next : "start"},
1375
            {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"},
1376
            {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"}
1377
        ],
1378

    
1379
        int_subset : [{
1380
            token : "text.xml",
1381
            regex : "\\s+"
1382
        }, {
1383
            token: "punctuation.int-subset.xml",
1384
            regex: "]",
1385
            next: "pop"
1386
        }, {
1387
            token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"],
1388
            regex : "(<\\!)(" + tagRegex + ")",
1389
            push : [{
1390
                token : "text",
1391
                regex : "\\s+"
1392
            },
1393
            {
1394
                token : "punctuation.markup-decl.xml",
1395
                regex : ">",
1396
                next : "pop"
1397
            },
1398
            {include : "string"}]
1399
        }],
1400

    
1401
        cdata : [
1402
            {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"},
1403
            {token : "text.xml", regex : "\\s+"},
1404
            {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"}
1405
        ],
1406

    
1407
        comment : [
1408
            {token : "comment.end.xml", regex : "-->", next : "start"},
1409
            {defaultToken : "comment.xml"}
1410
        ],
1411

    
1412
        reference : [{
1413
            token : "constant.language.escape.reference.xml",
1414
            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
1415
        }],
1416

    
1417
        attr_reference : [{
1418
            token : "constant.language.escape.reference.attribute-value.xml",
1419
            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
1420
        }],
1421

    
1422
        tag : [{
1423
            token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"],
1424
            regex : "(?:(<)|(</))((?:" + tagRegex + ":)?" + tagRegex + ")",
1425
            next: [
1426
                {include : "attributes"},
1427
                {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : "start"}
1428
            ]
1429
        }],
1430

    
1431
        tag_whitespace : [
1432
            {token : "text.tag-whitespace.xml", regex : "\\s+"}
1433
        ],
1434
        whitespace : [
1435
            {token : "text.whitespace.xml", regex : "\\s+"}
1436
        ],
1437
        string: [{
1438
            token : "string.xml",
1439
            regex : "'",
1440
            push : [
1441
                {token : "string.xml", regex: "'", next: "pop"},
1442
                {defaultToken : "string.xml"}
1443
            ]
1444
        }, {
1445
            token : "string.xml",
1446
            regex : '"',
1447
            push : [
1448
                {token : "string.xml", regex: '"', next: "pop"},
1449
                {defaultToken : "string.xml"}
1450
            ]
1451
        }],
1452

    
1453
        attributes: [{
1454
            token : "entity.other.attribute-name.xml",
1455
            regex : tagRegex
1456
        }, {
1457
            token : "keyword.operator.attribute-equals.xml",
1458
            regex : "="
1459
        }, {
1460
            include: "tag_whitespace"
1461
        }, {
1462
            include: "attribute_value"
1463
        }],
1464

    
1465
        attribute_value: [{
1466
            token : "string.attribute-value.xml",
1467
            regex : "'",
1468
            push : [
1469
                {token : "string.attribute-value.xml", regex: "'", next: "pop"},
1470
                {include : "attr_reference"},
1471
                {defaultToken : "string.attribute-value.xml"}
1472
            ]
1473
        }, {
1474
            token : "string.attribute-value.xml",
1475
            regex : '"',
1476
            push : [
1477
                {token : "string.attribute-value.xml", regex: '"', next: "pop"},
1478
                {include : "attr_reference"},
1479
                {defaultToken : "string.attribute-value.xml"}
1480
            ]
1481
        }]
1482
    };
1483

    
1484
    if (this.constructor === XmlHighlightRules)
1485
        this.normalizeRules();
1486
};
1487

    
1488

    
1489
(function() {
1490

    
1491
    this.embedTagRules = function(HighlightRules, prefix, tag){
1492
        this.$rules.tag.unshift({
1493
            token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"],
1494
            regex : "(<)(" + tag + "(?=\\s|>|$))",
1495
            next: [
1496
                {include : "attributes"},
1497
                {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"}
1498
            ]
1499
        });
1500

    
1501
        this.$rules[tag + "-end"] = [
1502
            {include : "attributes"},
1503
            {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>",  next: "start",
1504
                onMatch : function(value, currentState, stack) {
1505
                    stack.splice(0);
1506
                    return this.token;
1507
            }}
1508
        ];
1509

    
1510
        this.embedRules(HighlightRules, prefix, [{
1511
            token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"],
1512
            regex : "(</)(" + tag + "(?=\\s|>|$))",
1513
            next: tag + "-end"
1514
        }, {
1515
            token: "string.cdata.xml",
1516
            regex : "<\\!\\[CDATA\\["
1517
        }, {
1518
            token: "string.cdata.xml",
1519
            regex : "\\]\\]>"
1520
        }]);
1521
    };
1522

    
1523
}).call(TextHighlightRules.prototype);
1524

    
1525
oop.inherits(XmlHighlightRules, TextHighlightRules);
1526

    
1527
exports.XmlHighlightRules = XmlHighlightRules;
1528
});
1529

    
1530
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) {
1531
"use strict";
1532

    
1533
var oop = require("../lib/oop");
1534
var lang = require("../lib/lang");
1535
var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;
1536
var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;
1537
var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;
1538

    
1539
var tagMap = lang.createMap({
1540
    a           : 'anchor',
1541
    button 	    : 'form',
1542
    form        : 'form',
1543
    img         : 'image',
1544
    input       : 'form',
1545
    label       : 'form',
1546
    option      : 'form',
1547
    script      : 'script',
1548
    select      : 'form',
1549
    textarea    : 'form',
1550
    style       : 'style',
1551
    table       : 'table',
1552
    tbody       : 'table',
1553
    td          : 'table',
1554
    tfoot       : 'table',
1555
    th          : 'table',
1556
    tr          : 'table'
1557
});
1558

    
1559
var HtmlHighlightRules = function() {
1560
    XmlHighlightRules.call(this);
1561

    
1562
    this.addRules({
1563
        attributes: [{
1564
            include : "tag_whitespace"
1565
        }, {
1566
            token : "entity.other.attribute-name.xml",
1567
            regex : "[-_a-zA-Z0-9:.]+"
1568
        }, {
1569
            token : "keyword.operator.attribute-equals.xml",
1570
            regex : "=",
1571
            push : [{
1572
                include: "tag_whitespace"
1573
            }, {
1574
                token : "string.unquoted.attribute-value.html",
1575
                regex : "[^<>='\"`\\s]+",
1576
                next : "pop"
1577
            }, {
1578
                token : "empty",
1579
                regex : "",
1580
                next : "pop"
1581
            }]
1582
        }, {
1583
            include : "attribute_value"
1584
        }],
1585
        tag: [{
1586
            token : function(start, tag) {
1587
                var group = tagMap[tag];
1588
                return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml",
1589
                    "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"];
1590
            },
1591
            regex : "(</?)([-_a-zA-Z0-9:.]+)",
1592
            next: "tag_stuff"
1593
        }],
1594
        tag_stuff: [
1595
            {include : "attributes"},
1596
            {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : "start"}
1597
        ]
1598
    });
1599

    
1600
    this.embedTagRules(CssHighlightRules, "css-", "style");
1601
    this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script");
1602

    
1603
    if (this.constructor === HtmlHighlightRules)
1604
        this.normalizeRules();
1605
};
1606

    
1607
oop.inherits(HtmlHighlightRules, XmlHighlightRules);
1608

    
1609
exports.HtmlHighlightRules = HtmlHighlightRules;
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/curly_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules"], function(require, exports, module) {
2505
"use strict";
2506

    
2507
var oop = require("../lib/oop");
2508
var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;
2509

    
2510

    
2511
var CurlyHighlightRules = function() {
2512
    HtmlHighlightRules.call(this);
2513

    
2514
    this.$rules["start"].unshift({
2515
        token: "variable",
2516
        regex: "{{",
2517
        push: "curly-start"
2518
    });
2519

    
2520
    this.$rules["curly-start"] = [{
2521
        token: "variable",
2522
        regex: "}}",
2523
        next: "pop"
2524
    }];
2525

    
2526
    this.normalizeRules();
2527
};
2528

    
2529
oop.inherits(CurlyHighlightRules, HtmlHighlightRules);
2530

    
2531
exports.CurlyHighlightRules = CurlyHighlightRules;
2532

    
2533
});
2534

    
2535
ace.define("ace/mode/curly",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/matching_brace_outdent","ace/mode/folding/html","ace/mode/curly_highlight_rules"], function(require, exports, module) {
2536
"use strict";
2537

    
2538
var oop = require("../lib/oop");
2539
var HtmlMode = require("./html").Mode;
2540
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
2541
var HtmlFoldMode = require("./folding/html").FoldMode;
2542
var CurlyHighlightRules = require("./curly_highlight_rules").CurlyHighlightRules;
2543

    
2544
var Mode = function() {
2545
    HtmlMode.call(this);
2546
    this.HighlightRules = CurlyHighlightRules;
2547
    this.$outdent = new MatchingBraceOutdent();
2548
    this.foldingRules = new HtmlFoldMode();
2549
};
2550
oop.inherits(Mode, HtmlMode);
2551

    
2552
(function() {
2553
    this.$id = "ace/mode/curly";
2554
}).call(Mode.prototype);
2555

    
2556
exports.Mode = Mode;
2557
});                (function() {
2558
                    ace.require(["ace/mode/curly"], function(m) {
2559
                        if (typeof module == "object" && typeof exports == "object" && module) {
2560
                            module.exports = m;
2561
                        }
2562
                    });
2563
                })();
2564
            
(55-55/244)