syntax.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  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_DEFAULT}, {"</>", ID_DEFAULT},
  39. {"</>", ID_FUNCTION}, {"</>", ID_FUNCTION},
  40. {"<>", ID_FUNCTION}, {"<!", ID_FUNCTION}, {"<", ID_FUNCTION}, {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. // below is the same as jssyn
  56. {"if", ID_FUNCTION}, {"else", ID_FUNCTION},
  57. {"for", ID_FUNCTION},
  58. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  59. {"const", ID_SYMBOL}, {"let", ID_SYMBOL}, {"var", ID_SYMBOL},
  60. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION}, {"export", ID_FUNCTION},
  61. {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION}, {"null", ID_CONSTANT},
  62. {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  63. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  64. {"function", ID_SYMBOL}, {"new", ID_DIGITS}, {"try", ID_FUNCTION},
  65. {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION}, {"async", ID_DIGITS},
  66. {"await", ID_DIGITS},
  67. {NULL}};
  68. syntax_t jsxsyn[] = {
  69. // below is the same as htmlsyn
  70. {"<>", ID_DEFAULT}, {"</>", ID_DEFAULT},
  71. {"</>", ID_FUNCTION}, {"</>", ID_FUNCTION},
  72. {"<>", ID_FUNCTION}, {"<", ID_FUNCTION},
  73. // below is the same as jssyn
  74. {"if", ID_FUNCTION}, {"else", ID_FUNCTION},
  75. {"for", ID_FUNCTION},
  76. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  77. {"const", ID_SYMBOL}, {"let", ID_SYMBOL}, {"var", ID_SYMBOL},
  78. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION}, {"export", ID_FUNCTION},
  79. {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION}, {"null", ID_CONSTANT},
  80. {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  81. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  82. {"function", ID_SYMBOL}, {"new", ID_DIGITS}, {"try", ID_FUNCTION},
  83. {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION}, {"async", ID_DIGITS},
  84. {"await", ID_DIGITS},
  85. {NULL}};
  86. syntax_t tsxsyn[] = {
  87. // below is the same as htmlsyn
  88. {"<>", ID_DEFAULT}, {"</>", ID_DEFAULT},
  89. {"</>", ID_FUNCTION}, {"</>", ID_FUNCTION},
  90. {"<>", ID_FUNCTION}, {"<", ID_FUNCTION},
  91. // below is the same as tssyn
  92. {"interface", ID_FUNCTION}, {"type", ID_FUNCTION}, {"as", ID_DIGITS},
  93. // below is the same as jssyn
  94. {"if", ID_FUNCTION}, {"else", ID_FUNCTION},
  95. {"for", ID_FUNCTION},
  96. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  97. {"const", ID_SYMBOL}, {"let", ID_SYMBOL}, {"var", ID_SYMBOL},
  98. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION}, {"export", ID_FUNCTION},
  99. {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION}, {"null", ID_CONSTANT},
  100. {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  101. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  102. {"function", ID_SYMBOL}, {"new", ID_DIGITS}, {"try", ID_FUNCTION},
  103. {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION}, {"async", ID_DIGITS},
  104. {"await", ID_DIGITS},
  105. {NULL}};
  106. syntax_t awksyn[] = {{"if", ID_FUNCTION}, {"else", ID_FUNCTION}, {"for", ID_FUNCTION},
  107. {"return", ID_FUNCTION}, {"while", ID_FUNCTION}, {"BEGIN", ID_FUNCTION},
  108. {"END", ID_FUNCTION},
  109. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION},
  110. {"case", ID_FUNCTION}, {"NULL", ID_CONSTANT},{"TRUE", ID_CONSTANT},
  111. {"FALSE", ID_CONSTANT}, {NULL}};
  112. syntax_t mdsyn[] = {
  113. {"__", ID_CONSTANT}, {"**", ID_FUNCTION},
  114. {"#", ID_SYMBOL}, {"[]()", ID_CONSTANT},
  115. {"~~~~", ID_SYMBOL},
  116. {NULL}};
  117. syntax_t luasyn[] = {
  118. {"if", ID_FUNCTION}, {"else", ID_FUNCTION}, {"for", ID_FUNCTION},
  119. {"return", ID_FUNCTION}, {"while", ID_FUNCTION}, {"elseif", ID_FUNCTION},
  120. {"local", ID_SYMBOL},
  121. {"assert", ID_FUNCTION}, {"break", ID_FUNCTION}, {"switch", ID_FUNCTION},
  122. {"continue", ID_FUNCTION}, {"function", ID_FUNCTION}, {"end", ID_FUNCTION},
  123. {"case", ID_FUNCTION}, {"nil", ID_CONSTANT}, {"then", ID_SYMBOL},
  124. {"true", ID_CONSTANT}, {"false", ID_CONSTANT}, {NULL}};
  125. /* TODO for haskell:
  126. foreign
  127. hiding
  128. infix, infixl, infixr
  129. mdo
  130. newtype
  131. proc
  132. rec
  133. type
  134. type family
  135. type instance
  136. */
  137. syntax_t hssyn[]= {
  138. {"as", ID_DIGITS}, {"case", ID_FUNCTION}, {"of", ID_DIGITS}, {"class", ID_FUNCTION},
  139. {"data family", ID_SYMBOL}, {"data instance", ID_SYMBOL}, {"data", ID_SYMBOL},
  140. {"default", ID_DIGITS}, {"deriving instance", ID_SYMBOL}, {"deriving", ID_SYMBOL},
  141. {"do", ID_FUNCTION}, {"forall", ID_SYMBOL}, {"if", ID_FUNCTION}, {"else", ID_FUNCTION},
  142. {"then", ID_DIGITS}, {"module", ID_FUNCTION}, {"where", ID_FUNCTION},
  143. {"import", ID_FUNCTION}, {"qualified", ID_DIGITS}, {"let", ID_FUNCTION},
  144. {"in", ID_DIGITS}, {"instance", ID_FUNCTION},
  145. {NULL}};
  146. /* WIP */
  147. syntax_t datsyn[] = {
  148. {"-$", ID_FUNCTION}, {NULL},
  149. };
  150. /* WIP */
  151. syntax_t sqlsyn[] = {
  152. {"SELECT", ID_FUNCTION}, {"select", ID_FUNCTION}, {"FROM", ID_FUNCTION}, {"from", ID_FUNCTION},
  153. {"WHERE", ID_FUNCTION}, {"where", ID_FUNCTION}, {"ORDER BY", ID_FUNCTION}, {"order BY", ID_FUNCTION},
  154. {"GROUP BY", ID_FUNCTION}, {"group BY", ID_FUNCTION}, {"HAVING", ID_DIGITS}, {"having", ID_DIGITS},
  155. {"INSERT INTO", ID_FUNCTION}, {"insert into", ID_FUNCTION},
  156. {"UPDATE", ID_FUNCTION}, {"update", ID_FUNCTION}, {"DELETE", ID_FUNCTION}, {"delete", ID_FUNCTION},
  157. {"CREATE", ID_FUNCTION}, {"create", ID_FUNCTION}, {"ALTER", ID_FUNCTION}, {"alter", ID_FUNCTION},
  158. {"JOIN", ID_SYMBOL}, {"join", ID_SYMBOL}, {"UNION", ID_FUNCTION}, {"union", ID_FUNCTION},
  159. {"LIKE", ID_FUNCTION}, {"like", ID_FUNCTION}, {"IN", ID_DIGITS}, {"in", ID_DIGITS},
  160. {"EXISTS", ID_DIGITS}, {"exists", ID_DIGITS}, {"NOT", ID_FUNCTION}, {"not", ID_FUNCTION},
  161. {"AND", ID_FUNCTION}, {"and", ID_FUNCTION}, {"OR", ID_FUNCTION}, {"or", ID_FUNCTION},
  162. {"BETWEEN", ID_FUNCTION}, {"between", ID_FUNCTION}, {"DISTINCT", ID_DIGITS}, {"distinct", ID_DIGITS},
  163. {"NULL", ID_CONSTANT}, {"null", ID_CONSTANT}, {"COUNT", ID_FUNCTION}, {"count", ID_FUNCTION},
  164. {"SUM", ID_FUNCTION}, {"sum", ID_FUNCTION}, {"AVG", ID_FUNCTION}, {"avg", ID_FUNCTION},
  165. {"MIN", ID_FUNCTION}, {"min", ID_FUNCTION}, {"MAX", ID_FUNCTION}, {"max", ID_FUNCTION},
  166. {"AS", ID_DIGITS}, {"as", ID_DIGITS}, {"IF", ID_FUNCTION}, {"if", ID_FUNCTION},
  167. {"SET", ID_FUNCTION}, {"set", ID_FUNCTION}, {"ADD", ID_FUNCTION}, {"add", ID_FUNCTION},
  168. {"FALSE", ID_CONSTANT}, {"false", ID_CONSTANT}, {"TRUE", ID_CONSTANT}, {"true", ID_CONSTANT},
  169. {NULL}
  170. };
  171. syntax_t javasyn[] = {{"if", ID_FUNCTION}, {"else", ID_FUNCTION}, {"for", ID_FUNCTION},
  172. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  173. {"class", ID_SYMBOL}, {"break", ID_FUNCTION}, {"switch", ID_FUNCTION},
  174. {"export", ID_FUNCTION}, {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION},
  175. {"null", ID_CONSTANT}, {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  176. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  177. {"try", ID_FUNCTION}, {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION},
  178. {"package", ID_FUNCTION}, {"override", ID_DIGITS}, {"private", ID_DIGITS},
  179. {"public", ID_DIGITS}, {"object", ID_SYMBOL},
  180. {NULL}};
  181. syntax_t ktsyn[] = {{"if", ID_FUNCTION}, {"else", ID_FUNCTION}, {"for", ID_FUNCTION},
  182. {"return", ID_FUNCTION}, {"while", ID_FUNCTION},
  183. {"val", ID_SYMBOL}, {"class", ID_SYMBOL}, {"var", ID_SYMBOL},
  184. {"break", ID_FUNCTION}, {"switch", ID_FUNCTION}, {"export", ID_FUNCTION},
  185. {"typeof", ID_FUNCTION}, {"case", ID_FUNCTION}, {"null", ID_CONSTANT},
  186. {"import", ID_FUNCTION}, {"from", ID_SYMBOL}, {"default", ID_DIGITS},
  187. {"undefined", ID_CONSTANT}, {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  188. {"fun", ID_SYMBOL}, {"lateinit", ID_DIGITS}, {"open", ID_DIGITS},
  189. {"try", ID_FUNCTION}, {"catch", ID_FUNCTION}, {"finally", ID_FUNCTION},
  190. {"package", ID_FUNCTION}, {"override", ID_DIGITS}, {"private", ID_DIGITS},
  191. {"public", ID_DIGITS}, {"object", ID_SYMBOL}, {"companion", ID_DIGITS},
  192. {NULL}};
  193. syntax_t mksyn[] = {
  194. {"$()", ID_CONSTANT}, {"?=", ID_CONSTANT}, {"?=", ID_CONSTANT},
  195. {":=", ID_CONSTANT}, {":=", ID_CONSTANT},
  196. {":", ID_FUNCTION}, {":", ID_FUNCTION},
  197. {"=", ID_CONSTANT}, {"=", ID_CONSTANT},
  198. {NULL}};
  199. syntax_t lispsyn[] = {
  200. {"'", ID_CONSTANT}, {":", ID_SYMBOL}, {"#:", ID_SYMBOL},
  201. {"&", ID_DIGITS}, {"^", ID_DIGITS}, {"nil", ID_CONSTANT},
  202. {"t", ID_CONSTANT},
  203. {NULL}};
  204. syntax_t cljsyn[] = {
  205. {"'", ID_CONSTANT}, {"::", ID_SYMBOL}, {":", ID_SYMBOL},
  206. {"#:", ID_SYMBOL}, {"^", ID_DIGITS}, {"nil", ID_CONSTANT},
  207. {"true", ID_CONSTANT}, {"false", ID_CONSTANT}, {NULL}};
  208. syntax_t csssyn[] = {
  209. {":", ID_DIGITS}, {"!important", ID_FUNCTION}, {"@", ID_SYMBOL},
  210. {NULL}};
  211. syntax_t nixsyn[] = {
  212. {"let", ID_FUNCTION}, {"in", ID_DIGITS}, {"if", ID_FUNCTION},
  213. {"then", ID_DIGITS}, {"else", ID_FUNCTION}, {"with", ID_DIGITS},
  214. {"import", ID_FUNCTION}, {"rec", ID_FUNCTION}, {"inherit", ID_FUNCTION},
  215. {"assert", ID_SYMBOL}, {"builtins", ID_SYMBOL},
  216. {"derivation", ID_FUNCTION}, {"callPackage", ID_FUNCTION},
  217. {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  218. {NULL}};
  219. syntax_t shsyn[] = {
  220. {"export", ID_FUNCTION}, {"if", ID_FUNCTION}, {"then", ID_DIGITS},
  221. {"else", ID_FUNCTION}, {"fi", ID_FUNCTION}, {"case", ID_FUNCTION},
  222. {"esac", ID_FUNCTION}, {"for", ID_FUNCTION}, {"do", ID_DIGITS},
  223. {"done", ID_FUNCTION}, {"while", ID_FUNCTION}, {"until", ID_FUNCTION},
  224. {"function", ID_FUNCTION}, {"return", ID_FUNCTION},
  225. {"true", ID_CONSTANT}, {"false", ID_CONSTANT},
  226. {"echo", ID_FUNCTION}, {"test", ID_FUNCTION},
  227. {"=", ID_SYMBOL}, {"${}", ID_SYMBOL},
  228. {"$", ID_SYMBOL},
  229. {NULL}};
  230. /* list of keywords _must_ end with NULL */
  231. smode_t modes[] = {
  232. /* programming */
  233. {".c", "//", "/*", "*/", TRUE, FALSE, "", TRUE, csyn},
  234. {".h", "//", "/*", "*/", TRUE, FALSE, "", TRUE, csyn},
  235. {".css", "//", "/*", "*/", FALSE, FALSE, ".-", FALSE, csssyn},
  236. {".html", "", "<!--", "-->", FALSE, FALSE, "", FALSE, htmlsyn},
  237. {".js", "//", "/*", "*/", TRUE, TRUE, "", TRUE, jssyn},
  238. {".jsx", "//", "/*", "*/", TRUE, TRUE, "", TRUE, jsxsyn},
  239. {".ts", "//", "/*", "*/", TRUE, TRUE, "", TRUE, tssyn},
  240. {".tsx", "//", "/*", "*/", TRUE, TRUE, "", TRUE, tsxsyn},
  241. {".lisp", ";;", NULL, NULL, FALSE, FALSE, "-?!_", FALSE, lispsyn},
  242. {".clj", ";;", NULL, NULL, FALSE, FALSE, "-?!/_", FALSE, cljsyn},
  243. {".cljs", ";;", NULL, NULL, FALSE, FALSE, "-?!/_", FALSE, cljsyn},
  244. {".joke", ";;", NULL, NULL, FALSE, FALSE, "-?!/_", FALSE, cljsyn},
  245. {".hs", "--", NULL, NULL, FALSE, FALSE, "", FALSE, hssyn},
  246. {".sh", "#", NULL, NULL, FALSE, FALSE, "", FALSE, shsyn},
  247. {".awk", "#", NULL, NULL, FALSE, FALSE, "", TRUE, awksyn},
  248. {".java", "//", "/*", "*/", FALSE, FALSE, "", FALSE, javasyn},
  249. {".kt", "//", "/*", "*/", FALSE, TRUE, "", FALSE, ktsyn},
  250. {".sql", "--", NULL, NULL, FALSE, FALSE, "", FALSE, sqlsyn},
  251. {".nix", "#", NULL, NULL, TRUE, TRUE, "", FALSE, NULL},
  252. {".lua", "--", NULL, NULL, TRUE, FALSE, "", FALSE, luasyn},
  253. {"makefile", "#", NULL, NULL, TRUE, FALSE, "", FALSE, mksyn},
  254. {"Makefile", "#", NULL, NULL, TRUE, FALSE, "", FALSE, mksyn},
  255. {"GNUMakefile", "#", NULL, NULL, TRUE, FALSE, "", FALSE, mksyn},
  256. {".mk", "#", NULL, NULL, TRUE, FALSE, "", FALSE, mksyn},
  257. /* non-programming */
  258. {".md", NULL, NULL, NULL, FALSE, TRUE, "", FALSE, mdsyn},
  259. {".dat", ";;", NULL, NULL, FALSE, FALSE, "", FALSE, datsyn},
  260. {NULL, NULL, NULL, NULL, FALSE, FALSE, "", TRUE, NULL},
  261. };