1. package lexers
    
  2. 
    
  3. import (
    
  4. 	"strings"
    
  5. 
    
  6. 	. "github.com/alecthomas/chroma/v2" // nolint
    
  7. )
    
  8. 
    
  9. // Go lexer.
    
  10. var Go = Register(MustNewLexer(
    
  11. 	&Config{
    
  12. 		Name:      "Go",
    
  13. 		Aliases:   []string{"go", "golang"},
    
  14. 		Filenames: []string{"*.go"},
    
  15. 		MimeTypes: []string{"text/x-gosrc"},
    
  16. 		EnsureNL:  true,
    
  17. 	},
    
  18. 	goRules,
    
  19. ).SetAnalyser(func(text string) float32 {
    
  20. 	if strings.Contains(text, "fmt.") && strings.Contains(text, "package ") {
    
  21. 		return 0.5
    
  22. 	}
    
  23. 	if strings.Contains(text, "package ") {
    
  24. 		return 0.1
    
  25. 	}
    
  26. 	return 0.0
    
  27. }))
    
  28. 
    
  29. func goRules() Rules {
    
  30. 	return Rules{
    
  31. 		"root": {
    
  32. 			{`\n`, Text, nil},
    
  33. 			{`\s+`, Text, nil},
    
  34. 			{`\\\n`, Text, nil},
    
  35. 			{`//(.*?)\n`, CommentSingle, nil},
    
  36. 			{`/(\\\n)?[*](.|\n)*?[*](\\\n)?/`, CommentMultiline, nil},
    
  37. 			{`(import|package)\b`, KeywordNamespace, nil},
    
  38. 			{`(var|func|struct|map|chan|type|interface|const)\b`, KeywordDeclaration, nil},
    
  39. 			{Words(``, `\b`, `break`, `default`, `select`, `case`, `defer`, `go`, `else`, `goto`, `switch`, `fallthrough`, `if`, `range`, `continue`, `for`, `return`), Keyword, nil},
    
  40. 			{`(true|false|iota|nil)\b`, KeywordConstant, nil},
    
  41. 			{Words(``, `\b(\()`, `uint`, `uint8`, `uint16`, `uint32`, `uint64`, `int`, `int8`, `int16`, `int32`, `int64`, `float`, `float32`, `float64`, `complex64`, `complex128`, `byte`, `rune`, `string`, `bool`, `error`, `uintptr`, `print`, `println`, `panic`, `recover`, `close`, `complex`, `real`, `imag`, `len`, `cap`, `append`, `copy`, `delete`, `new`, `make`, `clear`, `min`, `max`), ByGroups(NameBuiltin, Punctuation), nil},
    
  42. 			{Words(``, `\b`, `uint`, `uint8`, `uint16`, `uint32`, `uint64`, `int`, `int8`, `int16`, `int32`, `int64`, `float`, `float32`, `float64`, `complex64`, `complex128`, `byte`, `rune`, `string`, `bool`, `error`, `uintptr`), KeywordType, nil},
    
  43. 			{`\d+i`, LiteralNumber, nil},
    
  44. 			{`\d+\.\d*([Ee][-+]\d+)?i`, LiteralNumber, nil},
    
  45. 			{`\.\d+([Ee][-+]\d+)?i`, LiteralNumber, nil},
    
  46. 			{`\d+[Ee][-+]\d+i`, LiteralNumber, nil},
    
  47. 			{`\d+(\.\d+[eE][+\-]?\d+|\.\d*|[eE][+\-]?\d+)`, LiteralNumberFloat, nil},
    
  48. 			{`\.\d+([eE][+\-]?\d+)?`, LiteralNumberFloat, nil},
    
  49. 			{`0[0-7]+`, LiteralNumberOct, nil},
    
  50. 			{`0[xX][0-9a-fA-F_]+`, LiteralNumberHex, nil},
    
  51. 			{`0b[01_]+`, LiteralNumberBin, nil},
    
  52. 			{`(0|[1-9][0-9_]*)`, LiteralNumberInteger, nil},
    
  53. 			{`'(\\['"\\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},
    
  54. 			{"(`)([^`]*)(`)", ByGroups(LiteralString, UsingLexer(TypeRemappingLexer(GoTextTemplate, TypeMapping{{Other, LiteralString, nil}})), LiteralString), nil},
    
  55. 			{`"(\\\\|\\"|[^"])*"`, LiteralString, nil},
    
  56. 			{`(<<=|>>=|<<|>>|<=|>=|&\^=|&\^|\+=|-=|\*=|/=|%=|&=|\|=|&&|\|\||<-|\+\+|--|==|!=|:=|\.\.\.|[+\-*/%&])`, Operator, nil},
    
  57. 			{`([a-zA-Z_]\w*)(\s*)(\()`, ByGroups(NameFunction, UsingSelf("root"), Punctuation), nil},
    
  58. 			{`[|^<>=!()\[\]{}.,;:]`, Punctuation, nil},
    
  59. 			{`[^\W\d]\w*`, NameOther, nil},
    
  60. 		},
    
  61. 	}
    
  62. }
    
  63. 
    
  64. var GoHTMLTemplate = Register(DelegatingLexer(HTML, MustNewXMLLexer(
    
  65. 	embedded,
    
  66. 	"embedded/go_template.xml",
    
  67. ).SetConfig(
    
  68. 	&Config{
    
  69. 		Name:    "Go HTML Template",
    
  70. 		Aliases: []string{"go-html-template"},
    
  71. 	},
    
  72. )))
    
  73. 
    
  74. var GoTextTemplate = Register(MustNewXMLLexer(
    
  75. 	embedded,
    
  76. 	"embedded/go_template.xml",
    
  77. ).SetConfig(
    
  78. 	&Config{
    
  79. 		Name:    "Go Text Template",
    
  80. 		Aliases: []string{"go-text-template"},
    
  81. 	},
    
  82. ))