aboutsummaryrefslogtreecommitdiff
path: root/html
diff options
context:
space:
mode:
Diffstat (limited to 'html')
-rw-r--r--html/file_preview.html48
-rw-r--r--html/file_preview.js75
-rw-r--r--html/item_list.js7
-rw-r--r--html/item_preview.js46
4 files changed, 135 insertions, 41 deletions
diff --git a/html/file_preview.html b/html/file_preview.html
new file mode 100644
index 0000000..20e2392
--- /dev/null
+++ b/html/file_preview.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<!--
+ SPDX-License-Identifier: GPL-3.0-or-later OR CC-BY-SA-4.0
+
+ Haketilo's preview of a file kept in IndexedDB
+
+ This file is part of Haketilo.
+
+ Copyright (C) 2022 Wojtek Kosior <koszko@koszko.org>
+
+ File is dual-licensed. You can choose either GPLv3+, CC BY-SA or both.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+ I, Wojtek Kosior, thereby promise not to sue for violation of this file's
+ licenses. Although I request that you do not make use of this code in a
+ proprietary program, I am not going to enforce this in court.
+ -->
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>File preview</title>
+#LOADCSS html/reset.css
+#LOADCSS html/base.css
+ <style>
+ .error_msg {
+ color: #a33;
+ /* also italics maybe?*/
+ }
+ </style>
+ </head>
+ <body>
+ <div id="info_msg">loading...</div>
+ <div id="error_msg" class="hide"></div>
+#LOADJS html/file_preview.js
+ </body>
+</html>
diff --git a/html/file_preview.js b/html/file_preview.js
new file mode 100644
index 0000000..3e22225
--- /dev/null
+++ b/html/file_preview.js
@@ -0,0 +1,75 @@
+/**
+ * This file is part of Haketilo.
+ *
+ * Function: Haketilo's preview of a file kept in IndexedDB.
+ *
+ * Copyright (C) 2022 Wojtek Kosior
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * As additional permission under GNU GPL version 3 section 7, you
+ * may distribute forms of that code without the copy of the GNU
+ * GPL normally required by section 4, provided you include this
+ * license notice and, in case of non-source distribution, a URL
+ * through which recipients can access the Corresponding Source.
+ * If you modify file(s) with this exception, you may extend this
+ * exception to your version of the file(s), but you are not
+ * obligated to do so. If you do not wish to do so, delete this
+ * exception statement from your version.
+ *
+ * As a special exception to the GPL, any HTML file which merely
+ * makes function calls to this code, and for that purpose
+ * includes it by reference shall be deemed a separate work for
+ * copyright law purposes. If you modify this code, you may extend
+ * this exception to your version of the code, but you are not
+ * obligated to do so. If you do not wish to do so, delete this
+ * exception statement from your version.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * I, Wojtek Kosior, thereby promise not to sue for violation of this file's
+ * license. Although I request that you do not make use of this code in a
+ * proprietary program, I am not going to enforce this in court.
+ */
+
+#IMPORT common/indexeddb.js AS haketilodb
+
+#FROM html/DOM_helpers.js IMPORT by_id
+
+const error_msg = by_id("error_msg"), info_msg = by_id("info_msg");
+
+function error(msg) {
+ info_msg.remove();
+ error_msg.classList.remove("hide");
+ error_msg.innerText = msg;
+}
+
+async function show_preview(hash_key) {
+ const db = await haketilodb.get();
+ const file = await haketilodb.idb_get(db.transaction("files"),
+ "files", hash_key);
+ if (file === undefined) {
+ error("Couldn't find file in Haketilo's internal database :(");
+ } else {
+ const blobby_opts = {type: "text/plain;charset=UTF-8"};
+ const blobby = new Blob([file.contents], blobby_opts);
+ location.replace(URL.createObjectURL(blobby));
+ }
+}
+
+const match = /^[^#]*#(.*)$/.exec(document.URL);
+if (!match) {
+ error("Bad URL :(");
+} else {
+ const hash_key = match[1];
+ show_preview(hash_key);
+}
diff --git a/html/item_list.js b/html/item_list.js
index a616713..bc1acb9 100644
--- a/html/item_list.js
+++ b/html/item_list.js
@@ -52,11 +52,8 @@ function preview_item(list_ctx, item, ignore_dialog=false)
if (list_ctx.dialog_ctx.shown && !ignore_dialog)
return;
- list_ctx.preview_ctx = list_ctx.preview_cb(
- item.definition,
- list_ctx.preview_ctx,
- list_ctx.dialog_ctx
- );
+ list_ctx.preview_ctx =
+ list_ctx.preview_cb(item.definition, list_ctx.preview_ctx);
list_ctx.preview_container.prepend(list_ctx.preview_ctx.main_div);
if (list_ctx.previewed_item !== null)
diff --git a/html/item_preview.js b/html/item_preview.js
index dccf2d4..c55183c 100644
--- a/html/item_preview.js
+++ b/html/item_preview.js
@@ -44,10 +44,10 @@
#IMPORT common/indexeddb.js AS haketilodb
#IMPORT html/dialog.js
+#FROM common/browser.js IMPORT browser
#FROM html/DOM_helpers.js IMPORT clone_template
-function populate_list(ul, items)
-{
+function populate_list(ul, items) {
for (const item of items) {
const li = document.createElement("li");
li.append(item);
@@ -55,41 +55,21 @@ function populate_list(ul, items)
}
}
-/* Link click handler used in make_file_link(). */
-async function file_link_clicked(preview_object, file_ref, event)
-{
- event.preventDefault();
-
- const db = await haketilodb.get();
- const file = await haketilodb.idb_get(db.transaction("files"),
- "files", file_ref.hash_key);
- if (file === undefined) {
- dialog.error(preview_object.dialog_context,
- "File missing from Haketilo's internal database :(");
- } else {
- const encoded_file = encodeURIComponent(file.contents);
- open(`data:text/plain;charset=utf8,${encoded_file}`, '_blank');
- }
-}
+const file_preview_link = browser.runtime.getURL("html/file_preview.html");
/*
* The default function to use to create file preview link. Links it creates can
* be used to view files from IndexedDB.
*/
-function make_file_link(preview_object, file_ref)
-{
+function make_file_link(preview_object, file_ref) {
const a = document.createElement("a");
- a.href = "javascript:void(0)";
+ a.href = `${file_preview_link}#${file_ref.hash_key}`;
a.innerText = file_ref.file;
- a.addEventListener("click",
- e => file_link_clicked(preview_object, file_ref, e));
-
+ a.target = "_blank";
return a;
}
-function resource_preview(resource, preview_object, dialog_context,
- make_link_cb=make_file_link)
-{
+function resource_preview(resource, preview_object, link_cb=make_file_link) {
if (preview_object === undefined)
preview_object = clone_template("resource_preview");
@@ -104,7 +84,7 @@ function resource_preview(resource, preview_object, dialog_context,
[...preview_object.dependencies.childNodes].forEach(n => n.remove());
populate_list(preview_object.dependencies, resource.dependencies);
- const link_maker = file_ref => make_link_cb(preview_object, file_ref);
+ const link_maker = file_ref => link_cb(preview_object, file_ref);
[...preview_object.scripts.childNodes].forEach(n => n.remove());
populate_list(preview_object.scripts, resource.scripts.map(link_maker));
@@ -113,15 +93,11 @@ function resource_preview(resource, preview_object, dialog_context,
populate_list(preview_object.copyright,
resource.source_copyright.map(link_maker));
- preview_object.dialog_context = dialog_context;
-
return preview_object;
}
#EXPORT resource_preview
-function mapping_preview(mapping, preview_object, dialog_context,
- make_link_cb=make_file_link)
-{
+function mapping_preview(mapping, preview_object, link_cb=make_file_link) {
if (preview_object === undefined)
preview_object = clone_template("mapping_preview");
@@ -145,14 +121,12 @@ function mapping_preview(mapping, preview_object, dialog_context,
}
}
- const link_maker = file_ref => make_link_cb(preview_object, file_ref);
+ const link_maker = file_ref => link_cb(preview_object, file_ref);
[...preview_object.copyright.childNodes].forEach(n => n.remove());
populate_list(preview_object.copyright,
mapping.source_copyright.map(link_maker));
- preview_object.dialog_context = dialog_context;
-
return preview_object;
}
#EXPORT mapping_preview