dart.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /*
  2. Language: Dart
  3. Requires: markdown.js
  4. Author: Maxim Dikun <dikmax@gmail.com>
  5. Description: Dart a modern, object-oriented language developed by Google. For more information see https://www.dartlang.org/
  6. Website: https://dart.dev
  7. Category: scripting
  8. */
  9. /** @type LanguageFn */
  10. function dart(hljs) {
  11. const SUBST = {
  12. className: 'subst',
  13. variants: [ { begin: '\\$[A-Za-z0-9_]+' } ]
  14. };
  15. const BRACED_SUBST = {
  16. className: 'subst',
  17. variants: [
  18. {
  19. begin: /\$\{/,
  20. end: /\}/
  21. }
  22. ],
  23. keywords: 'true false null this is new super'
  24. };
  25. const NUMBER = {
  26. className: 'number',
  27. relevance: 0,
  28. variants: [
  29. { match: /\b[0-9][0-9_]*(\.[0-9][0-9_]*)?([eE][+-]?[0-9][0-9_]*)?\b/ },
  30. { match: /\b0[xX][0-9A-Fa-f][0-9A-Fa-f_]*\b/ }
  31. ]
  32. };
  33. const STRING = {
  34. className: 'string',
  35. variants: [
  36. {
  37. begin: 'r\'\'\'',
  38. end: '\'\'\''
  39. },
  40. {
  41. begin: 'r"""',
  42. end: '"""'
  43. },
  44. {
  45. begin: 'r\'',
  46. end: '\'',
  47. illegal: '\\n'
  48. },
  49. {
  50. begin: 'r"',
  51. end: '"',
  52. illegal: '\\n'
  53. },
  54. {
  55. begin: '\'\'\'',
  56. end: '\'\'\'',
  57. contains: [
  58. hljs.BACKSLASH_ESCAPE,
  59. SUBST,
  60. BRACED_SUBST
  61. ]
  62. },
  63. {
  64. begin: '"""',
  65. end: '"""',
  66. contains: [
  67. hljs.BACKSLASH_ESCAPE,
  68. SUBST,
  69. BRACED_SUBST
  70. ]
  71. },
  72. {
  73. begin: '\'',
  74. end: '\'',
  75. illegal: '\\n',
  76. contains: [
  77. hljs.BACKSLASH_ESCAPE,
  78. SUBST,
  79. BRACED_SUBST
  80. ]
  81. },
  82. {
  83. begin: '"',
  84. end: '"',
  85. illegal: '\\n',
  86. contains: [
  87. hljs.BACKSLASH_ESCAPE,
  88. SUBST,
  89. BRACED_SUBST
  90. ]
  91. }
  92. ]
  93. };
  94. BRACED_SUBST.contains = [
  95. NUMBER,
  96. STRING
  97. ];
  98. const BUILT_IN_TYPES = [
  99. // dart:core
  100. 'Comparable',
  101. 'DateTime',
  102. 'Duration',
  103. 'Function',
  104. 'Iterable',
  105. 'Iterator',
  106. 'List',
  107. 'Map',
  108. 'Match',
  109. 'Object',
  110. 'Pattern',
  111. 'RegExp',
  112. 'Set',
  113. 'Stopwatch',
  114. 'String',
  115. 'StringBuffer',
  116. 'StringSink',
  117. 'Symbol',
  118. 'Type',
  119. 'Uri',
  120. 'bool',
  121. 'double',
  122. 'int',
  123. 'num',
  124. // dart:html
  125. 'Element',
  126. 'ElementList'
  127. ];
  128. const NULLABLE_BUILT_IN_TYPES = BUILT_IN_TYPES.map((e) => `${e}?`);
  129. const BASIC_KEYWORDS = [
  130. "abstract",
  131. "as",
  132. "assert",
  133. "async",
  134. "await",
  135. "base",
  136. "break",
  137. "case",
  138. "catch",
  139. "class",
  140. "const",
  141. "continue",
  142. "covariant",
  143. "default",
  144. "deferred",
  145. "do",
  146. "dynamic",
  147. "else",
  148. "enum",
  149. "export",
  150. "extends",
  151. "extension",
  152. "external",
  153. "factory",
  154. "false",
  155. "final",
  156. "finally",
  157. "for",
  158. "Function",
  159. "get",
  160. "hide",
  161. "if",
  162. "implements",
  163. "import",
  164. "in",
  165. "interface",
  166. "is",
  167. "late",
  168. "library",
  169. "mixin",
  170. "new",
  171. "null",
  172. "on",
  173. "operator",
  174. "part",
  175. "required",
  176. "rethrow",
  177. "return",
  178. "sealed",
  179. "set",
  180. "show",
  181. "static",
  182. "super",
  183. "switch",
  184. "sync",
  185. "this",
  186. "throw",
  187. "true",
  188. "try",
  189. "typedef",
  190. "var",
  191. "void",
  192. "when",
  193. "while",
  194. "with",
  195. "yield"
  196. ];
  197. const KEYWORDS = {
  198. keyword: BASIC_KEYWORDS,
  199. built_in:
  200. BUILT_IN_TYPES
  201. .concat(NULLABLE_BUILT_IN_TYPES)
  202. .concat([
  203. // dart:core
  204. 'Never',
  205. 'Null',
  206. 'dynamic',
  207. 'print',
  208. // dart:html
  209. 'document',
  210. 'querySelector',
  211. 'querySelectorAll',
  212. 'window'
  213. ]),
  214. $pattern: /[A-Za-z][A-Za-z0-9_]*\??/
  215. };
  216. return {
  217. name: 'Dart',
  218. keywords: KEYWORDS,
  219. contains: [
  220. STRING,
  221. hljs.COMMENT(
  222. /\/\*\*(?!\/)/,
  223. /\*\//,
  224. {
  225. subLanguage: 'markdown',
  226. relevance: 0
  227. }
  228. ),
  229. hljs.COMMENT(
  230. /\/{3,} ?/,
  231. /$/, { contains: [
  232. {
  233. subLanguage: 'markdown',
  234. begin: '.',
  235. end: '$',
  236. relevance: 0
  237. }
  238. ] }
  239. ),
  240. hljs.C_LINE_COMMENT_MODE,
  241. hljs.C_BLOCK_COMMENT_MODE,
  242. {
  243. className: 'class',
  244. beginKeywords: 'class interface',
  245. end: /\{/,
  246. excludeEnd: true,
  247. contains: [
  248. { beginKeywords: 'extends implements' },
  249. hljs.UNDERSCORE_TITLE_MODE
  250. ]
  251. },
  252. NUMBER,
  253. {
  254. className: 'meta',
  255. begin: '@[A-Za-z]+'
  256. },
  257. { begin: '=>' // No markup, just a relevance booster
  258. }
  259. ]
  260. };
  261. }
  262. export { dart as default };