import {Model} from "../layout/Model"; import {Tab} from "../layout/Tab"; import {Constants} from "../constants"; import {setPanelFocus} from "../layout/util"; /// #if !BROWSER import {setModelsHash} from "../window/setHeader"; /// #endif /// #if !MOBILE // @ts-ignore import {webViewerLoad} from "./pdf/viewer"; // @ts-ignore import {onPageNumberChanged} from "./pdf/app"; /// #endif import {fetchPost} from "../util/fetch"; import {setStorageVal, updateHotkeyTip} from "../protyle/util/compatibility"; import {App} from "../index"; import {clearOBG} from "../layout/dock/util"; export class Asset extends Model { public path: string; public element: HTMLElement; private pdfId: number | string; private pdfPage: number; public pdfObject: any; constructor(options: { app: App, tab: Tab, path: string, page?: number | string }) { super({app: options.app, id: options.tab.id}); if (window.siyuan.config.fileTree.openFilesUseCurrentTab) { options.tab.headElement.classList.add("item--unupdate"); } this.element = options.tab.panelElement; this.path = options.path; this.pdfId = options.page; this.element.addEventListener("click", (event) => { clearOBG(); setPanelFocus(this.element.parentElement.parentElement); this.app.plugins.forEach(item => { item.eventBus.emit("click-pdf", {event}); }); }); if (typeof this.pdfId === "string") { this.getPdfId(() => { this.render(); }); return; } else if (typeof this.pdfId === "number") { this.pdfPage = this.pdfId; } this.render(); } private getPdfId(cb: () => void) { fetchPost("/api/asset/getFileAnnotation", { path: this.path + ".sya", }, (response) => { if (response.code !== 1) { const config = JSON.parse(response.data.data); if (config[this.pdfId]) { this.pdfPage = config[this.pdfId].page ? config[this.pdfId].page + 1 : config[this.pdfId].pages[0].index + 1; } else { this.pdfPage = undefined; } } cb(); }); } public goToPage(pdfId: string | number) { if (typeof pdfId === "undefined" || pdfId === null) { return; } this.pdfId = pdfId; /// #if !MOBILE if (typeof pdfId === "string") { this.getPdfId(() => { if (this.pdfPage) { onPageNumberChanged({value: this.pdfPage, pdfInstance: this.pdfObject, id: this.pdfId}); } }); return; } if (typeof pdfId === "number" && !isNaN(pdfId)) { onPageNumberChanged({value: this.pdfId, pdfInstance: this.pdfObject}); } /// #endif } private render() { const type = this.path.substr(this.path.lastIndexOf(".")).toLowerCase(); if (Constants.SIYUAN_ASSETS_IMAGE.includes(type)) { this.element.innerHTML = `
`; } else if (Constants.SIYUAN_ASSETS_AUDIO.includes(type)) { this.element.innerHTML = `
`; } else if (Constants.SIYUAN_ASSETS_VIDEO.includes(type)) { this.element.innerHTML = `
`; } else if (type === ".pdf") { /// #if !MOBILE this.element.innerHTML = `

Enter the password to open this PDF file:

${window.siyuan.languages.fileName}

-

${window.siyuan.languages.fileSize}

-

${window.siyuan.languages.title1}

-

${window.siyuan.languages.author}

-

${window.siyuan.languages.subject}

-

${window.siyuan.languages.keywords}

-

${window.siyuan.languages.creationDate}

-

${window.siyuan.languages.modificationDate}

-

${window.siyuan.languages.creator}

-

PDF ${window.siyuan.languages.producer}

-

PDF ${window.siyuan.languages.version}

-

${window.siyuan.languages.pageCount}

-

${window.siyuan.languages.pageSize}

-

${window.siyuan.languages.linearized}

-

Preparing document for printing…
0%
`; const localPDF = window.siyuan.storage[Constants.LOCAL_PDFTHEME]; const pdfTheme = window.siyuan.config.appearance.mode === 0 ? localPDF.light : localPDF.dark; const darkElement = this.element.querySelector("#pdfDark"); const lightElement = this.element.querySelector("#pdfLight"); if (pdfTheme === "dark") { this.element.firstElementChild.classList.add("pdf__outer--dark"); lightElement.classList.remove("toggled"); darkElement.classList.add("toggled"); } else { lightElement.classList.add("toggled"); darkElement.classList.remove("toggled"); } lightElement.addEventListener("click", () => { if (window.siyuan.config.appearance.mode === 0) { localPDF.light = "light"; } else { localPDF.dark = "light"; } this.element.firstElementChild.classList.remove("pdf__outer--dark"); lightElement.classList.add("toggled"); darkElement.classList.remove("toggled"); setStorageVal(Constants.LOCAL_PDFTHEME, window.siyuan.storage[Constants.LOCAL_PDFTHEME]); }); darkElement.addEventListener("click", () => { if (window.siyuan.config.appearance.mode === 0) { localPDF.light = "dark"; } else { localPDF.dark = "dark"; } this.element.firstElementChild.classList.add("pdf__outer--dark"); lightElement.classList.remove("toggled"); darkElement.classList.add("toggled"); setStorageVal(Constants.LOCAL_PDFTHEME, window.siyuan.storage[Constants.LOCAL_PDFTHEME]); }); // 初始化完成后需等待页签是否显示设置完成,才可以判断 pdf 是否能进行渲染 setTimeout(() => { if (this.element.clientWidth === 0) { const observer = new MutationObserver(() => { this.pdfObject = webViewerLoad(this.path.startsWith("file") ? this.path : document.getElementById("baseURL").getAttribute("href") + "/" + this.path, this.element, this.pdfPage, this.pdfId); this.element.setAttribute("data-loading", "true"); observer.disconnect(); }); observer.observe(this.element, {attributeFilter: ["class"]}); } else { this.pdfObject = webViewerLoad(this.path.startsWith("file") ? this.path : document.getElementById("baseURL").getAttribute("href") + "/" + this.path, this.element, this.pdfPage, this.pdfId); this.element.setAttribute("data-loading", "true"); } /// #if !BROWSER setModelsHash(); /// #endif }, Constants.TIMEOUT_LOAD); /// #endif } } }