(function ($) { var PDFJS_BASE = '/statics/js/pdfjs/'; var pdfjsPromise = null; var resizeTimer = null; function hasPdfExtension(href) { return /\.pdf(?:[?#].*)?$/i.test(href || ''); } function parseHref(href) { var parser = document.createElement('a'); parser.href = href; return parser; } function normalizePathname(pathname) { if (!pathname) { return '/'; } return pathname.charAt(0) === '/' ? pathname : '/' + pathname; } function pdfSource(href) { if (!href || href.charAt(0) === '#') { return ''; } var parser = parseHref(href); var protocol = (parser.protocol || '').toLowerCase(); var isHttp = protocol === 'http:' || protocol === 'https:'; if (isHttp && parser.host !== window.location.host) { return ''; } if (isHttp) { return normalizePathname(parser.pathname) + parser.search + parser.hash; } if (protocol && protocol !== ':') { return ''; } return href; } function pdfFrameSource(src) { var hashIndex = src.indexOf('#'); var base = hashIndex === -1 ? src : src.substring(0, hashIndex); var hash = hashIndex === -1 ? '' : src.substring(hashIndex + 1); var params = hash ? hash.split('&') : []; function hasParam(name) { var prefix = name.toLowerCase() + '='; var i; for (i = 0; i < params.length; i++) { if (params[i].toLowerCase().indexOf(prefix) === 0) { return true; } } return false; } if (!hasParam('toolbar')) { params.push('toolbar=0'); } if (!hasParam('navpanes')) { params.push('navpanes=0'); } if (!hasParam('scrollbar')) { params.push('scrollbar=1'); } return base + '#' + params.join('&'); } function decodeFilename(filename) { try { return decodeURIComponent(filename.replace(/\+/g, '%20')); } catch (e) { return filename; } } function pdfTitle($link, href) { var title = $.trim($link.text()); var parser; var filename; if (title && title !== href) { return title; } parser = parseHref(href); filename = normalizePathname(parser.pathname).split('/').pop(); return decodeFilename(filename || 'PDF'); } function addStyle() { if (document.getElementById('cms-pdf-inline-style')) { return; } $('head').append( '' ); } function canUsePdfJs() { var canvas = document.createElement('canvas'); return !!(window.Promise && window.Uint8Array && canvas.getContext && window.Function); } function importModule(url) { try { return new Function('url', 'return import(url);')(url); } catch (e) { return Promise.reject(e); } } function loadPdfJs() { if (!pdfjsPromise) { pdfjsPromise = importModule(PDFJS_BASE + 'build/pdf.min.js').then(function (pdfjsLib) { pdfjsLib.GlobalWorkerOptions.workerSrc = PDFJS_BASE + 'build/pdf.worker.min.js'; return pdfjsLib; }); } return pdfjsPromise; } function buildFallbackViewer(src, title) { var $viewer = $('
'); var $frame = $('') .attr('src', pdfFrameSource(src)) .attr('title', title); $viewer.append($frame); return $viewer; } function showFallback($viewer, src, title) { var $fallback = buildFallbackViewer(src, title); $viewer.replaceWith($fallback); } function buildViewer(src, title) { var $viewer = $(''); var $status = $('').text('PDF加载中...'); var $pages = $(''); if (!canUsePdfJs()) { return buildFallbackViewer(src, title); } $viewer .attr('data-pdf-src', src) .attr('data-pdf-title', title) .append($status, $pages); renderPdf($viewer, src, title); return $viewer; } function renderPdf($viewer, src, title) { loadPdfJs() .then(function (pdfjsLib) { return pdfjsLib.getDocument({ url: src, cMapUrl: PDFJS_BASE + 'cmaps/', cMapPacked: true, standardFontDataUrl: PDFJS_BASE + 'standard_fonts/', wasmUrl: PDFJS_BASE + 'wasm/', iccUrl: PDFJS_BASE + 'iccs/' }).promise; }) .then(function (pdf) { $viewer.data('cmsPdfDoc', pdf); $viewer.find('.cms-pdf-status').remove(); renderPages($viewer, pdf); }) .catch(function () { showFallback($viewer, src, title); }); } function renderPages($viewer, pdf) { var $pages = $viewer.find('.cms-pdf-pages'); var renderId = ($viewer.data('cmsPdfRenderId') || 0) + 1; var maxWidth = Math.max(260, $viewer.innerWidth() - 20); var outputScale = Math.min(window.devicePixelRatio || 1, 2); $viewer.data('cmsPdfRenderId', renderId); $viewer.data('cmsPdfWidth', $viewer.innerWidth()); $pages.empty(); function renderPage(pageNumber) { if ($viewer.data('cmsPdfRenderId') !== renderId || pageNumber > pdf.numPages) { return Promise.resolve(); } return pdf.getPage(pageNumber).then(function (page) { var baseViewport = page.getViewport({ scale: 1 }); var scale = maxWidth / baseViewport.width; var viewport = page.getViewport({ scale: scale }); var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); var transform = outputScale !== 1 ? [outputScale, 0, 0, outputScale, 0, 0] : null; canvas.className = 'cms-pdf-page'; canvas.width = Math.floor(viewport.width * outputScale); canvas.height = Math.floor(viewport.height * outputScale); canvas.style.width = Math.floor(viewport.width) + 'px'; canvas.style.height = Math.floor(viewport.height) + 'px'; context.fillStyle = '#fff'; context.fillRect(0, 0, canvas.width, canvas.height); $pages.append(canvas); return page.render({ canvasContext: context, viewport: viewport, transform: transform }).promise.then(function () { return renderPage(pageNumber + 1); }); }); } renderPage(1); } function simpleLinkParent($link) { var $parent = $link.parent(); var textWithoutLink; if (!$parent.is('p')) { return null; } if ($parent.find('a[href]').length !== 1) { return null; } textWithoutLink = $.trim($parent.clone().find('a').remove().end().text()); return textWithoutLink ? null : $parent; } function rerenderVisiblePdfs() { $('.cms-pdf-viewer').each(function () { var $viewer = $(this); var pdf = $viewer.data('cmsPdfDoc'); var oldWidth = $viewer.data('cmsPdfWidth') || 0; var newWidth = $viewer.innerWidth(); if (pdf && Math.abs(newWidth - oldWidth) > 20) { renderPages($viewer, pdf); } }); } function bindResize() { $(window).on('resize', function () { window.clearTimeout(resizeTimer); resizeTimer = window.setTimeout(rerenderVisiblePdfs, 180); }); } function renderPdfLinks() { var $content = $('.wp_articlecontent'); if (!$content.length) { $content = $('body'); } addStyle(); bindResize(); $content.find('a[href]').each(function () { var $link = $(this); var href = $link.attr('href'); var src; var title; var $viewer; var $simpleParent; if ($link.data('cmsPdfReady') || $link.closest('.cms-pdf-viewer').length) { return; } if (!hasPdfExtension(href)) { return; } src = pdfSource(href); if (!src) { return; } $link.data('cmsPdfReady', true); title = pdfTitle($link, href); $viewer = buildViewer(src, title); $simpleParent = simpleLinkParent($link); if ($simpleParent) { $simpleParent.replaceWith($viewer); } else { $link.after($viewer); } }); } $(renderPdfLinks); })(jQuery);