You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.1 KiB
73 lines
2.1 KiB
package s
|
|
|
|
import (
|
|
. "github.com/alecthomas/chroma" // nolint
|
|
"github.com/alecthomas/chroma/lexers/h"
|
|
"github.com/alecthomas/chroma/lexers/internal"
|
|
"github.com/alecthomas/chroma/lexers/t"
|
|
)
|
|
|
|
// Svelte lexer.
|
|
var Svelte = internal.Register(DelegatingLexer(h.HTML, MustNewLazyLexer(
|
|
&Config{
|
|
Name: "Svelte",
|
|
Aliases: []string{"svelte"},
|
|
Filenames: []string{"*.svelte"},
|
|
MimeTypes: []string{"application/x-svelte"},
|
|
DotAll: true,
|
|
},
|
|
svelteRules,
|
|
)))
|
|
|
|
func svelteRules() Rules {
|
|
return Rules{
|
|
"root": {
|
|
// Let HTML handle the comments, including comments containing script and style tags
|
|
{`<!--`, Other, Push("comment")},
|
|
{
|
|
// Highlight script and style tags based on lang attribute
|
|
// and allow attributes besides lang
|
|
`(<\s*(?:script|style).*?lang\s*=\s*['"])` +
|
|
`(.+?)(['"].*?>)` +
|
|
`(.+?)` +
|
|
`(<\s*/\s*(?:script|style)\s*>)`,
|
|
UsingByGroup(internal.Get, 2, 4, Other, Other, Other, Other, Other),
|
|
nil,
|
|
},
|
|
{
|
|
// Make sure `{` is not inside script or style tags
|
|
`(?<!<\s*(?:script|style)(?:(?!(?:script|style)\s*>).)*?)` +
|
|
`{` +
|
|
`(?!(?:(?!<\s*(?:script|style)).)*?(?:script|style)\s*>)`,
|
|
Punctuation,
|
|
Push("templates"),
|
|
},
|
|
// on:submit|preventDefault
|
|
{`(?<=\s+on:\w+(?:\|\w+)*)\|(?=\w+)`, Operator, nil},
|
|
{`.+?`, Other, nil},
|
|
},
|
|
"comment": {
|
|
{`-->`, Other, Pop(1)},
|
|
{`.+?`, Other, nil},
|
|
},
|
|
"templates": {
|
|
{`}`, Punctuation, Pop(1)},
|
|
// Let TypeScript handle strings and the curly braces inside them
|
|
{`(?<!(?<!\\)\\)(['"` + "`])" + `.*?(?<!(?<!\\)\\)\1`, Using(t.TypeScript), nil},
|
|
// If there is another opening curly brace push to templates again
|
|
{"{", Punctuation, Push("templates")},
|
|
{`@(debug|html)\b`, Keyword, nil},
|
|
{
|
|
`(#await)(\s+)(\w+)(\s+)(then|catch)(\s+)(\w+)`,
|
|
ByGroups(Keyword, Text, Using(t.TypeScript), Text,
|
|
Keyword, Text, Using(t.TypeScript),
|
|
),
|
|
nil,
|
|
},
|
|
{`(#|/)(await|each|if|key)\b`, Keyword, nil},
|
|
{`(:else)(\s+)(if)?\b`, ByGroups(Keyword, Text, Keyword), nil},
|
|
{`:(catch|then)\b`, Keyword, nil},
|
|
{`[^{}]+`, Using(t.TypeScript), nil},
|
|
},
|
|
}
|
|
}
|
|
|