fuc-new/doc/node_modules/vuepress-plugin-md-power/lib/client/composables/pdf.js
hellcat 6adbc04d4b 1
2025-10-03 17:17:08 +08:00

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 };