syntax.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. #include "header.h"
  2. /* Syntax Highlighting is kinda goofy and no where near advanced.
  3. The goal isn't to be advanced but to give your eyes a little bit
  4. of contrast.
  5. Firstly, you can highlight keywords such as "if" or "else". Then,
  6. you give it the color you want it to be. The general rule of thumb
  7. is that functions, methods, macros, or statements are given the ID
  8. of ID_FUNCTION. Varible, types, and other defining syntax is given
  9. ID_SYMBOL. Secondary type definitions such as "long" in C or
  10. "default" in JS are generally given TB_DIGIT. Contants such as
  11. NULL, null, true/false, etc. are given ID_CONSTANT.
  12. This is very much still a work in progress.
  13. Key:
  14. - , means all (excluding symbols)
  15. - , beginning of line (only highlight when the match is at the
  16. beginning of the line
  17. - , complete, all chars
  18. - , disregard (ignore everything before it)
  19. - , all printable chars (no spaces, tabs, etc.)
  20. - , all space chars (spaces, tabs, etc.)
  21. - , omit, don't highlight this character.
  22. This is used to reduce the highlight from left to right
  23. - , exclude, don't highlight this character.
  24. This is used to reduce the highlight from right to left.
  25. */
  26. syntax_t csyn[] = {
  27. {"<>", ID_DIGITS},
  28. {"if", ID_FUNCTION}, {"else", ID_FUNCTION}, {"for", ID_FUNCTION},
  29. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  30. {"void", ID_SYMBOL}, {"#", ID_FUNCTION}, {"int", ID_SYMBOL}, {"enum", ID_SYMBOL},
  31. {"char", ID_SYMBOL}, {"const", ID_DIGITS}, {"unsigned", ID_DIGITS}, {"static", ID_DIGITS},
  32. {"assert", ID_FUNCTION}, {"break", ID_FUNCTION}, {"switch", ID_FUNCTION},
  33. {"continue", ID_FUNCTION},
  34. {"case", ID_FUNCTION}, {"NULL", ID_CONSTANT}, {"long", ID_DIGITS}, {"struct", ID_DIGITS},
  35. {"typedef", ID_SYMBOL}, {"_t", ID_SYMBOL},
  36. {"TRUE", ID_CONSTANT}, {"FALSE", ID_CONSTANT}, {NULL}};
  37. syntax_t htmlsyn[] = {
  38. {"</>", ID_FUNCTION}, {"</>", ID_FUNCTION},
  39. {"<>", ID_FUNCTION}, {"<!", ID_FUNCTION}, {"<", ID_FUNCTION},
  40. {NULL}
  41. };
  42. syntax_t jssyn[] = {{"if", ID_FUNCTION}, {"else", ID_FUNCTION}, {"for", ID_FUNCTION},
  43. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  44. {"const", ID_SYMBOL}, {"let", ID_SYMBOL}, {"var", ID_SYMBOL},
  45. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION}, {"export", ID_FUNCTION},
  46. {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION}, {"null", ID_CONSTANT},
  47. {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  48. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  49. {"function", ID_SYMBOL}, {"new", ID_DIGITS}, {"try", ID_FUNCTION},
  50. {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION}, {"async", ID_DIGITS},
  51. {"await", ID_DIGITS},
  52. {NULL}};
  53. syntax_t tssyn[] = {
  54. {"interface", ID_FUNCTION}, {"type", ID_FUNCTION}, {"as", ID_DIGITS},
  55. {"<, , >", ID_FUNCTION}, {"<, >", ID_FUNCTION},
  56. {"<>", ID_FUNCTION},
  57. // below is the same as jssyn
  58. {"if", ID_FUNCTION}, {"else", ID_FUNCTION},
  59. {"for", ID_FUNCTION},
  60. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  61. {"const", ID_SYMBOL}, {"let", ID_SYMBOL}, {"var", ID_SYMBOL},
  62. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION}, {"export", ID_FUNCTION},
  63. {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION}, {"null", ID_CONSTANT},
  64. {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  65. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  66. {"function", ID_SYMBOL}, {"new", ID_DIGITS}, {"try", ID_FUNCTION},
  67. {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION}, {"async", ID_DIGITS},
  68. {"await", ID_DIGITS}, {"extends", ID_SYMBOL},
  69. {NULL}};
  70. syntax_t jsxsyn[] = {
  71. // below is the same as htmlsyn
  72. {"</>", ID_FUNCTION}, {"</>", ID_FUNCTION},
  73. {"<>", ID_FUNCTION}, {"<", ID_FUNCTION},
  74. // below is the same as jssyn
  75. {"if", ID_FUNCTION}, {"else", ID_FUNCTION},
  76. {"for", ID_FUNCTION},
  77. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  78. {"const", ID_SYMBOL}, {"let", ID_SYMBOL}, {"var", ID_SYMBOL},
  79. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION}, {"export", ID_FUNCTION},
  80. {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION}, {"null", ID_CONSTANT},
  81. {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  82. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  83. {"function", ID_SYMBOL}, {"new", ID_DIGITS}, {"try", ID_FUNCTION},
  84. {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION}, {"async", ID_DIGITS},
  85. {"await", ID_DIGITS}, {"extends", ID_SYMBOL},
  86. {NULL}};
  87. syntax_t tsxsyn[] = {
  88. // below is the same as htmlsyn
  89. {"</>", ID_FUNCTION}, {"</>", ID_FUNCTION},
  90. // below is the same as tssyn
  91. {"<, , >", ID_FUNCTION}, {"<, >", ID_FUNCTION},
  92. {"<>", ID_FUNCTION},
  93. // below is the same as htmlsyn
  94. {"<", ID_FUNCTION},
  95. // below is the same as tssyn
  96. {"interface", ID_FUNCTION}, {"type", ID_FUNCTION}, {"as", ID_DIGITS},
  97. // below is the same as jssyn
  98. {"if", ID_FUNCTION}, {"else", ID_FUNCTION},
  99. {"for", ID_FUNCTION},
  100. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  101. {"const", ID_SYMBOL}, {"let", ID_SYMBOL}, {"var", ID_SYMBOL},
  102. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION}, {"export", ID_FUNCTION},
  103. {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION}, {"null", ID_CONSTANT},
  104. {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  105. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  106. {"function", ID_SYMBOL}, {"new", ID_DIGITS}, {"try", ID_FUNCTION},
  107. {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION}, {"async", ID_DIGITS},
  108. {"await", ID_DIGITS},
  109. {NULL}};
  110. syntax_t awksyn[] = {{"if", ID_FUNCTION}, {"else", ID_FUNCTION}, {"for", ID_FUNCTION},
  111. {"return", ID_FUNCTION}, {"while", ID_FUNCTION}, {"BEGIN", ID_FUNCTION},
  112. {"END", ID_FUNCTION},
  113. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION},
  114. {"case", ID_FUNCTION}, {"NULL", ID_CONSTANT},{"TRUE", ID_CONSTANT},
  115. {"FALSE", ID_CONSTANT}, {NULL}};
  116. syntax_t mdsyn[] = {
  117. {"[]()", ID_CONSTANT}, {"__", ID_CONSTANT}, {"****", ID_FUNCTION},
  118. {"**", ID_FUNCTION}, {"~~~~", ID_SYMBOL}, {"#", ID_SYMBOL},
  119. {NULL}};
  120. syntax_t luasyn[] = {
  121. {"if", ID_FUNCTION}, {"else", ID_FUNCTION}, {"for", ID_FUNCTION},
  122. {"return", ID_FUNCTION}, {"while", ID_FUNCTION}, {"elseif", ID_FUNCTION},
  123. {"local", ID_SYMBOL},
  124. {"assert", ID_FUNCTION}, {"break", ID_FUNCTION}, {"switch", ID_FUNCTION},
  125. {"continue", ID_FUNCTION}, {"function", ID_FUNCTION}, {"end", ID_FUNCTION},
  126. {"case", ID_FUNCTION}, {"nil", ID_CONSTANT}, {"then", ID_SYMBOL},
  127. {"true", ID_CONSTANT}, {"false", ID_CONSTANT}, {NULL}};
  128. /* TODO for haskell:
  129. foreign
  130. hiding
  131. infix, infixl, infixr
  132. mdo
  133. newtype
  134. proc
  135. rec
  136. type
  137. type family
  138. type instance
  139. */
  140. syntax_t hssyn[]= {
  141. {"as", ID_DIGITS}, {"case", ID_FUNCTION}, {"of", ID_DIGITS}, {"class", ID_FUNCTION},
  142. {"data family", ID_SYMBOL}, {"data instance", ID_SYMBOL}, {"data", ID_SYMBOL},
  143. {"default", ID_DIGITS}, {"deriving instance", ID_SYMBOL}, {"deriving", ID_SYMBOL},
  144. {"do", ID_FUNCTION}, {"forall", ID_SYMBOL}, {"if", ID_FUNCTION}, {"else", ID_FUNCTION},
  145. {"then", ID_DIGITS}, {"module", ID_FUNCTION}, {"where", ID_FUNCTION},
  146. {"import", ID_FUNCTION}, {"qualified", ID_DIGITS}, {"let", ID_FUNCTION},
  147. {"in", ID_DIGITS}, {"instance", ID_FUNCTION},
  148. {NULL}};
  149. /* WIP */
  150. syntax_t datsyn[] = {
  151. {"-$", ID_FUNCTION}, {NULL},
  152. };
  153. /* WIP */
  154. syntax_t sqlsyn[] = {
  155. {"SELECT", ID_FUNCTION}, {"select", ID_FUNCTION}, {"FROM", ID_FUNCTION}, {"from", ID_FUNCTION},
  156. {"WHERE", ID_FUNCTION}, {"where", ID_FUNCTION}, {"ORDER BY", ID_FUNCTION}, {"order BY", ID_FUNCTION},
  157. {"GROUP BY", ID_FUNCTION}, {"group BY", ID_FUNCTION}, {"HAVING", ID_DIGITS}, {"having", ID_DIGITS},
  158. {"INSERT INTO", ID_FUNCTION}, {"insert into", ID_FUNCTION},
  159. {"UPDATE", ID_FUNCTION}, {"update", ID_FUNCTION}, {"DELETE", ID_FUNCTION}, {"delete", ID_FUNCTION},
  160. {"CREATE", ID_FUNCTION}, {"create", ID_FUNCTION}, {"ALTER", ID_FUNCTION}, {"alter", ID_FUNCTION},
  161. {"JOIN", ID_SYMBOL}, {"join", ID_SYMBOL}, {"UNION", ID_FUNCTION}, {"union", ID_FUNCTION},
  162. {"LIKE", ID_FUNCTION}, {"like", ID_FUNCTION}, {"IN", ID_DIGITS}, {"in", ID_DIGITS},
  163. {"EXISTS", ID_DIGITS}, {"exists", ID_DIGITS}, {"NOT", ID_FUNCTION}, {"not", ID_FUNCTION},
  164. {"AND", ID_FUNCTION}, {"and", ID_FUNCTION}, {"OR", ID_FUNCTION}, {"or", ID_FUNCTION},
  165. {"BETWEEN", ID_FUNCTION}, {"between", ID_FUNCTION}, {"DISTINCT", ID_DIGITS}, {"distinct", ID_DIGITS},
  166. {"NULL", ID_CONSTANT}, {"null", ID_CONSTANT}, {"COUNT", ID_FUNCTION}, {"count", ID_FUNCTION},
  167. {"SUM", ID_FUNCTION}, {"sum", ID_FUNCTION}, {"AVG", ID_FUNCTION}, {"avg", ID_FUNCTION},
  168. {"MIN", ID_FUNCTION}, {"min", ID_FUNCTION}, {"MAX", ID_FUNCTION}, {"max", ID_FUNCTION},
  169. {"AS", ID_DIGITS}, {"as", ID_DIGITS}, {"IF", ID_FUNCTION}, {"if", ID_FUNCTION},
  170. {"SET", ID_FUNCTION}, {"set", ID_FUNCTION}, {"ADD", ID_FUNCTION}, {"add", ID_FUNCTION},
  171. {"FALSE", ID_CONSTANT}, {"false", ID_CONSTANT}, {"TRUE", ID_CONSTANT}, {"true", ID_CONSTANT},
  172. {NULL}
  173. };
  174. syntax_t javasyn[] = {{"if", ID_FUNCTION}, {"else", ID_FUNCTION}, {"for", ID_FUNCTION},
  175. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  176. {"class", ID_SYMBOL}, {"break", ID_FUNCTION}, {"switch", ID_FUNCTION},
  177. {"export", ID_FUNCTION}, {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION},
  178. {"null", ID_CONSTANT}, {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  179. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  180. {"try", ID_FUNCTION}, {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION},
  181. {"package", ID_FUNCTION}, {"override", ID_DIGITS}, {"private", ID_DIGITS},
  182. {"public", ID_DIGITS}, {"object", ID_SYMBOL},
  183. {NULL}};
  184. syntax_t ktsyn[] = {{"if", ID_FUNCTION}, {"else", ID_FUNCTION}, {"for", ID_FUNCTION},
  185. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  186. {"val", ID_SYMBOL}, {"class", ID_SYMBOL}, {"var", ID_SYMBOL},
  187. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION}, {"export", ID_FUNCTION},
  188. {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION}, {"null", ID_CONSTANT},
  189. {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  190. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  191. {"fun", ID_SYMBOL}, {"lateinit", ID_DIGITS}, {"open", ID_DIGITS},
  192. {"try", ID_FUNCTION}, {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION},
  193. {"package", ID_FUNCTION}, {"override", ID_DIGITS}, {"private", ID_DIGITS},
  194. {"public", ID_DIGITS}, {"object", ID_SYMBOL}, {"companion", ID_DIGITS},
  195. {NULL}};
  196. syntax_t mksyn[] = {
  197. {"$()", ID_CONSTANT}, {"?=", ID_CONSTANT}, {"?=", ID_CONSTANT},
  198. {"+=", ID_CONSTANT}, {"+=", ID_CONSTANT},
  199. {":=", ID_CONSTANT}, {":=", ID_CONSTANT},
  200. {":", ID_FUNCTION}, {":", ID_FUNCTION},
  201. {"=", ID_CONSTANT}, {"=", ID_CONSTANT},
  202. {NULL}};
  203. syntax_t lispsyn[] = {
  204. {"'", ID_CONSTANT}, {":", ID_SYMBOL}, {"#:", ID_SYMBOL},
  205. {"&", ID_DIGITS}, {"^", ID_DIGITS}, {"nil", ID_CONSTANT},
  206. {"t", ID_CONSTANT},
  207. {NULL}};
  208. syntax_t cljsyn[] = {
  209. {"'", ID_CONSTANT}, {"::", ID_SYMBOL}, {":", ID_SYMBOL},
  210. {"#:", ID_SYMBOL}, {"^", ID_DIGITS}, {"nil", ID_CONSTANT},
  211. {"true", ID_CONSTANT}, {"false", ID_CONSTANT}, {NULL}};
  212. syntax_t csssyn[] = {
  213. {":", ID_DIGITS}, {"!important", ID_FUNCTION}, {"@", ID_SYMBOL},
  214. {NULL}};
  215. syntax_t nixsyn[] = {
  216. {"let", ID_FUNCTION}, {"in", ID_DIGITS}, {"if", ID_FUNCTION},
  217. {"then", ID_DIGITS}, {"else", ID_FUNCTION}, {"with", ID_DIGITS},
  218. {"import", ID_FUNCTION}, {"rec", ID_FUNCTION}, {"inherit", ID_FUNCTION},
  219. {"assert", ID_SYMBOL}, {"builtins", ID_SYMBOL},
  220. {"derivation", ID_FUNCTION}, {"callPackage", ID_FUNCTION},
  221. {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  222. {NULL}};
  223. syntax_t shsyn[] = {
  224. {"export", ID_FUNCTION}, {"if", ID_FUNCTION}, {"then", ID_DIGITS},
  225. {"else", ID_FUNCTION}, {"fi", ID_FUNCTION}, {"case", ID_FUNCTION},
  226. {"esac", ID_FUNCTION}, {"for", ID_FUNCTION}, {"do", ID_DIGITS},
  227. {"done", ID_FUNCTION}, {"while", ID_FUNCTION}, {"until", ID_FUNCTION},
  228. {"function", ID_FUNCTION}, {"return", ID_FUNCTION},
  229. {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  230. {"echo", ID_FUNCTION}, {"test", ID_FUNCTION},
  231. {"=", ID_SYMBOL}, {"${}", ID_SYMBOL},
  232. {"$", ID_SYMBOL},
  233. {NULL}};
  234. /* list of keywords _must_ end with NULL */
  235. smode_t modes[] = {
  236. /* programming */
  237. {".c", "//", "/*", "*/", TRUE, FALSE, "", TRUE, csyn},
  238. {".h", "//", "/*", "*/", TRUE, FALSE, "", TRUE, csyn},
  239. {".css", "//", "/*", "*/", FALSE, FALSE, ".-", FALSE, csssyn},
  240. {".html", "", "<!--", "-->", FALSE, FALSE, "", FALSE, htmlsyn},
  241. {".js", "//", "/*", "*/", TRUE, TRUE, "", TRUE, jssyn},
  242. {".jsx", "//", "/*", "*/", TRUE, TRUE, "", TRUE, jsxsyn},
  243. {".ts", "//", "/*", "*/", TRUE, TRUE, "", TRUE, tssyn},
  244. {".tsx", "//", "/*", "*/", TRUE, TRUE, "", TRUE, tsxsyn},
  245. {".lisp", ";;", NULL, NULL, FALSE, FALSE, "-?!_", FALSE, lispsyn},
  246. {".clj", ";;", NULL, NULL, FALSE, FALSE, "-?!/_", FALSE, cljsyn},
  247. {".cljs", ";;", NULL, NULL, FALSE, FALSE, "-?!/_", FALSE, cljsyn},
  248. {".joke", ";;", NULL, NULL, FALSE, FALSE, "-?!/_", FALSE, cljsyn},
  249. {".hs", "--", NULL, NULL, FALSE, FALSE, "", FALSE, hssyn},
  250. {".sh", "#", NULL, NULL, FALSE, FALSE, "", FALSE, shsyn},
  251. {".awk", "#", NULL, NULL, FALSE, FALSE, "", TRUE, awksyn},
  252. {".java", "//", "/*", "*/", FALSE, FALSE, "", FALSE, javasyn},
  253. {".kt", "//", "/*", "*/", FALSE, TRUE, "", FALSE, ktsyn},
  254. {".sql", "--", NULL, NULL, FALSE, FALSE, "", FALSE, sqlsyn},
  255. {".nix", "#", NULL, NULL, TRUE, TRUE, "", FALSE, NULL},
  256. {".lua", "--", NULL, NULL, TRUE, FALSE, "", FALSE, luasyn},
  257. {"makefile", "#", NULL, NULL, TRUE, FALSE, "", FALSE, mksyn},
  258. {"Makefile", "#", NULL, NULL, TRUE, FALSE, "", FALSE, mksyn},
  259. {"GNUMakefile", "#", NULL, NULL, TRUE, FALSE, "", FALSE, mksyn},
  260. {".mk", "#", NULL, NULL, TRUE, FALSE, "", FALSE, mksyn},
  261. /* non-programming */
  262. {".md", NULL, NULL, NULL, FALSE, TRUE, "", FALSE, mdsyn},
  263. {".dat", ";;", NULL, NULL, FALSE, FALSE, ",.", FALSE, datsyn},
  264. {NULL, NULL, NULL, NULL, FALSE, FALSE, "", TRUE, NULL},
  265. };