Skip to content

Commit

Permalink
Handle compressed data when importing
Browse files Browse the repository at this point in the history
Closes #36
  • Loading branch information
qsantos committed Oct 19, 2024
1 parent 415f2a9 commit bf16263
Showing 1 changed file with 36 additions and 17 deletions.
53 changes: 36 additions & 17 deletions src/lib.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ const translations = {
"info.lostFocus": "Focus lost!",
"info.emptyCharset": "Empty charset! You must select at least one character in the settings.",
"error.database.open": "Failed to load the database; please report on https://github.com/qsantos/morse.cat/issues",
"error.import.fileType": "Incorrect file type! The export should be a JSON file.",
"error.import.fileType": "Incorrect file type! The export should be a compressed JSON file.",
"error.import.parse": "Failed to parse file: ",
},
fr: {
Expand Down Expand Up @@ -222,7 +222,7 @@ const translations = {
"info.lostFocus": "Focus perdu !",
"info.emptyCharset": "Jeu de caractères vide ! Vous devez sélectionner au moins un caractère dans les paramètres.",
"error.database.open": "Échec du chargement de la base de données ; veuillez signaler sur https://github.com/qsantos/morse.cat/issues",
"error.import.fileType": "Type de fichier incorrect ! L’exportation doit être un fichier JSON.",
"error.import.fileType": "Type de fichier incorrect ! L’exportation doit être un fichier JSON compressé.",
"error.import.parse": "Échec de l’analyse du fichier :",
},
ja: {
Expand Down Expand Up @@ -285,7 +285,7 @@ const translations = {
"info.lostFocus": "フォーカスが外れました!",
"info.emptyCharset": "空の文字セットです!設定で少なくとも1つの文字を選択する必要があります。",
"error.database.open": "データベースの読み込みに失敗しました。https://github.com/qsantos/morse.cat/issues で報告してください。",
"error.import.fileType": "ファイルタイプが間違っています!エクスポートはJSONファイルである必要があります。",
"error.import.fileType": "ファイル形式が間違っています!エクスポートは圧縮されたJSONファイルである必要があります。",
"error.import.parse": "ファイルの解析に失敗しました: ",
},
es: {
Expand Down Expand Up @@ -348,7 +348,7 @@ const translations = {
"info.lostFocus": "¡Se perdió el foco!",
"info.emptyCharset": "¡Juego de caracteres vacío! Debes seleccionar al menos un carácter en la configuración.",
"error.database.open": "Error al cargar la base de datos; informe en https://github.com/qsantos/morse.cat/issues",
"error.import.fileType": "¡Tipo de archivo incorrecto! La exportación debe ser un archivo JSON.",
"error.import.fileType": "¡Tipo de archivo incorrecto! La exportación debe ser un archivo JSON comprimido.",
"error.import.parse": "Error al analizar el archivo: ",
},
ca: {
Expand Down Expand Up @@ -411,7 +411,7 @@ const translations = {
"info.lostFocus": "S’ha perdut el focus!",
"info.emptyCharset": "Joc de caràcters buit! Has de seleccionar almenys un caràcter a la configuració.",
"error.database.open": "No s’ha pogut carregar la base de dades; informeu a https://github.com/qsantos/morse.cat/issues",
"error.import.fileType": "Tipus de fitxer incorrecte! Lexportació ha de ser un fitxer JSON.",
"error.import.fileType": "Tipus de fitxer incorrecte! L'exportació ha de ser un fitxer JSON comprimit.",
"error.import.parse": "No s’ha pogut analitzar el fitxer: ",
},
zh: {
Expand Down Expand Up @@ -474,7 +474,7 @@ const translations = {
"info.lostFocus": "焦点丢失!",
"info.emptyCharset": "字符集为空!请在设置中至少选择一个字符。",
"error.database.open": "加载数据库失败;请在 https://github.com/qsantos/morse.cat/issues 上报告",
"error.import.fileType": "文件类型不正确!导出应为JSON文件。",
"error.import.fileType": "文件类型不正确!导出应为压缩的JSON文件。",
"error.import.parse": "文件解析失败:",
},
hi: {
Expand Down Expand Up @@ -537,7 +537,7 @@ const translations = {
"info.lostFocus": "ध्यान खो गया!",
"info.emptyCharset": "कैरेक्टर सेट खाली है! कृपया सेटिंग्स में कम से कम एक कैरेक्टर चुनें।",
"error.database.open": "डेटाबेस लोड करने में विफल; कृपया https://github.com/qsantos/morse.cat/issues पर रिपोर्ट करें",
"error.import.fileType": "गलत फ़ाइल प्रकार! निर्यात एक JSON फ़ाइल होनी चाहिए।",
"error.import.fileType": "गलत फ़ाइल प्रकार! निर्यात एक संपीड़ित JSON फ़ाइल होनी चाहिए।",
"error.import.parse": "फ़ाइल पार्स करने में विफल: ",
},
ar: {
Expand Down Expand Up @@ -600,7 +600,7 @@ const translations = {
"info.lostFocus": "فقدان التركيز!",
"info.emptyCharset": "مجموعة الأحرف فارغة! الرجاء اختيار حرف واحد على الأقل في الإعدادات.",
"error.database.open": "فشل في تحميل قاعدة البيانات؛ الرجاء الإبلاغ على https://github.com/qsantos/morse.cat/issues",
"error.import.fileType": "نوع الملف غير صحيح! يجب أن يكون التصدير ملف JSON.",
"error.import.fileType": "نوع الملف غير صحيح! يجب أن يكون التصدير ملف JSON مضغوط.",
"error.import.parse": "فشل في تحليل الملف: ",
},
bn: {
Expand Down Expand Up @@ -663,7 +663,7 @@ const translations = {
"info.lostFocus": "ফোকাস হারানো গেছে!",
"info.emptyCharset": "অক্ষর সেট খালি! অনুগ্রহ করে সেটিংস থেকে অন্তত একটি অক্ষর নির্বাচন করুন।",
"error.database.open": "ডাটাবেস লোড করতে ব্যর্থ; দয়া করে https://github.com/qsantos/morse.cat/issues এ রিপোর্ট করুন",
"error.import.fileType": "ভুল ফাইল ধরন! এক্সপোর্টটি একটি JSON ফাইল হওয়া উচিত।",
"error.import.fileType": "ভুল ফাইল প্রকার! রপ্তানিটি একটি সংকুচিত JSON ফাইল হওয়া উচিত।",
"error.import.parse": "ফাইল পার্স করতে ব্যর্থ: ",
},
pt: {
Expand Down Expand Up @@ -726,7 +726,7 @@ const translations = {
"info.lostFocus": "Foco perdido!",
"info.emptyCharset": "O conjunto de caracteres está vazio! Selecione pelo menos um caractere nas configurações.",
"error.database.open": "Falha ao carregar o banco de dados; por favor, relate em https://github.com/qsantos/morse.cat/issues",
"error.import.fileType": "Tipo de arquivo incorreto! A exportação deve ser um arquivo JSON.",
"error.import.fileType": "Tipo de arquivo incorreto! A exportação deve ser um arquivo JSON compactado.",
"error.import.parse": "Falha ao analisar o arquivo: ",
},
ru: {
Expand Down Expand Up @@ -789,7 +789,7 @@ const translations = {
"info.lostFocus": "Фокус потерян!",
"info.emptyCharset": "Набор символов пуст! Пожалуйста, выберите хотя бы один символ в настройках.",
"error.database.open": "Не удалось загрузить базу данных; пожалуйста, сообщите об этом на https://github.com/qsantos/morse.cat/issues",
"error.import.fileType": "Неверный тип файла! Экспорт должен быть в формате JSON.",
"error.import.fileType": "Неверный тип файла! Экспорт должен быть сжатым файлом JSON.",
"error.import.parse": "Не удалось разобрать файл: ",
},
ur: {
Expand Down Expand Up @@ -852,7 +852,7 @@ const translations = {
"info.lostFocus": "فوکس کھو دیا!",
"info.emptyCharset": "حروف سیٹ خالی ہے! براہ کرم ترتیبات میں کم از کم ایک حرف منتخب کریں۔",
"error.database.open": "ڈیٹا بیس لوڈ کرنے میں ناکام؛ براہ کرم https://github.com/qsantos/morse.cat/issues پر رپورٹ کریں",
"error.import.fileType": "غلط فائل کی قسم! ایکسپورٹ ایک JSON فائل ہونی چاہیے۔",
"error.import.fileType": "غلط فائل قسم! برآمد ایک کمپریسڈ JSON فائل ہونا چاہیے۔",
"error.import.parse": "فائل پارس کرنے میں ناکام: ",
},
};
Expand Down Expand Up @@ -1630,6 +1630,16 @@ async function compressBlob(blob) {
return await new Response(compressedStream).blob();
}

/**
* @param {ReadableStream<Uint8Array>} stream
* @return {Promise<Blob>}
*/
async function decompressStream(stream) {
const ds = new DecompressionStream("gzip");
const decompressedStream = stream.pipeThrough(ds);
return await new Response(decompressedStream).blob();
}

// inspired from https://stackoverflow.com/a/48968694/4457767
/** Let the user save some data as a file
* @param {Blob} data
Expand Down Expand Up @@ -1715,17 +1725,26 @@ function importData() {
if (!file) {
return;
}
if (file.type !== "application/json") {
alert(t("error.import.fileType"));
return;
}

const button = getElement("import-button", HTMLButtonElement);
button.classList.add("spinning");
const progressBar = getElement("progress-bar", HTMLDivElement);
progressBar.style.width = "0%";

const data = await file.text();
let data;
if (file.type === "application/json") {
data = await file.text();
} else if (file.type === "application/gzip") {
// decompress
const stream = await file.stream();
const blob = await decompressStream(stream);
data = await blob.text();
} else {
alert(t("error.import.fileType"));
button.classList.remove("spinning");
return;
}

progressBar.style.width = "5%";
await sleep(100);
let j;
Expand Down

0 comments on commit bf16263

Please sign in to comment.