Add syntax highlighting for code snippets

This commit is contained in:
Moritz Hölting 2024-04-07 02:21:10 +02:00
parent dbaa63a575
commit 064bb0b0ad
5 changed files with 163 additions and 27 deletions

View File

@ -106,7 +106,7 @@ packages:
remark-parse: 11.0.0
remark-rehype: 11.1.0
remark-smartypants: 2.1.0
shiki: 1.2.3
shiki: 1.2.4
unified: 11.0.4
unist-util-remove-position: 5.0.0
unist-util-visit: 5.0.0
@ -885,7 +885,7 @@ packages:
resolution: {integrity: sha512-LWgttQTUrIPE1X+Lya1qFWiX47tH2AS2hkbj/cZoWkdiSjn6zUvtTypK/2Xn6Rgn6z6ClzpgHvkXRqFn7nAB4A==}
dependencies:
'@expressive-code/core': 0.33.5
shiki: 1.2.3
shiki: 1.2.4
dev: false
/@expressive-code/plugin-text-markers@0.33.5:
@ -1141,8 +1141,8 @@ packages:
dev: false
optional: true
/@shikijs/core@1.2.3:
resolution: {integrity: sha512-SM+aiQVaEK2P53dEcsvhq9+LJPr0rzwezHbMQhHaSrPN4OlOB4vp1qTdhVEKfMg6atdq8s9ZotWW/CSCzWftwg==}
/@shikijs/core@1.2.4:
resolution: {integrity: sha512-ClaUWpt8oTzjcF0MM1P81AeWyzc1sNSJlAjMG80CbwqbFqXSNz+NpQVUC0icobt3sZn43Sn27M4pHD/Jmp3zHw==}
dev: false
/@types/acorn@4.0.6:
@ -1487,7 +1487,7 @@ packages:
rehype: 13.0.1
resolve: 1.22.8
semver: 7.6.0
shiki: 1.2.3
shiki: 1.2.4
string-width: 7.1.0
strip-ansi: 7.1.0
tsconfck: 3.0.3(typescript@5.4.3)
@ -4033,10 +4033,10 @@ packages:
engines: {node: '>=8'}
dev: false
/shiki@1.2.3:
resolution: {integrity: sha512-+v7lO5cJMeV2N2ySK4l+51YX3wTh5I49SLjAOs1ch1DbUfeEytU1Ac9KaZPoZJCVBGycDZ09OBQN5nbcPFc5FQ==}
/shiki@1.2.4:
resolution: {integrity: sha512-Q9n9jKiOjJCRPztA9POn3/uZXNySHDNKAsPNpmtHDcFyi6ZQhx5vQKZW3Nhrwn8TWW3RudSRk66zqY603EZDeg==}
dependencies:
'@shikijs/core': 1.2.3
'@shikijs/core': 1.2.4
dev: false
/signal-exit@3.0.7:

View File

@ -49,7 +49,8 @@ fn main() {
This code defines a function called `main` that will be executed every tick.
:::note
ShulkerScript always requires a `main` function to be present in the code.
ShulkerScript always requires at least one function annotated with `tick`, `load` or `deobfuscate`.
Otherwise no `.mcfunction` files will be generated.
:::
### Annotations
@ -110,7 +111,7 @@ In most cases, you can use [literal commands](#literal-commands) instead of the
The `lua` keyword is used to embed Lua code in your ShulkerScript code. It can be combined with the `run` keyword to include the result of the Lua code in the output.
```shulkerscript
run lua() {
// Lua code goes here
-- Lua code goes here
return "Hello, Lua!";
}
};
```

View File

@ -16,7 +16,7 @@ Your Lua code should return a string value when used in combination with the run
## Syntax
```shulkerscript
run lua() {
// Lua code goes here
-- Lua code goes here
return "Hello, Lua!";
}
};
```

View File

@ -1,20 +1,10 @@
import type { PluginShikiOptions } from "@astrojs/starlight/expressive-code";
import { shulkerscriptGrammar } from "./shulkerscript-grammar";
const config: PluginShikiOptions = {
langs: [
/*{
name: 'shulkerscript',
aliases: ['shu'],
displayName: 'ShulkerScript',
fileTypes: ['shu'],
scopeName: 'source.shulkerscript',
patterns: [
{
}
]
}*/
]
shulkerscriptGrammar,
],
};
export default config;

View File

@ -0,0 +1,145 @@
export const shulkerscriptGrammar = {
name: "shulkerscript",
aliases: ["shu"],
displayName: "ShulkerScript",
fileTypes: ["shu"],
scopeName: "source.shulkerscript",
patterns: [
{
include: "#functionContents",
},
{
include: "#functionDeclaration",
},
{
include: "#functionAnnotation",
},
],
repository: {
// Groupings
functionContents: {
patterns: [
{ include: "#docComment" },
{ include: "#lineComment" },
{ include: "#blockComment" },
{ include: "#commandLiteral" },
{ include: "#lua" },
{ include: "#groupBlock" },
{ include: "#stringLiteral" },
{ include: "#binaryOperator" },
{ include: "#ifKeyword" },
{ include: "#elseKeyword" },
{ include: "#runKeyword" },
],
},
// Components
lineComment: {
name: "comment.line.shulkerscript",
match: "//.*$",
},
blockComment: {
name: "comment.block.shulkerscript",
begin: "/\\*",
end: "\\*/",
},
docComment: {
name: "comment.documentation.shulkerscript",
match: "///.*$",
},
functionDeclaration: {
name: "entity.name.function.shulkerscript",
begin: "^\\s*(fn)\\s+(\\w+)\\(\\s*\\)\\s*{",
end: "}",
captures: {
1: {
name: "keyword.control.function.shulkerscript",
},
2: {
name: "entity.name.function.shulkerscript",
},
},
patterns: [{ include: "#functionContents" }],
},
functionAnnotation: {
name: "entity.annotation.function.shulkerscript",
match: '(#\\[)(\\w+)(?:\\s*=\\s*"[^"]+")?(\\])',
captures: {
1: {
name: "keyword.operator.annotation.shulkerscript",
},
2: {
name: "entity.annotation.function.shulkerscript",
},
3: {
name: "keyword.operator.annotation.shulkerscript",
},
},
},
binaryOperator: {
name: "punctuation.operator.binary.shulkerscript",
match: "(&&|\\|\\|)",
},
ifKeyword: {
name: "keyword.control.if.shulkerscript",
match: "\\bif\\b",
},
elseKeyword: {
name: "keyword.control.else.shulkerscript",
match: "\\belse\\b",
},
runKeyword: {
name: "keyword.control.run.shulkerscript",
match: "\\brun\\b",
},
commandLiteral: {
name: "string.commandliteral.shulkerscript",
match: "^\\s*(/\\w+)(.*)$",
captures: {
1: {
name: "keyword.operator.literalcommand.shulkerscript",
},
2: {
name: "string.command.shulkerscript",
},
},
},
stringLiteral: {
name: "string.quoted.double.shulkerscript",
begin: '"',
end: '"',
patterns: [
{
name: "constant.character.escape.shulkerscript",
match: "\\\\.",
},
],
},
lua: {
name: "entity.lua.shulkerscript",
begin: "(lua)\\s*\\(\\s*\\)\\s*{",
end: "}",
beginCaptures: {
1: {
name: "keyword.control.lua.shulkerscript",
},
},
patterns: [{ include: "source.lua" }],
},
groupBlock: {
name: "entity.group.shulkerscript",
begin: "^\\s*(group)\\s*{",
end: "}",
captures: {
1: {
name: "keyword.control.group.shulkerscript",
},
2: {
name: "entity.name.group.shulkerscript",
},
},
patterns: [{ include: "#functionContents" }],
},
},
};