50 lines
2.3 KiB
JavaScript
50 lines
2.3 KiB
JavaScript
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 }; |