aboutsummaryrefslogtreecommitdiffhomepage
path: root/services/nuldoc/static/slide.js
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-11-02 17:49:34 +0900
committernsfisis <nsfisis@gmail.com>2025-11-02 17:49:34 +0900
commit57315c52be96d2a2c013f0cfb0de5429980e301a (patch)
tree5d691497772fddfe401cd970ead4e9a74b34ef38 /services/nuldoc/static/slide.js
parentcf4091a93ed831456e8b30e2a9e1fc2650dcae02 (diff)
downloadnsfisis.dev-57315c52be96d2a2c013f0cfb0de5429980e301a.tar.gz
nsfisis.dev-57315c52be96d2a2c013f0cfb0de5429980e301a.tar.zst
nsfisis.dev-57315c52be96d2a2c013f0cfb0de5429980e301a.zip
refactor(blog): rename directory, services/{blog => nuldoc}/
Diffstat (limited to 'services/nuldoc/static/slide.js')
-rw-r--r--services/nuldoc/static/slide.js60
1 files changed, 60 insertions, 0 deletions
diff --git a/services/nuldoc/static/slide.js b/services/nuldoc/static/slide.js
new file mode 100644
index 0000000..4c7a0de
--- /dev/null
+++ b/services/nuldoc/static/slide.js
@@ -0,0 +1,60 @@
+import { GlobalWorkerOptions, getDocument } from "/pdf.min.mjs";
+
+document.addEventListener("DOMContentLoaded", async () => {
+ GlobalWorkerOptions.workerSrc = "/pdf.worker.min.mjs";
+
+ const canvas = document.getElementById("slide");
+ const ctx = canvas.getContext("2d");
+ const url = canvas.dataset.slideLink;
+
+ let pageNum = 1;
+ let pageNumPending = null;
+ let pageRendering = false;
+ let doc = null;
+
+ const renderPage = async (num) => {
+ pageRendering = true;
+ const page = await doc.getPage(num);
+
+ const viewport = page.getViewport({ scale: 1.0 });
+ canvas.height = viewport.height;
+ canvas.width = viewport.width;
+
+ // TODO: error handling
+ await page.render({
+ canvasContext: ctx,
+ viewport: viewport,
+ });
+
+ pageRendering = false;
+ if (pageNumPending !== null) {
+ renderPage(pageNumPending);
+ pageNumPending = null;
+ }
+ };
+
+ const queueRenderPage = (num) => {
+ if (pageRendering) {
+ pageNumPending = num;
+ } else {
+ renderPage(num);
+ }
+ };
+
+ const prev = document.getElementById("prev");
+ prev.addEventListener("click", () => {
+ if (pageNum <= 1) return;
+ pageNum--;
+ queueRenderPage(pageNum);
+ });
+ const next = document.getElementById("next");
+ next.addEventListener("click", () => {
+ if (pageNum >= doc.numPages) return;
+ pageNum++;
+ queueRenderPage(pageNum);
+ });
+
+ // TODO: error handling
+ doc = await getDocument(url).promise;
+ queueRenderPage(pageNum);
+});