prism.ts79 lines · main
1// Prism syntax highlighting referenced from Refractor
2// https://github.com/wooorm/refractor/blob/main/lang/dart.js
3
4export function dart(Prism: any) {
5 // Handles named imports, such as http.Client
6 const keywords = [
7 /\b(?:async|sync|yield)\*/,
8 /\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/,
9 ]
10
11 // based on the dart naming conventions
12 const packagePrefix = /(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source
13
14 const className = {
15 pattern: RegExp(packagePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),
16 lookbehind: true,
17 inside: {
18 namespace: {
19 pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,
20 inside: {
21 punctuation: /\./,
22 },
23 },
24 },
25 }
26
27 Prism.languages.dart = Prism.languages.extend('clike', {
28 'class-name': [
29 className,
30 {
31 // variables and parameters
32 // supports class names (or generic parameters) which do not contain a lower case letter (also works for methods)
33 pattern: RegExp(packagePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),
34 lookbehind: true,
35 inside: className.inside,
36 },
37 ],
38 keyword: keywords,
39 operator: /\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/,
40 })
41 Prism.languages.insertBefore('dart', 'string', {
42 'string-literal': {
43 pattern: /r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,
44 greedy: true,
45 inside: {
46 interpolation: {
47 pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,
48 lookbehind: true,
49 inside: {
50 punctuation: /^\$\{?|\}$/,
51 expression: {
52 pattern: /[\s\S]+/,
53 inside: Prism.languages.dart,
54 },
55 },
56 },
57 string: /[\s\S]+/,
58 },
59 },
60 string: undefined,
61 })
62 Prism.languages.insertBefore('dart', 'class-name', {
63 metadata: {
64 pattern: /@\w+/,
65 alias: 'function',
66 },
67 })
68 Prism.languages.insertBefore('dart', 'class-name', {
69 generics: {
70 pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,
71 inside: {
72 'class-name': className,
73 keyword: keywords,
74 punctuation: /[<>(),.:]/,
75 operator: /[?&|]/,
76 },
77 },
78 })
79}