-
diff --git a/package.json b/package.json
index 0828600..890d523 100644
--- a/package.json
+++ b/package.json
@@ -27,6 +27,7 @@
"astring": "^1.8.6",
"autoprefixer": "^10.4.14",
"codemirror": "^6.0.1",
+ "fflate": "^0.8.0",
"lru-cache": "^10.0.1",
"marked": "^7.0.3",
"postcss": "^8.4.27",
diff --git a/src/Documentation.ts b/src/Documentation.ts
index fee8a6a..ee874bf 100644
--- a/src/Documentation.ts
+++ b/src/Documentation.ts
@@ -1900,9 +1900,8 @@ Topos is made to be controlled entirely with a keyboard. It is recommanded to st
| Shortcut | Key | Description |
|----------|-------|------------------------------------------------------------|
-|**Start** transport|${key_shortcut("Ctrl + P")}|Start audio playback|
-|**Pause** the transport |${key_shortcut("Ctrl + S")}|Pause audio playback|
-|**Rewind** the transport|${key_shortcut("Ctrl + R")}|Rewind audio playback|
+|**Start/Pause** transport|${key_shortcut("Ctrl + P")}|Start or pause audio playback|
+|**Stop** the transport |${key_shortcut("Ctrl + S")}|Stop and rewind audio playback|
## Moving in the interface
diff --git a/src/main.ts b/src/main.ts
index 0ca6db0..5bb79fa 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -27,6 +27,8 @@ import {
template_universes,
} from "./AppSettings";
import { tryEvaluate } from "./Evaluator";
+// @ts-ignore
+import { gzipSync, decompressSync, strFromU8 } from 'fflate';
// Importing showdown and setting up the markdown converter
import showdown from "showdown";
@@ -149,6 +151,9 @@ export class Editor {
buffer_search: HTMLInputElement = document.getElementById(
"buffer-search"
) as HTMLInputElement;
+ universe_creator: HTMLFormElement = document.getElementById(
+ "universe-creator"
+ ) as HTMLFormElement;
// Local script tabs
local_script_tabs: HTMLDivElement = document.getElementById(
@@ -259,19 +264,13 @@ export class Editor {
// Application event listeners
// ================================================================================
- document.addEventListener("keydown", (event: KeyboardEvent) => {
- // TAB should do nothing
+ window.addEventListener("keydown", (event: KeyboardEvent) => {
+
if (event.key === "Tab") {
event.preventDefault();
}
if (event.ctrlKey && event.key === "s") {
- event.preventDefault();
- this.setButtonHighlighting("pause", true);
- this.clock.pause();
- }
-
- if (event.ctrlKey && event.key === "r") {
event.preventDefault();
this.setButtonHighlighting("stop", true);
this.clock.stop();
@@ -279,8 +278,15 @@ export class Editor {
if (event.ctrlKey && event.key === "p") {
event.preventDefault();
- this.setButtonHighlighting("play", true);
- this.clock.start();
+ if (this.isPlaying) {
+ this.isPlaying = false;
+ this.setButtonHighlighting("pause", true);
+ this.clock.pause();
+ } else {
+ this.isPlaying = true;
+ this.setButtonHighlighting("play", true);
+ this.clock.start();
+ }
}
// Ctrl + Shift + V: Vim Mode
@@ -316,6 +322,7 @@ export class Editor {
// This is the modal to switch between universes
if (event.ctrlKey && event.key === "b") {
+ event.preventDefault();
this.hideDocumentation();
this.updateKnownUniversesView();
this.openBuffersModal();
@@ -365,8 +372,10 @@ export class Editor {
if (event.keyCode === keycode) {
event.preventDefault();
if (event.ctrlKey) {
+ event.preventDefault();
this.api.script(keycode - 111);
} else {
+ event.preventDefault();
this.changeModeFromInterface("local");
this.changeToLocalBuffer(index);
this.hideDocumentation();
@@ -376,10 +385,12 @@ export class Editor {
);
if (event.keyCode == 121) {
+ event.preventDefault();
this.changeModeFromInterface("global");
this.hideDocumentation();
}
if (event.keyCode == 122) {
+ event.preventDefault();
this.changeModeFromInterface("init");
this.hideDocumentation();
}
@@ -522,13 +533,13 @@ export class Editor {
this.settings.font_size = parseInt(new_value);
});
- this.share_button.addEventListener("click", () => {
+ this.share_button.addEventListener("click", async () => {
// trigger a manual save
this.currentFile().candidate = app.view.state.doc.toString();
this.currentFile().committed = app.view.state.doc.toString();
this.settings.saveApplicationToLocalStorage(app.universes, app.settings);
// encode as a blob!
- this.share();
+ await this.share();
});
this.normal_mode_button.addEventListener("click", () => {
@@ -553,18 +564,24 @@ export class Editor {
});
});
- this.buffer_search.addEventListener("keydown", (event) => {
- if (event.key === "Enter") {
- let query = this.buffer_search.value;
- if (query.length > 2 && query.length < 20) {
- this.loadUniverse(query);
- this.settings.selected_universe = query;
+ this.universe_creator.addEventListener("submit", (event) => {
+
+ event.preventDefault();
+
+ let data = new FormData(this.universe_creator);
+ let universeName = data.get("universe") as string|null;
+
+ if(universeName){
+ if (universeName.length > 2 && universeName.length < 20) {
+ this.loadUniverse(universeName);
+ this.settings.selected_universe = universeName;
this.buffer_search.value = "";
this.closeBuffersModal();
this.view.focus();
}
}
});
+
tryEvaluate(this, this.universes[this.selected_universe.toString()].init);
[
@@ -580,7 +597,7 @@ export class Editor {
"ziffers",
"midi",
"functions",
- "reference",
+ // "reference",
"shortcuts",
"about",
].forEach((e) => {
@@ -639,7 +656,8 @@ export class Editor {
if (url !== null) {
const universeParam = url.get("universe");
if (universeParam !== null) {
- new_universe = JSON.parse(atob(universeParam));
+ let data = Uint8Array.from(atob(universeParam), c => c.charCodeAt(0))
+ new_universe = JSON.parse(strFromU8(decompressSync(data)));
const randomName: string = uniqueNamesGenerator({
length: 2, separator: '_',
dictionaries: [colors, animals],
@@ -692,12 +710,24 @@ export class Editor {
existing_universes!.innerHTML = final_html;
}
- share() {
- const hashed_table = btoa(
- JSON.stringify({
- universe: this.settings.universes[this.selected_universe],
- })
- );
+ async share() {
+
+ async function bufferToBase64(buffer:Uint8Array) {
+ const base64url: string = await new Promise(r => {
+ const reader = new FileReader()
+ reader.onload = () => r(reader.result as string)
+ reader.readAsDataURL(new Blob([buffer]))
+ });
+ return base64url.slice(base64url.indexOf(',') + 1);
+ }
+
+ let data = JSON.stringify({
+ universe: this.settings.universes[this.selected_universe],
+ });
+ let encoded_data = gzipSync(new TextEncoder().encode(data));
+ // TODO make this async
+ // TODO maybe try with compression level 9
+ const hashed_table = await bufferToBase64(encoded_data);
const url = new URL(window.location.href);
url.searchParams.set("universe", hashed_table);
window.history.replaceState({}, "", url.toString());
diff --git a/yarn.lock b/yarn.lock
index 50ca12a..2651401 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -767,6 +767,11 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
+fflate@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.0.tgz#f93ad1dcbe695a25ae378cf2386624969a7cda32"
+ integrity sha512-FAdS4qMuFjsJj6XHbBaZeXOgaypXp8iw/Tpyuq/w3XA41jjLHT8NPA+n7czH/DDhdncq0nAyDZmPeWXh2qmdIg==
+
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"