aboutsummaryrefslogtreecommitdiffstats
path: root/public/prism/prism-cue.js
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2023-10-13 19:32:56 +0200
committerArmand Philippot <git@armandphilippot.com>2023-11-11 18:14:41 +0100
commit006b15b467a5cd835a6eab1b49023100bdc8f2e6 (patch)
tree949c7295c2e206f42357f135bab4696ddf6576ec /public/prism/prism-cue.js
parent00f147a7a687d5772bcc538bc606cfff972178cd (diff)
refactor(components): rewrite Code component and usePrism hook
* move Prism styles to Sass placeholders to avoid repeats * let usePrism consumer define its plugins (remove default ones) * remove `plugins` prop from Code component * add new props to Code component to let consumer configure plugins (and handle plugin list from the given options) However there are some problems with Prism plugins: line-highlight and treeview does not seems to be loaded. I don't want to use Babel instead of SWC so I have no solution for now.
Diffstat (limited to 'public/prism/prism-cue.js')
-rw-r--r--public/prism/prism-cue.js93
1 files changed, 93 insertions, 0 deletions
diff --git a/public/prism/prism-cue.js b/public/prism/prism-cue.js
new file mode 100644
index 0000000..a4cce0c
--- /dev/null
+++ b/public/prism/prism-cue.js
@@ -0,0 +1,93 @@
+(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);