1 package j
2
3 import (
4 . "github.com/alecthomas/chroma"
5 "github.com/alecthomas/chroma/lexers/internal"
6 )
7
8
9 var JavascriptRules = Rules{
10 "commentsandwhitespace": {
11 {`\s+`, Text, nil},
12 {`<!--`, Comment, nil},
13 {`//.*?\n`, CommentSingle, nil},
14 {`/\*.*?\*/`, CommentMultiline, nil},
15 },
16 "slashstartsregex": {
17 Include("commentsandwhitespace"),
18 {`/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gimuy]+\b|\B)`, LiteralStringRegex, Pop(1)},
19 {`(?=/)`, Text, Push("#pop", "badregex")},
20 Default(Pop(1)),
21 },
22 "badregex": {
23 {`\n`, Text, Pop(1)},
24 },
25 "root": {
26 {`\A#! ?/.*?\n`, CommentHashbang, nil},
27 {`^(?=\s|/|<!--)`, Text, Push("slashstartsregex")},
28 Include("commentsandwhitespace"),
29 {`\d+(\.\d*|[eE][+\-]?\d+)`, LiteralNumberFloat, nil},
30 {`0[bB][01]+`, LiteralNumberBin, nil},
31 {`0[oO][0-7]+`, LiteralNumberOct, nil},
32 {`0[xX][0-9a-fA-F]+`, LiteralNumberHex, nil},
33 {`[0-9][0-9_]*`, LiteralNumberInteger, nil},
34 {`\.\.\.|=>`, Punctuation, nil},
35 {`\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?`, Operator, Push("slashstartsregex")},
36 {`[{(\[;,]`, Punctuation, Push("slashstartsregex")},
37 {`[})\].]`, Punctuation, nil},
38 {`(for|in|while|do|break|return|continue|switch|case|default|if|else|throw|try|catch|finally|new|delete|typeof|instanceof|void|yield|this|of)\b`, Keyword, Push("slashstartsregex")},
39 {`(var|let|with|function)\b`, KeywordDeclaration, Push("slashstartsregex")},
40 {`(abstract|async|await|boolean|byte|char|class|const|debugger|double|enum|export|extends|final|float|goto|implements|import|int|interface|long|native|package|private|protected|public|short|static|super|synchronized|throws|transient|volatile)\b`, KeywordReserved, nil},
41 {`(true|false|null|NaN|Infinity|undefined)\b`, KeywordConstant, nil},
42 {`(Array|Boolean|Date|Error|Function|Math|netscape|Number|Object|Packages|RegExp|String|Promise|Proxy|sun|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|Error|eval|isFinite|isNaN|isSafeInteger|parseFloat|parseInt|document|this|window)\b`, NameBuiltin, nil},
43 {`(?:[$_\p{L}\p{N}]|\\u[a-fA-F0-9]{4})(?:(?:[$\p{L}\p{N}]|\\u[a-fA-F0-9]{4}))*`, NameOther, nil},
44 {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil},
45 {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil},
46 {"`", LiteralStringBacktick, Push("interp")},
47 },
48 "interp": {
49 {"`", LiteralStringBacktick, Pop(1)},
50 {`\\\\`, LiteralStringBacktick, nil},
51 {"\\\\`", LiteralStringBacktick, nil},
52 {"\\\\[^`\\\\]", LiteralStringBacktick, nil},
53 {`\$\{`, LiteralStringInterpol, Push("interp-inside")},
54 {`\$`, LiteralStringBacktick, nil},
55 {"[^`\\\\$]+", LiteralStringBacktick, nil},
56 },
57 "interp-inside": {
58 {`\}`, LiteralStringInterpol, Pop(1)},
59 Include("root"),
60 },
61 }
62
63
64 var Javascript = internal.Register(MustNewLexer(
65 &Config{
66 Name: "JavaScript",
67 Aliases: []string{"js", "javascript"},
68 Filenames: []string{"*.js", "*.jsm", "*.mjs"},
69 MimeTypes: []string{"application/javascript", "application/x-javascript", "text/x-javascript", "text/javascript"},
70 DotAll: true,
71 EnsureNL: true,
72 },
73 JavascriptRules,
74 ))
75
View as plain text