...

Source file src/github.com/alecthomas/chroma/lexers/m/mysql.go

Documentation: github.com/alecthomas/chroma/lexers/m

     1  package m
     2  
     3  import (
     4  	"regexp"
     5  
     6  	. "github.com/alecthomas/chroma" // nolint
     7  	"github.com/alecthomas/chroma/lexers/internal"
     8  )
     9  
    10  var (
    11  	mysqlAnalyserNameBetweenBacktickRe = regexp.MustCompile("`[a-zA-Z_]\\w*`")
    12  	mysqlAnalyserNameBetweenBracketRe  = regexp.MustCompile(`\[[a-zA-Z_]\w*\]`)
    13  )
    14  
    15  // MySQL lexer.
    16  var MySQL = internal.Register(MustNewLazyLexer(
    17  	&Config{
    18  		Name:            "MySQL",
    19  		Aliases:         []string{"mysql"},
    20  		Filenames:       []string{"*.sql"},
    21  		MimeTypes:       []string{"text/x-mysql"},
    22  		NotMultiline:    true,
    23  		CaseInsensitive: true,
    24  	},
    25  	mySQLRules,
    26  ).SetAnalyser(func(text string) float32 {
    27  	nameBetweenBacktickCount := len(mysqlAnalyserNameBetweenBacktickRe.FindAllString(text, -1))
    28  	nameBetweenBracketCount := len(mysqlAnalyserNameBetweenBracketRe.FindAllString(text, -1))
    29  
    30  	var result float32
    31  
    32  	// Same logic as above in the TSQL analysis.
    33  	dialectNameCount := nameBetweenBacktickCount + nameBetweenBracketCount
    34  	if dialectNameCount >= 1 && nameBetweenBacktickCount >= (2*nameBetweenBracketCount) {
    35  		// Found at least twice as many `name` as [name].
    36  		result += 0.5
    37  	} else if nameBetweenBacktickCount > nameBetweenBracketCount {
    38  		result += 0.2
    39  	} else if nameBetweenBacktickCount > 0 {
    40  		result += 0.1
    41  	}
    42  
    43  	return result
    44  }))
    45  
    46  func mySQLRules() Rules {
    47  	return Rules{
    48  		"root": {
    49  			{`\s+`, TextWhitespace, nil},
    50  			{`(#|--\s+).*\n?`, CommentSingle, nil},
    51  			{`/\*`, CommentMultiline, Push("multiline-comments")},
    52  			{`[0-9]+`, LiteralNumberInteger, nil},
    53  			{`[0-9]*\.[0-9]+(e[+-][0-9]+)`, LiteralNumberFloat, nil},
    54  			{`((?:_[a-z0-9]+)?)(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Push("string")},
    55  			{`((?:_[a-z0-9]+)?)(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Push("double-string")},
    56  			{"[+*/<>=~!@#%^&|`?-]", Operator, nil},
    57  			{`\b(tinyint|smallint|mediumint|int|integer|bigint|date|datetime|time|bit|bool|tinytext|mediumtext|longtext|text|tinyblob|mediumblob|longblob|blob|float|double|double\s+precision|real|numeric|dec|decimal|timestamp|year|char|varchar|varbinary|varcharacter|enum|set)(\b\s*)(\()?`, ByGroups(KeywordType, TextWhitespace, Punctuation), nil},
    58  			{`\b(add|all|alter|analyze|and|as|asc|asensitive|before|between|bigint|binary|blob|both|by|call|cascade|case|change|char|character|check|collate|column|condition|constraint|continue|convert|create|cross|current_date|current_time|current_timestamp|current_user|cursor|database|databases|day_hour|day_microsecond|day_minute|day_second|dec|decimal|declare|default|delayed|delete|desc|describe|deterministic|distinct|distinctrow|div|double|drop|dual|each|else|elseif|enclosed|escaped|exists|exit|explain|fetch|flush|float|float4|float8|for|force|foreign|from|fulltext|grant|group|having|high_priority|hour_microsecond|hour_minute|hour_second|identified|if|ignore|in|index|infile|inner|inout|insensitive|insert|int|int1|int2|int3|int4|int8|integer|interval|into|is|iterate|join|key|keys|kill|leading|leave|left|like|limit|lines|load|localtime|localtimestamp|lock|long|loop|low_priority|match|minute_microsecond|minute_second|mod|modifies|natural|no_write_to_binlog|not|numeric|on|optimize|option|optionally|or|order|out|outer|outfile|precision|primary|privileges|procedure|purge|raid0|read|reads|real|references|regexp|release|rename|repeat|replace|require|restrict|return|revoke|right|rlike|schema|schemas|second_microsecond|select|sensitive|separator|set|show|smallint|soname|spatial|specific|sql|sql_big_result|sql_calc_found_rows|sql_small_result|sqlexception|sqlstate|sqlwarning|ssl|starting|straight_join|table|terminated|then|to|trailing|trigger|undo|union|unique|unlock|unsigned|update|usage|use|user|using|utc_date|utc_time|utc_timestamp|values|varying|when|where|while|with|write|x509|xor|year_month|zerofill)\b`, Keyword, nil},
    59  			{`\b(auto_increment|engine|charset|tables)\b`, KeywordPseudo, nil},
    60  			{`(true|false|null)`, NameConstant, nil},
    61  			{`([a-z_]\w*)(\s*)(\()`, ByGroups(NameFunction, TextWhitespace, Punctuation), nil},
    62  			{`[a-z_]\w*`, Name, nil},
    63  			{`@[a-z0-9]*[._]*[a-z0-9]*`, NameVariable, nil},
    64  			{`[;:()\[\],.]`, Punctuation, nil},
    65  		},
    66  		"multiline-comments": {
    67  			{`/\*`, CommentMultiline, Push("multiline-comments")},
    68  			{`\*/`, CommentMultiline, Pop(1)},
    69  			{`[^/*]+`, CommentMultiline, nil},
    70  			{`[/*]`, CommentMultiline, nil},
    71  		},
    72  		"string": {
    73  			{`[^']+`, LiteralStringSingle, nil},
    74  			{`''`, LiteralStringSingle, nil},
    75  			{`'`, LiteralStringSingle, Pop(1)},
    76  		},
    77  		"double-string": {
    78  			{`[^"]+`, LiteralStringDouble, nil},
    79  			{`""`, LiteralStringDouble, nil},
    80  			{`"`, LiteralStringDouble, Pop(1)},
    81  		},
    82  	}
    83  }
    84  

View as plain text