Run through prettier
This commit is contained in:
parent
21a26daab0
commit
7733947270
3 changed files with 66 additions and 41 deletions
|
@ -3,8 +3,8 @@ import { PLAINTEXT, LANGUAGES } from "./languages.js";
|
||||||
const UTF8_ENCODER = new TextEncoder();
|
const UTF8_ENCODER = new TextEncoder();
|
||||||
const UTF8_DECODER = new TextDecoder();
|
const UTF8_DECODER = new TextDecoder();
|
||||||
|
|
||||||
class DataOptionsError extends Error { }
|
class DataOptionsError extends Error {}
|
||||||
class DecodeError extends DataOptionsError { }
|
class DecodeError extends DataOptionsError {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Data options are stored in a binary header before the payload.
|
* Data options are stored in a binary header before the payload.
|
||||||
|
@ -51,7 +51,7 @@ export class DataOptions {
|
||||||
|
|
||||||
if (fixedHeaderBytes >= 2) {
|
if (fixedHeaderBytes >= 2) {
|
||||||
const languageIDLowByte = data[1];
|
const languageIDLowByte = data[1];
|
||||||
const languageIDHighBit = (byte1 & 0b00000001);
|
const languageIDHighBit = byte1 & 0b00000001;
|
||||||
const languageID = (languageIDHighBit << 8) | languageIDLowByte;
|
const languageID = (languageIDHighBit << 8) | languageIDLowByte;
|
||||||
|
|
||||||
if (LANGUAGES.has(languageID)) {
|
if (LANGUAGES.has(languageID)) {
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
import brotliInit, { compress, DecompressStream, BrotliStreamResult } from "./vendor/brotli_wasm.js";
|
import brotliInit, {
|
||||||
|
compress,
|
||||||
|
DecompressStream,
|
||||||
|
BrotliStreamResult,
|
||||||
|
} from "./vendor/brotli_wasm.js";
|
||||||
import base from "./vendor/base-x.js";
|
import base from "./vendor/base-x.js";
|
||||||
import "./vendor/prism/prism.js";
|
import "./vendor/prism/prism.js";
|
||||||
import "./vendor/prism/plugins/line-numbers/prism-line-numbers.js";
|
import "./vendor/prism/plugins/line-numbers/prism-line-numbers.js";
|
||||||
|
@ -7,12 +11,19 @@ import "./vendor/prism/dependencies.js";
|
||||||
import { waitForLoad } from "./utils.js";
|
import { waitForLoad } from "./utils.js";
|
||||||
import { DataOptions } from "./dataoptions.js";
|
import { DataOptions } from "./dataoptions.js";
|
||||||
import { ViewMode } from "./viewmode.js";
|
import { ViewMode } from "./viewmode.js";
|
||||||
import { getDependenciesForLanguage, getDepsData, LANGUAGES, LANGUAGE_NAMES, PLAINTEXT } from "./languages.js";
|
import {
|
||||||
|
getDependenciesForLanguage,
|
||||||
|
getDepsData,
|
||||||
|
LANGUAGES,
|
||||||
|
LANGUAGE_NAMES,
|
||||||
|
PLAINTEXT,
|
||||||
|
} from "./languages.js";
|
||||||
|
|
||||||
const PROJECT_NAME = "Tahnaroskakori";
|
const PROJECT_NAME = "Tahnaroskakori";
|
||||||
const COMPRESS_WAIT = 500;
|
const COMPRESS_WAIT = 500;
|
||||||
const ENCODER = new TextEncoder();
|
const ENCODER = new TextEncoder();
|
||||||
const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789?/-._~$&+=";
|
const ALPHABET =
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789?/-._~$&+=";
|
||||||
const BASECODEC = base(ALPHABET);
|
const BASECODEC = base(ALPHABET);
|
||||||
const QUALITY = 11;
|
const QUALITY = 11;
|
||||||
const MAX_URL = 2048;
|
const MAX_URL = 2048;
|
||||||
|
@ -41,7 +52,9 @@ function setTitle() {
|
||||||
if (dataOptions.title !== "") {
|
if (dataOptions.title !== "") {
|
||||||
document.title = dataOptions.title + TITLE_POSTFIX;
|
document.title = dataOptions.title + TITLE_POSTFIX;
|
||||||
} else if (currentCode !== "") {
|
} else if (currentCode !== "") {
|
||||||
document.title = currentCode.replace("\n", "").substring(0, TITLE_CODE_LENGTH) + TITLE_POSTFIX;
|
document.title =
|
||||||
|
currentCode.replace("\n", "").substring(0, TITLE_CODE_LENGTH) +
|
||||||
|
TITLE_POSTFIX;
|
||||||
} else {
|
} else {
|
||||||
document.title = PROJECT_NAME;
|
document.title = PROJECT_NAME;
|
||||||
}
|
}
|
||||||
|
@ -80,9 +93,12 @@ async function highlightLanguage() {
|
||||||
codeViewEl.classList.add(getLanguageClassName(dataOptions.language));
|
codeViewEl.classList.add(getLanguageClassName(dataOptions.language));
|
||||||
|
|
||||||
if (dataOptions.language !== PLAINTEXT) {
|
if (dataOptions.language !== PLAINTEXT) {
|
||||||
const deps = getDependenciesForLanguage(languageDependencies, dataOptions.language);
|
const deps = getDependenciesForLanguage(
|
||||||
|
languageDependencies,
|
||||||
|
dataOptions.language
|
||||||
|
);
|
||||||
for (const dep of [...deps, dataOptions.language]) {
|
for (const dep of [...deps, dataOptions.language]) {
|
||||||
await import(`./vendor/prism/components/prism-${dep}.js`)
|
await import(`./vendor/prism/components/prism-${dep}.js`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (viewMode === ViewMode.VIEW) {
|
if (viewMode === ViewMode.VIEW) {
|
||||||
|
@ -177,7 +193,9 @@ async function syncCompress() {
|
||||||
const compressed = compress(dataWithHeader, { quality: QUALITY });
|
const compressed = compress(dataWithHeader, { quality: QUALITY });
|
||||||
const encoded = BASECODEC.encode(compressed);
|
const encoded = BASECODEC.encode(compressed);
|
||||||
|
|
||||||
statusEl.textContent = `Length: ${dataWithHeader.length} B -> ${compressed.length} B -> ${encoded.length}/${maxHashLength()} chars`;
|
statusEl.textContent = `Length: ${dataWithHeader.length} B -> ${
|
||||||
|
compressed.length
|
||||||
|
} B -> ${encoded.length}/${maxHashLength()} chars`;
|
||||||
|
|
||||||
if (encoded.length <= maxHashLength()) {
|
if (encoded.length <= maxHashLength()) {
|
||||||
history.replaceState(null, "", `#${encoded}`);
|
history.replaceState(null, "", `#${encoded}`);
|
||||||
|
@ -209,34 +227,42 @@ async function streamDecompress() {
|
||||||
start(controller) {
|
start(controller) {
|
||||||
controller.enqueue(data);
|
controller.enqueue(data);
|
||||||
controller.close();
|
controller.close();
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const decompressStream = new DecompressStream();
|
const decompressStream = new DecompressStream();
|
||||||
const decompressionRunner = new TransformStream({
|
const decompressionRunner = new TransformStream({
|
||||||
start() { },
|
start() {},
|
||||||
transform(chunk, controller) {
|
transform(chunk, controller) {
|
||||||
controller.enqueue(decompressStream.decompress(chunk, DECOMPRESS_CHUNK_SIZE));
|
controller.enqueue(
|
||||||
|
decompressStream.decompress(chunk, DECOMPRESS_CHUNK_SIZE)
|
||||||
|
);
|
||||||
|
|
||||||
let slice = chunk;
|
let slice = chunk;
|
||||||
|
|
||||||
while (decompressStream.result() === BrotliStreamResult.NeedsMoreOutput) {
|
while (
|
||||||
|
decompressStream.result() === BrotliStreamResult.NeedsMoreOutput
|
||||||
|
) {
|
||||||
slice = slice.slice(decompressStream.last_input_offset());
|
slice = slice.slice(decompressStream.last_input_offset());
|
||||||
controller.enqueue(decompressStream.decompress(slice, DECOMPRESS_CHUNK_SIZE));
|
controller.enqueue(
|
||||||
|
decompressStream.decompress(slice, DECOMPRESS_CHUNK_SIZE)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
flush(controller) {
|
flush(controller) {
|
||||||
if (decompressStream.result() === BrotliStreamResult.NeedsMoreInput) {
|
if (decompressStream.result() === BrotliStreamResult.NeedsMoreInput) {
|
||||||
controller.enqueue(decompressStream.decompress("", DECOMPRESS_CHUNK_SIZE));
|
controller.enqueue(
|
||||||
|
decompressStream.decompress("", DECOMPRESS_CHUNK_SIZE)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
controller.terminate();
|
controller.terminate();
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const optionsPickerStream = new TransformStream({
|
const optionsPickerStream = new TransformStream({
|
||||||
firstChunk: false,
|
firstChunk: false,
|
||||||
start() { },
|
start() {},
|
||||||
transform(chunk, controller) {
|
transform(chunk, controller) {
|
||||||
if (!this.firstChunk) {
|
if (!this.firstChunk) {
|
||||||
const rest = dataOptions.parseFrom(chunk);
|
const rest = dataOptions.parseFrom(chunk);
|
||||||
|
@ -250,7 +276,7 @@ async function streamDecompress() {
|
||||||
} else {
|
} else {
|
||||||
controller.enqueue(chunk);
|
controller.enqueue(chunk);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const textDecoderStream = new TextDecoderStream();
|
const textDecoderStream = new TextDecoderStream();
|
||||||
|
@ -265,8 +291,10 @@ async function streamDecompress() {
|
||||||
renderCode();
|
renderCode();
|
||||||
|
|
||||||
// Delay stream between every chunk to avoid zip bombing
|
// Delay stream between every chunk to avoid zip bombing
|
||||||
return new Promise(resolve => setTimeout(resolve, DECOMPRESS_CHUNK_TIMEOUT));
|
return new Promise((resolve) =>
|
||||||
}
|
setTimeout(resolve, DECOMPRESS_CHUNK_TIMEOUT)
|
||||||
|
);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await inputStream
|
await inputStream
|
||||||
|
@ -287,7 +315,9 @@ async function streamDecompress() {
|
||||||
*/
|
*/
|
||||||
async function languageSelected() {
|
async function languageSelected() {
|
||||||
codeViewEl.classList.remove(getLanguageClassName(dataOptions.language));
|
codeViewEl.classList.remove(getLanguageClassName(dataOptions.language));
|
||||||
codeViewContentEl.classList.remove(getLanguageClassName(dataOptions.language));
|
codeViewContentEl.classList.remove(
|
||||||
|
getLanguageClassName(dataOptions.language)
|
||||||
|
);
|
||||||
|
|
||||||
if (LANGUAGES.has(languageSelectEl.value)) {
|
if (LANGUAGES.has(languageSelectEl.value)) {
|
||||||
dataOptions.language = languageSelectEl.value;
|
dataOptions.language = languageSelectEl.value;
|
||||||
|
@ -339,11 +369,7 @@ async function init() {
|
||||||
renderLanguageOptions();
|
renderLanguageOptions();
|
||||||
renderView();
|
renderView();
|
||||||
|
|
||||||
[languageDependencies,] = await Promise.all([
|
[languageDependencies] = await Promise.all([getDepsData(), brotliInit()]);
|
||||||
getDepsData(),
|
|
||||||
brotliInit(),
|
|
||||||
]);
|
|
||||||
|
|
||||||
|
|
||||||
codeEditEl.addEventListener("input", codeEdited);
|
codeEditEl.addEventListener("input", codeEdited);
|
||||||
viewModeSwitcherEl.addEventListener("click", switchMode);
|
viewModeSwitcherEl.addEventListener("click", switchMode);
|
||||||
|
|
7
utils.js
7
utils.js
|
@ -3,13 +3,12 @@
|
||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
export function waitForLoad() {
|
export function waitForLoad() {
|
||||||
return new Promise(resolve => {
|
return new Promise((resolve) => {
|
||||||
// If already loaded, fire immediately
|
// If already loaded, fire immediately
|
||||||
if (/complete|interactive|loaded/.test(document.readyState)) {
|
if (/complete|interactive|loaded/.test(document.readyState)) {
|
||||||
resolve();
|
resolve();
|
||||||
}
|
} else {
|
||||||
else {
|
document.addEventListener("DOMContentLoaded", resolve);
|
||||||
document.addEventListener('DOMContentLoaded', resolve);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue