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.
84 lines
2.6 KiB
84 lines
2.6 KiB
(function (Prism) { |
|
|
|
// https://cuelang.org/docs/references/spec/ |
|
|
|
// eslint-disable-next-line regexp/strict |
|
var stringEscape = /\\(?:(?!\2)|\2(?:[^()\r\n]|\([^()]*\)))/.source; |
|
// eslint-disable-next-line regexp/strict |
|
var stringTypes = /"""(?:[^\\"]|"(?!""\2)|<esc>)*"""/.source + |
|
// eslint-disable-next-line regexp/strict |
|
'|' + /'''(?:[^\\']|'(?!''\2)|<esc>)*'''/.source + |
|
// eslint-disable-next-line regexp/strict |
|
'|' + /"(?:[^\\\r\n"]|"(?!\2)|<esc>)*"/.source + |
|
// eslint-disable-next-line regexp/strict |
|
'|' + /'(?:[^\\\r\n']|'(?!\2)|<esc>)*'/.source; |
|
var stringLiteral = '(?:' + stringTypes.replace(/<esc>/g, stringEscape) + ')'; |
|
|
|
Prism.languages.cue = { |
|
'comment': { |
|
pattern: /\/\/.*/, |
|
greedy: true |
|
}, |
|
'string-literal': { |
|
// eslint-disable-next-line regexp/strict |
|
pattern: RegExp(/(^|[^#"'\\])(#*)/.source + stringLiteral + /(?!["'])\2/.source), |
|
lookbehind: true, |
|
greedy: true, |
|
inside: { |
|
// I'm using dirty hack here. We have to know the number hashes at the start of the string somehow, |
|
// but we can't look back. So instead, we will use a lookahead, go to the end of the string, and |
|
// capture the hashes at the end of the string. |
|
'escape': { |
|
pattern: /(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/, |
|
greedy: true, |
|
alias: 'string' |
|
}, |
|
'interpolation': { |
|
pattern: /(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/, |
|
greedy: true, |
|
inside: { |
|
'punctuation': /^\\#*\(|\)$/, |
|
'expression': { |
|
pattern: /[\s\S]+/, |
|
inside: null |
|
} |
|
} |
|
}, |
|
'string': /[\s\S]+/ |
|
} |
|
}, |
|
|
|
'keyword': { |
|
pattern: /(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/, |
|
lookbehind: true |
|
}, |
|
'boolean': { |
|
pattern: /(^|[^\w$])(?:false|true)(?![\w$])/, |
|
lookbehind: true |
|
}, |
|
'builtin': { |
|
pattern: /(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/, |
|
lookbehind: true |
|
}, |
|
|
|
'attribute': { |
|
pattern: /@[\w$]+(?=\s*\()/, |
|
alias: 'function' |
|
}, |
|
'function': { |
|
pattern: /(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i, |
|
lookbehind: true |
|
}, |
|
|
|
'number': { |
|
pattern: /(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/, |
|
lookbehind: true |
|
}, |
|
|
|
'operator': /\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/, |
|
'punctuation': /[()[\]{},.:]/ |
|
}; |
|
|
|
Prism.languages.cue['string-literal'].inside.interpolation.inside.expression.inside = Prism.languages.cue; |
|
|
|
}(Prism));
|
|
|