1 package lexers
2
3 import (
4 . "github.com/alecthomas/chroma/v2"
5 )
6
7
8 var GenshiText = Register(MustNewLexer(
9 &Config{
10 Name: "Genshi Text",
11 Aliases: []string{"genshitext"},
12 Filenames: []string{},
13 MimeTypes: []string{"application/x-genshi-text", "text/x-genshi"},
14 },
15 genshiTextRules,
16 ))
17
18 func genshiTextRules() Rules {
19 return Rules{
20 "root": {
21 {`[^#$\s]+`, Other, nil},
22 {`^(\s*)(##.*)$`, ByGroups(Text, Comment), nil},
23 {`^(\s*)(#)`, ByGroups(Text, CommentPreproc), Push("directive")},
24 Include("variable"),
25 {`[#$\s]`, Other, nil},
26 },
27 "directive": {
28 {`\n`, Text, Pop(1)},
29 {`(?:def|for|if)\s+.*`, Using("Python"), Pop(1)},
30 {`(choose|when|with)([^\S\n]+)(.*)`, ByGroups(Keyword, Text, Using("Python")), Pop(1)},
31 {`(choose|otherwise)\b`, Keyword, Pop(1)},
32 {`(end\w*)([^\S\n]*)(.*)`, ByGroups(Keyword, Text, Comment), Pop(1)},
33 },
34 "variable": {
35 {`(?<!\$)(\$\{)(.+?)(\})`, ByGroups(CommentPreproc, Using("Python"), CommentPreproc), nil},
36 {`(?<!\$)(\$)([a-zA-Z_][\w.]*)`, NameVariable, nil},
37 },
38 }
39 }
40
41
42 var GenshiHTMLTemplate = Register(MustNewLexer(
43 &Config{
44 Name: "Genshi HTML",
45 Aliases: []string{"html+genshi", "html+kid"},
46 Filenames: []string{},
47 MimeTypes: []string{"text/html+genshi"},
48 NotMultiline: true,
49 DotAll: true,
50 },
51 genshiMarkupRules,
52 ))
53
54
55 var Genshi = Register(MustNewLexer(
56 &Config{
57 Name: "Genshi",
58 Aliases: []string{"genshi", "kid", "xml+genshi", "xml+kid"},
59 Filenames: []string{"*.kid"},
60 MimeTypes: []string{"application/x-genshi", "application/x-kid"},
61 NotMultiline: true,
62 DotAll: true,
63 },
64 genshiMarkupRules,
65 ))
66
67 func genshiMarkupRules() Rules {
68 return Rules{
69 "root": {
70 {`[^<$]+`, Other, nil},
71 {`(<\?python)(.*?)(\?>)`, ByGroups(CommentPreproc, Using("Python"), CommentPreproc), nil},
72 {`<\s*(script|style)\s*.*?>.*?<\s*/\1\s*>`, Other, nil},
73 {`<\s*py:[a-zA-Z0-9]+`, NameTag, Push("pytag")},
74 {`<\s*[a-zA-Z0-9:.]+`, NameTag, Push("tag")},
75 Include("variable"),
76 {`[<$]`, Other, nil},
77 },
78 "pytag": {
79 {`\s+`, Text, nil},
80 {`[\w:-]+\s*=`, NameAttribute, Push("pyattr")},
81 {`/?\s*>`, NameTag, Pop(1)},
82 },
83 "pyattr": {
84 {`(")(.*?)(")`, ByGroups(LiteralString, Using("Python"), LiteralString), Pop(1)},
85 {`(')(.*?)(')`, ByGroups(LiteralString, Using("Python"), LiteralString), Pop(1)},
86 {`[^\s>]+`, LiteralString, Pop(1)},
87 },
88 "tag": {
89 {`\s+`, Text, nil},
90 {`py:[\w-]+\s*=`, NameAttribute, Push("pyattr")},
91 {`[\w:-]+\s*=`, NameAttribute, Push("attr")},
92 {`/?\s*>`, NameTag, Pop(1)},
93 },
94 "attr": {
95 {`"`, LiteralString, Push("attr-dstring")},
96 {`'`, LiteralString, Push("attr-sstring")},
97 {`[^\s>]*`, LiteralString, Pop(1)},
98 },
99 "attr-dstring": {
100 {`"`, LiteralString, Pop(1)},
101 Include("strings"),
102 {`'`, LiteralString, nil},
103 },
104 "attr-sstring": {
105 {`'`, LiteralString, Pop(1)},
106 Include("strings"),
107 {`'`, LiteralString, nil},
108 },
109 "strings": {
110 {`[^"'$]+`, LiteralString, nil},
111 Include("variable"),
112 },
113 "variable": {
114 {`(?<!\$)(\$\{)(.+?)(\})`, ByGroups(CommentPreproc, Using("Python"), CommentPreproc), nil},
115 {`(?<!\$)(\$)([a-zA-Z_][\w\.]*)`, NameVariable, nil},
116 },
117 }
118 }
119
View as plain text