import { ensureEndingSlash, isLinkHttp } from "vuepress/shared"; import { isMobile, isSafari, isiPad } from "@vuepress/helper/client"; import { withBase } from "vuepress/client"; import { pluginOptions } from "../options.js"; //#region src/client/composables/pdf.ts function queryStringify(options) { const { page, noToolbar, zoom } = options; let queryString = [ `page=${page}`, `toolbar=${noToolbar ? 0 : 1}`, `zoom=${zoom}` ].join("&"); if (queryString) queryString = `#${queryString}`; return queryString; } function renderPDF(el, url, embedType, options) { if (!pluginOptions.pdf) return; url = isLinkHttp(url) ? url : new URL(withBase(url), typeof location !== "undefined" ? location.href : "").toString(); const pdfOptions = pluginOptions.pdf === true ? {} : pluginOptions.pdf; pdfOptions.pdfjsUrl ??= "https://static.pengzhanbo.cn/pdfjs/"; const pdfjsUrl = `${ensureEndingSlash(withBase(pdfOptions.pdfjsUrl))}web/viewer.html`; const queryString = queryStringify(options); const source = embedType === "pdfjs" ? `${pdfjsUrl}?file=${url}${queryString}` : `${url}${queryString}`; const tagName = embedType === "pdfjs" || embedType === "iframe" ? "iframe" : "embed"; el.innerHTML = ""; const pdf = document.createElement(tagName); pdf.className = "pdf-viewer"; pdf.type = "application/pdf"; pdf.title = options.title || "PDF Viewer"; pdf.src = source; if (pdf instanceof HTMLIFrameElement) pdf.allow = "fullscreen"; el.appendChild(pdf); } function usePDF(el, url, options) { if (typeof window === "undefined" || !window?.navigator?.userAgent) return; const { navigator } = window; const { userAgent } = navigator; const isModernBrowser = typeof window.Promise === "function"; const isMobileDevice = isiPad(userAgent) || isMobile(userAgent); const isSafariDesktop = !isMobileDevice && isSafari(userAgent); const isFirefoxWithPDFJS = !isMobileDevice && /firefox/iu.test(userAgent) && userAgent.split("rv:").length > 1 ? Number.parseInt(userAgent.split("rv:")[1].split(".")[0], 10) > 18 : false; const supportsPDFs = !isMobileDevice && (isModernBrowser || isFirefoxWithPDFJS); if (!url) return; if (supportsPDFs || !isMobileDevice) return renderPDF(el, url, isSafariDesktop ? "iframe" : "embed", options); return renderPDF(el, url, "pdfjs", options); } //#endregion export { renderPDF, usePDF };