From 85093be36295a1a1c5be0a2f0380a754d8299888 Mon Sep 17 00:00:00 2001 From: EpicKiwi Date: Tue, 29 Aug 2023 22:56:22 +0200 Subject: [PATCH 1/3] Added prevent default on Ctrl+b --- src/main.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.ts b/src/main.ts index 0ca6db0..c5f8c23 100644 --- a/src/main.ts +++ b/src/main.ts @@ -316,6 +316,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(); From 9fd94256079d5c92bdd987b8545ea235ee20c366 Mon Sep 17 00:00:00 2001 From: EpicKiwi Date: Tue, 29 Aug 2023 23:14:20 +0200 Subject: [PATCH 2/3] Added a working go button --- index.html | 6 +++--- src/main.ts | 21 +++++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/index.html b/index.html index f20d31c..5b8f529 100644 --- a/index.html +++ b/index.html @@ -146,7 +146,7 @@

Known universes

-
+
@@ -154,8 +154,8 @@
- - + +
diff --git a/src/main.ts b/src/main.ts index c5f8c23..15a552c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -149,6 +149,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( @@ -554,18 +557,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); [ From 25c914a319f9c8435ab753f03508be3e2766b181 Mon Sep 17 00:00:00 2001 From: EpicKiwi Date: Wed, 30 Aug 2023 00:01:49 +0200 Subject: [PATCH 3/3] Added gzip compression on share link with fflate --- package.json | 1 + src/main.ts | 32 +++++++++++++++++++++++--------- yarn.lock | 5 +++++ 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index d4a378e..6ebd0d7 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/main.ts b/src/main.ts index 15a552c..9e58c11 100644 --- a/src/main.ts +++ b/src/main.ts @@ -27,6 +27,7 @@ import { template_universes, } from "./AppSettings"; import { tryEvaluate } from "./Evaluator"; +import { gzipSync, decompressSync, strFromU8 } from 'fflate'; // Importing showdown and setting up the markdown converter import showdown from "showdown"; @@ -526,13 +527,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", () => { @@ -649,7 +650,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], @@ -702,12 +704,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 f2ec551..2a0bffb 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"