Skip to content

Commit

Permalink
fix: allow multiple grmr with same dir name
Browse files Browse the repository at this point in the history
  • Loading branch information
almahdi404 committed Sep 7, 2024
1 parent 8638ebb commit 851046b
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 17 deletions.
5 changes: 5 additions & 0 deletions .changeset/tiny-mails-live.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"treeground": patch
---

fix: allow multiple grmr with same dir name
43 changes: 43 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,10 @@
"@solidjs/router": "^0.14.3",
"@solidjs/start": "^1.0.6",
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@types/md5": "^2.3.5",
"autoprefixer": "^10.4.20",
"chokidar": "^3.6.0",
"md5": "^2.3.0",
"monaco-editor-core": "^0.51.0",
"postcss": "^8.4.45",
"prettier": "^3.3.3",
Expand Down
11 changes: 7 additions & 4 deletions src/components/Editor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as monaco from "monaco-editor-core";
import { BundledLanguage, createHighlighter } from "shiki";
import { Accessor, Component, Setter, createEffect, untrack } from "solid-js";

import { getBaseName } from "~/utils";
import { getGrmrUniqueName } from "~/utils";

interface Props {
editor: Accessor<monaco.editor.IStandaloneCodeEditor | null>;
Expand Down Expand Up @@ -36,18 +36,21 @@ const Editor: Component<Props> = (props) => {
monaco.languages.register({ id: selectedHighlighter });
shikiToMonaco(highlighter, monaco);

let grammarName = getBaseName(selectedGrammar);
let grmrUniqueName = getGrmrUniqueName(selectedGrammar);

const editor = monaco.editor.create(ref, {
value: localStorage.getItem(`treeground.${grammarName}`) || "",
value: localStorage.getItem(`treeground.${grmrUniqueName}`) || "",
language: selectedHighlighter,
theme: "dark-plus",
automaticLayout: true,
occurrencesHighlight: "off",
});
editor.onDidChangeModelContent(() => {
untrack(() => props.parse(editor.getValue()));
localStorage.setItem(`treeground.${grammarName}`, editor.getValue());
localStorage.setItem(
`treeground.${grmrUniqueName}`,
editor.getValue(),
);
});
editor.onDidChangeCursorPosition((e) => {
let selection = editor.getSelection();
Expand Down
19 changes: 10 additions & 9 deletions src/components/TreeGround.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import Nav from "~/components/Nav";
import Tools from "~/components/Tools";
import Tree from "~/components/Tree";

import { getBaseName, sendMsgToServer } from "~/utils";
import { getGrmrUniqueName, sendMsgToServer } from "~/utils";

type Modal = "Add" | "Tools" | null;

Expand Down Expand Up @@ -53,7 +53,7 @@ function App() {
grammars().find((grammar) => grammar.folder === selectedGrammar())
?.highlighter || "text",
);
const [parsers, setParsers] = createSignal<{ [key: string]: Parser }>({});
const [parsers, setParsers] = createSignal<{ [grammar: string]: Parser }>({});

onMount(async () => {
const socket = new WebSocket(`ws://${location.host}/tg`);
Expand All @@ -71,7 +71,7 @@ function App() {
loadParser(message.grammar).then(() => {
let selectedGrmr = selectedGrammar();
if (selectedGrmr) {
if (getBaseName(selectedGrmr) === message.grammar) {
if (selectedGrmr === message.grammar) {
parse(editor()?.getValue() || "");
}
}
Expand All @@ -80,24 +80,25 @@ function App() {
});
const selectedGrmr = selectedGrammar();
if (selectedGrmr) {
loadParser(getBaseName(selectedGrmr));
loadParser(selectedGrmr);
}
});

const loadParser = async (grammar: string) => {
const parser = new Parser();
parser.setLanguage(await Parser.Language.load(`/${grammar}.wasm`));
parser.setLanguage(
await Parser.Language.load(`/${getGrmrUniqueName(grammar)}.wasm`),
);
setParsers((prev) => ({ ...prev, [grammar]: parser }));
};

const parse = async (content: string) => {
const selectedGrmr = selectedGrammar();
if (selectedGrmr) {
const grammar = getBaseName(selectedGrmr);
let parser = parsers()[getBaseName(grammar)];
let parser = parsers()[selectedGrmr];
if (!parser) {
await loadParser(getBaseName(grammar));
parser = parsers()[getBaseName(grammar)];
await loadParser(selectedGrmr);
parser = parsers()[selectedGrmr];
}
setTree(parser.parse(content));
}
Expand Down
4 changes: 3 additions & 1 deletion src/middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ export default createMiddleware({
onRequest: [
(event) => {
let url = new URL(event.request.url);
if (url.pathname.match(/^(\/)tree-sitter(-[a-zA-Z]+)?(\.wasm)$/)) {
if (
url.pathname.match(/^(\/)tree-sitter(-[a-zA-Z]+.[a-z0-9]{6})?(\.wasm)$/)
) {
let fileName = url.pathname.split("/").pop();
if (fileName) {
let location = path.join(wasmDir, fileName);
Expand Down
5 changes: 5 additions & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import fs from "fs";
import https from "https";
import md5 from "md5";

export const sendMsgToServer = (ws: WebSocket, message: ClientMessage) => {
return ws.send(JSON.stringify(message));
Expand Down Expand Up @@ -40,6 +41,10 @@ export const getBaseName = (path: string) => {
return parts[parts.length - 1];
};

export const getGrmrUniqueName = (grammar: string) => {
return `${getBaseName(grammar)}.${md5(grammar).slice(0, 6)}`;
};

export const aTryCatch = async <T>(
fn: () => Promise<T>,
): Promise<[T | null, unknown | null]> => {
Expand Down
11 changes: 8 additions & 3 deletions src/websocket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,12 @@ import { partyHandler } from "vinxi/party";
import yoctoSpinner from "yocto-spinner";
import zlib from "zlib";

import { aTryCatch, createExec, downloadFile } from "./utils";
import {
aTryCatch,
createExec,
downloadFile,
getGrmrUniqueName,
} from "./utils";

let grammars: string[] = [];

Expand Down Expand Up @@ -47,7 +52,7 @@ export default partyHandler({
.then((output) => {
const message: ServerMessage = {
type: "load",
grammar: path.basename(folder),
grammar: folder,
};
party.broadcast(JSON.stringify(message));
})
Expand Down Expand Up @@ -309,7 +314,7 @@ async function buildWasm(folder: string) {
if (!fs.existsSync(outFolder)) {
fs.mkdirSync(outFolder);
}
let output = path.join(outFolder, `${path.basename(folder)}.wasm`);
let output = path.join(outFolder, `${getGrmrUniqueName(folder)}.wasm`);
const localDir = path.join(os.homedir(), ".local");
const emsdk = path.join(localDir, "emsdk");
var commands = [`cd ${folder}`, "tree-sitter generate"];
Expand Down

0 comments on commit 851046b

Please sign in to comment.