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.

types.go 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. package chroma
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. //go:generate stringer -type TokenType
  7. // TokenType is the type of token to highlight.
  8. //
  9. // It is also an Emitter, emitting a single token of itself
  10. type TokenType int
  11. func (t TokenType) MarshalJSON() ([]byte, error) { return json.Marshal(t.String()) }
  12. func (t *TokenType) UnmarshalJSON(data []byte) error {
  13. key := ""
  14. err := json.Unmarshal(data, &key)
  15. if err != nil {
  16. return err
  17. }
  18. for tt, text := range _TokenType_map {
  19. if text == key {
  20. *t = tt
  21. return nil
  22. }
  23. }
  24. return fmt.Errorf("unknown TokenType %q", data)
  25. }
  26. // Set of TokenTypes.
  27. //
  28. // Categories of types are grouped in ranges of 1000, while sub-categories are in ranges of 100. For
  29. // example, the literal category is in the range 3000-3999. The sub-category for literal strings is
  30. // in the range 3100-3199.
  31. // Meta token types.
  32. const (
  33. // Default background style.
  34. Background TokenType = -1 - iota
  35. // Line numbers in output.
  36. LineNumbers
  37. // Line numbers in output when in table.
  38. LineNumbersTable
  39. // Line higlight style.
  40. LineHighlight
  41. // Line numbers table wrapper style.
  42. LineTable
  43. // Line numbers table TD wrapper style.
  44. LineTableTD
  45. // Input that could not be tokenised.
  46. Error
  47. // Other is used by the Delegate lexer to indicate which tokens should be handled by the delegate.
  48. Other
  49. // No highlighting.
  50. None
  51. // Used as an EOF marker / nil token
  52. EOFType TokenType = 0
  53. )
  54. // Keywords.
  55. const (
  56. Keyword TokenType = 1000 + iota
  57. KeywordConstant
  58. KeywordDeclaration
  59. KeywordNamespace
  60. KeywordPseudo
  61. KeywordReserved
  62. KeywordType
  63. )
  64. // Names.
  65. const (
  66. Name TokenType = 2000 + iota
  67. NameAttribute
  68. NameBuiltin
  69. NameBuiltinPseudo
  70. NameClass
  71. NameConstant
  72. NameDecorator
  73. NameEntity
  74. NameException
  75. NameFunction
  76. NameFunctionMagic
  77. NameKeyword
  78. NameLabel
  79. NameNamespace
  80. NameOperator
  81. NameOther
  82. NamePseudo
  83. NameProperty
  84. NameTag
  85. NameVariable
  86. NameVariableAnonymous
  87. NameVariableClass
  88. NameVariableGlobal
  89. NameVariableInstance
  90. NameVariableMagic
  91. )
  92. // Literals.
  93. const (
  94. Literal TokenType = 3000 + iota
  95. LiteralDate
  96. LiteralOther
  97. )
  98. // Strings.
  99. const (
  100. LiteralString TokenType = 3100 + iota
  101. LiteralStringAffix
  102. LiteralStringAtom
  103. LiteralStringBacktick
  104. LiteralStringBoolean
  105. LiteralStringChar
  106. LiteralStringDelimiter
  107. LiteralStringDoc
  108. LiteralStringDouble
  109. LiteralStringEscape
  110. LiteralStringHeredoc
  111. LiteralStringInterpol
  112. LiteralStringName
  113. LiteralStringOther
  114. LiteralStringRegex
  115. LiteralStringSingle
  116. LiteralStringSymbol
  117. )
  118. // Literals.
  119. const (
  120. LiteralNumber TokenType = 3200 + iota
  121. LiteralNumberBin
  122. LiteralNumberFloat
  123. LiteralNumberHex
  124. LiteralNumberInteger
  125. LiteralNumberIntegerLong
  126. LiteralNumberOct
  127. )
  128. // Operators.
  129. const (
  130. Operator TokenType = 4000 + iota
  131. OperatorWord
  132. )
  133. // Punctuation.
  134. const (
  135. Punctuation TokenType = 5000 + iota
  136. )
  137. // Comments.
  138. const (
  139. Comment TokenType = 6000 + iota
  140. CommentHashbang
  141. CommentMultiline
  142. CommentSingle
  143. CommentSpecial
  144. )
  145. // Preprocessor "comments".
  146. const (
  147. CommentPreproc TokenType = 6100 + iota
  148. CommentPreprocFile
  149. )
  150. // Generic tokens.
  151. const (
  152. Generic TokenType = 7000 + iota
  153. GenericDeleted
  154. GenericEmph
  155. GenericError
  156. GenericHeading
  157. GenericInserted
  158. GenericOutput
  159. GenericPrompt
  160. GenericStrong
  161. GenericSubheading
  162. GenericTraceback
  163. GenericUnderline
  164. )
  165. // Text.
  166. const (
  167. Text TokenType = 8000 + iota
  168. TextWhitespace
  169. TextSymbol
  170. TextPunctuation
  171. )
  172. // Aliases.
  173. const (
  174. Whitespace = TextWhitespace
  175. Date = LiteralDate
  176. String = LiteralString
  177. StringAffix = LiteralStringAffix
  178. StringBacktick = LiteralStringBacktick
  179. StringChar = LiteralStringChar
  180. StringDelimiter = LiteralStringDelimiter
  181. StringDoc = LiteralStringDoc
  182. StringDouble = LiteralStringDouble
  183. StringEscape = LiteralStringEscape
  184. StringHeredoc = LiteralStringHeredoc
  185. StringInterpol = LiteralStringInterpol
  186. StringOther = LiteralStringOther
  187. StringRegex = LiteralStringRegex
  188. StringSingle = LiteralStringSingle
  189. StringSymbol = LiteralStringSymbol
  190. Number = LiteralNumber
  191. NumberBin = LiteralNumberBin
  192. NumberFloat = LiteralNumberFloat
  193. NumberHex = LiteralNumberHex
  194. NumberInteger = LiteralNumberInteger
  195. NumberIntegerLong = LiteralNumberIntegerLong
  196. NumberOct = LiteralNumberOct
  197. )
  198. var (
  199. StandardTypes = map[TokenType]string{
  200. Background: "chroma",
  201. LineNumbers: "ln",
  202. LineNumbersTable: "lnt",
  203. LineHighlight: "hl",
  204. LineTable: "lntable",
  205. LineTableTD: "lntd",
  206. Text: "",
  207. Whitespace: "w",
  208. Error: "err",
  209. Other: "x",
  210. // I have no idea what this is used for...
  211. // Escape: "esc",
  212. Keyword: "k",
  213. KeywordConstant: "kc",
  214. KeywordDeclaration: "kd",
  215. KeywordNamespace: "kn",
  216. KeywordPseudo: "kp",
  217. KeywordReserved: "kr",
  218. KeywordType: "kt",
  219. Name: "n",
  220. NameAttribute: "na",
  221. NameBuiltin: "nb",
  222. NameBuiltinPseudo: "bp",
  223. NameClass: "nc",
  224. NameConstant: "no",
  225. NameDecorator: "nd",
  226. NameEntity: "ni",
  227. NameException: "ne",
  228. NameFunction: "nf",
  229. NameFunctionMagic: "fm",
  230. NameProperty: "py",
  231. NameLabel: "nl",
  232. NameNamespace: "nn",
  233. NameOther: "nx",
  234. NameTag: "nt",
  235. NameVariable: "nv",
  236. NameVariableClass: "vc",
  237. NameVariableGlobal: "vg",
  238. NameVariableInstance: "vi",
  239. NameVariableMagic: "vm",
  240. Literal: "l",
  241. LiteralDate: "ld",
  242. String: "s",
  243. StringAffix: "sa",
  244. StringBacktick: "sb",
  245. StringChar: "sc",
  246. StringDelimiter: "dl",
  247. StringDoc: "sd",
  248. StringDouble: "s2",
  249. StringEscape: "se",
  250. StringHeredoc: "sh",
  251. StringInterpol: "si",
  252. StringOther: "sx",
  253. StringRegex: "sr",
  254. StringSingle: "s1",
  255. StringSymbol: "ss",
  256. Number: "m",
  257. NumberBin: "mb",
  258. NumberFloat: "mf",
  259. NumberHex: "mh",
  260. NumberInteger: "mi",
  261. NumberIntegerLong: "il",
  262. NumberOct: "mo",
  263. Operator: "o",
  264. OperatorWord: "ow",
  265. Punctuation: "p",
  266. Comment: "c",
  267. CommentHashbang: "ch",
  268. CommentMultiline: "cm",
  269. CommentPreproc: "cp",
  270. CommentPreprocFile: "cpf",
  271. CommentSingle: "c1",
  272. CommentSpecial: "cs",
  273. Generic: "g",
  274. GenericDeleted: "gd",
  275. GenericEmph: "ge",
  276. GenericError: "gr",
  277. GenericHeading: "gh",
  278. GenericInserted: "gi",
  279. GenericOutput: "go",
  280. GenericPrompt: "gp",
  281. GenericStrong: "gs",
  282. GenericSubheading: "gu",
  283. GenericTraceback: "gt",
  284. GenericUnderline: "gl",
  285. }
  286. )
  287. func (t TokenType) Parent() TokenType {
  288. if t%100 != 0 {
  289. return t / 100 * 100
  290. }
  291. if t%1000 != 0 {
  292. return t / 1000 * 1000
  293. }
  294. return 0
  295. }
  296. func (t TokenType) Category() TokenType {
  297. return t / 1000 * 1000
  298. }
  299. func (t TokenType) SubCategory() TokenType {
  300. return t / 100 * 100
  301. }
  302. func (t TokenType) InCategory(other TokenType) bool {
  303. return t/1000 == other/1000
  304. }
  305. func (t TokenType) InSubCategory(other TokenType) bool {
  306. return t/100 == other/100
  307. }
  308. func (t TokenType) Emit(groups []string, lexer Lexer) Iterator {
  309. return Literator(Token{Type: t, Value: groups[0]})
  310. }