mirror of
https://github.com/alecthomas/chroma.git
synced 2025-03-17 20:58:08 +02:00
Improved support for Go templates (#401)
This commit is contained in:
parent
290ff860b9
commit
6665753f98
@ -60,13 +60,13 @@ var Go = internal.Register(MustNewLexer(
|
||||
|
||||
var goTemplateRules = Rules{
|
||||
"root": {
|
||||
{`{{(- )?/\*(.|\n)*?\*/( -)?}}`, CommentMultiline, nil},
|
||||
{`{{[-]?`, CommentPreproc, Push("template")},
|
||||
{`[^{]+`, Other, nil},
|
||||
{`{`, Other, nil},
|
||||
},
|
||||
"template": {
|
||||
{`[-]?}}`, CommentPreproc, Pop(1)},
|
||||
{`/\*.*?\*/`, Comment, nil},
|
||||
{`(?=}})`, CommentPreproc, Pop(1)}, // Terminate the pipeline
|
||||
{`\(`, Operator, Push("subexpression")},
|
||||
{`"(\\\\|\\"|[^"])*"`, LiteralString, nil},
|
||||
@ -80,19 +80,19 @@ var goTemplateRules = Rules{
|
||||
{`\s+`, Whitespace, nil},
|
||||
{`\(`, Operator, Push("subexpression")},
|
||||
{`(range|if|else|while|with|template|end|true|false|nil|and|call|html|index|js|len|not|or|print|printf|println|urlquery|eq|ne|lt|le|gt|ge)\b`, Keyword, nil},
|
||||
{`\||:=`, Operator, nil},
|
||||
{`\||:?=`, Operator, nil},
|
||||
{`[$]?[^\W\d]\w*`, NameOther, nil},
|
||||
{`[$]?\.(?:[^\W\d]\w*)?`, NameAttribute, nil},
|
||||
{`"(\\\\|\\"|[^"])*"`, LiteralString, nil},
|
||||
{`\d+i`, LiteralNumber, nil},
|
||||
{`\d+\.\d*([Ee][-+]\d+)?i`, LiteralNumber, nil},
|
||||
{`-?\d+i`, LiteralNumber, nil},
|
||||
{`-?\d+\.\d*([Ee][-+]\d+)?i`, LiteralNumber, nil},
|
||||
{`\.\d+([Ee][-+]\d+)?i`, LiteralNumber, nil},
|
||||
{`\d+[Ee][-+]\d+i`, LiteralNumber, nil},
|
||||
{`\d+(\.\d+[eE][+\-]?\d+|\.\d*|[eE][+\-]?\d+)`, LiteralNumberFloat, nil},
|
||||
{`\.\d+([eE][+\-]?\d+)?`, LiteralNumberFloat, nil},
|
||||
{`0[0-7]+`, LiteralNumberOct, nil},
|
||||
{`0[xX][0-9a-fA-F]+`, LiteralNumberHex, nil},
|
||||
{`(0|[1-9][0-9]*)`, LiteralNumberInteger, nil},
|
||||
{`-?\d+[Ee][-+]\d+i`, LiteralNumber, nil},
|
||||
{`-?\d+(\.\d+[eE][+\-]?\d+|\.\d*|[eE][+\-]?\d+)`, LiteralNumberFloat, nil},
|
||||
{`-?\.\d+([eE][+\-]?\d+)?`, LiteralNumberFloat, nil},
|
||||
{`-?0[0-7]+`, LiteralNumberOct, nil},
|
||||
{`-?0[xX][0-9a-fA-F]+`, LiteralNumberHex, nil},
|
||||
{`-?(0|[1-9][0-9]*)`, LiteralNumberInteger, nil},
|
||||
{`'(\\['"\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|[^\\])'`, LiteralStringChar, nil},
|
||||
{"`[^`]*`", LiteralString, nil},
|
||||
},
|
||||
|
@ -23,6 +23,9 @@ func TestGoHTMLTemplateIssue126(t *testing.T) {
|
||||
{{ with .OutputFormats.Get "RSS" }}
|
||||
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
|
||||
{{ end }}
|
||||
{{/*
|
||||
Print all pages
|
||||
*/}}
|
||||
{{ range .Data.Pages }}
|
||||
<item>
|
||||
<title>{{ .Title }}</title>
|
||||
@ -48,3 +51,72 @@ func TestGoHTMLTemplateIssue126(t *testing.T) {
|
||||
assert.Equal(t, source, chroma.Stringify(tokens...))
|
||||
}
|
||||
}
|
||||
|
||||
func TestGoHTMLTemplateMultilineComments(t *testing.T) {
|
||||
for _, source := range []string{
|
||||
`
|
||||
{{/*
|
||||
This is a multiline comment
|
||||
*/}}
|
||||
`,
|
||||
`
|
||||
{{- /*
|
||||
This is a multiline comment
|
||||
*/}}
|
||||
`,
|
||||
`
|
||||
{{/*
|
||||
This is a multiline comment
|
||||
*/ -}}
|
||||
`,
|
||||
`
|
||||
{{- /*
|
||||
This is a multiline comment
|
||||
*/ -}}
|
||||
`,
|
||||
} {
|
||||
tokens, err := chroma.Tokenise(GoHTMLTemplate, nil, source)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, source, chroma.Stringify(tokens...))
|
||||
|
||||
// Make sure that there are no errors
|
||||
for _, token := range tokens {
|
||||
assert.NotEqual(t, chroma.Error, token.Type)
|
||||
}
|
||||
|
||||
// Make sure that multiline comments are printed
|
||||
found := false
|
||||
for _, token := range tokens {
|
||||
if token.Type == chroma.CommentMultiline {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
assert.True(t, found)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGoHTMLTemplateNegativeNumber(t *testing.T) {
|
||||
for _, source := range []string{
|
||||
`
|
||||
{{ fn -3 }}
|
||||
`,
|
||||
} {
|
||||
tokens, err := chroma.Tokenise(GoHTMLTemplate, nil, source)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, source, chroma.Stringify(tokens...))
|
||||
|
||||
// Make sure that there are no errors
|
||||
for _, token := range tokens {
|
||||
assert.NotEqual(t, chroma.Error, token.Type)
|
||||
}
|
||||
|
||||
// Make sure that negative number is found
|
||||
found := false
|
||||
for _, token := range tokens {
|
||||
if token.Type == chroma.LiteralNumberInteger {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
assert.True(t, found)
|
||||
}
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ func TestLexers(t *testing.T) {
|
||||
continue
|
||||
}
|
||||
|
||||
base := strings.Split(strings.TrimSuffix(file.Name(), filepath.Ext(file.Name())), "-")[0]
|
||||
base := strings.Split(strings.TrimSuffix(file.Name(), filepath.Ext(file.Name())), ".")[0]
|
||||
lexer := lexers.Get(base)
|
||||
assert.NotNil(t, lexer)
|
||||
|
||||
|
3
lexers/testdata/go-html-template.actual
vendored
Normal file
3
lexers/testdata/go-html-template.actual
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{{/*
|
||||
This is a multiline comment
|
||||
*/}}
|
3
lexers/testdata/go-html-template.expected
vendored
Normal file
3
lexers/testdata/go-html-template.expected
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[
|
||||
{"type":"CommentMultiline","value":"{{/*\n This is a multiline comment\n*/}}"}
|
||||
]
|
6
lexers/testdata/go-text-template.actual
vendored
Normal file
6
lexers/testdata/go-text-template.actual
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
{{/*
|
||||
This is a multiline comment
|
||||
*/}}
|
||||
|
||||
{{ $myVar := 2 }}
|
||||
{{ $myVar = 4 }}
|
23
lexers/testdata/go-text-template.expected
vendored
Normal file
23
lexers/testdata/go-text-template.expected
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
[
|
||||
{"type":"CommentMultiline","value":"{{/*\n This is a multiline comment\n*/}}"},
|
||||
{"type":"Other","value":"\n\n"},
|
||||
{"type":"CommentPreproc","value":"{{"},
|
||||
{"type":"TextWhitespace","value":" "},
|
||||
{"type":"NameOther","value":"$myVar"},
|
||||
{"type":"TextWhitespace","value":" "},
|
||||
{"type":"Operator","value":":="},
|
||||
{"type":"TextWhitespace","value":" "},
|
||||
{"type":"NameOther","value":"2"},
|
||||
{"type":"TextWhitespace","value":" "},
|
||||
{"type":"CommentPreproc","value":"}}"},
|
||||
{"type":"Other","value":"\n"},
|
||||
{"type":"CommentPreproc","value":"{{"},
|
||||
{"type":"TextWhitespace","value":" "},
|
||||
{"type":"NameOther","value":"$myVar"},
|
||||
{"type":"TextWhitespace","value":" "},
|
||||
{"type":"Operator","value":"="},
|
||||
{"type":"TextWhitespace","value":" "},
|
||||
{"type":"NameOther","value":"4"},
|
||||
{"type":"TextWhitespace","value":" "},
|
||||
{"type":"CommentPreproc","value":"}}"}
|
||||
]
|
Loading…
x
Reference in New Issue
Block a user