Skip to content

Commit

Permalink
Support *.code-snippets - VSCode global snippet files
Browse files Browse the repository at this point in the history
  • Loading branch information
uga-rosa committed Dec 2, 2023
1 parent 5bc20b9 commit 6543c43
Showing 1 changed file with 50 additions and 16 deletions.
66 changes: 50 additions & 16 deletions denops/denippet/loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,23 @@ const isTSSnippet = is.ObjectOf({

export type TSSnippet = u.PredicateType<typeof isTSSnippet>;

// For compatibility with VSCode global snippet files (*.code-snippets)
const isGlobalSnippet = is.ObjectOf({
prefix: is.OptionalOf(isStringOrArray),
body: isStringOrArray,
description: is.OptionalOf(is.String),
scope: is.OptionalOf(is.String),
});

export type GlobalSnippet = u.PredicateType<typeof isGlobalSnippet>;

function langToFt(lang: string): string {
return {
csharp: "cs",
shellscript: "sh",
}[lang] ?? lang;
}

export type NormalizedSnippet = {
name: string;
prefix: string[];
Expand Down Expand Up @@ -105,21 +122,8 @@ export async function load(
): Promise<void> {
const extension = filepath.split(".").pop()!;
let snippets: NormalizedSnippet[] = [];
if (["json", "toml", "yaml"].includes(extension)) {
const raw = await Deno.readTextFile(filepath);
const content = extension === "json"
? JSON.parse(raw)
: extension === "toml"
? TOML.parse(raw)
: YAML.parse(raw);
u.assert(content, is.RecordOf(isRawSnippet));
snippets = Object.entries(content).map(([name, snip]) => ({
...snip,
name,
prefix: toArray(snip.prefix ?? name),
body: toString(snip.body),
}));
} else if (extension === "ts") {

if (extension === "ts") {
const content = await import(filepath).then((module) => module.snippets);
u.assert(content, is.RecordOf(isTSSnippet));
snippets = Object.entries(content).map(([name, snip]) => ({
Expand All @@ -133,7 +137,37 @@ export async function load(
},
}));
} else {
throw new Error(`Unknown extension: ${extension}`);
const raw = await Deno.readTextFile(filepath);
if (["json", "toml", "yaml"].includes(extension)) {
const content = (extension === "json")
? JSON.parse(raw)
: extension === "toml"
? TOML.parse(raw)
: YAML.parse(raw);
u.assert(content, is.RecordOf(isRawSnippet));
snippets = Object.entries(content).map(([name, snip]) => ({
...snip,
name,
prefix: toArray(snip.prefix ?? name),
body: toString(snip.body),
}));
} else if (extension === "code-snippets") {
const content = JSON.parse(raw);
u.assert(content, is.RecordOf(isGlobalSnippet));
for (const [name, snippet] of Object.entries(content)) {
const ft = snippet.scope ? snippet.scope.split(",").map(langToFt) : "*";
const snip = {
...snippet,
name,
prefix: toArray(snippet.prefix ?? name),
body: toString(snippet.body),
};
setSnippets(ft, [snip]);
}
return;
} else {
throw new Error(`Unknown extension: ${extension}`);
}
}

setSnippets(filetype, snippets);
Expand Down

0 comments on commit 6543c43

Please sign in to comment.