From 4fd9b8f2b5a98bfcde57970b48fed2488a80f356 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 17 Sep 2021 21:53:37 +0300 Subject: add in master snapshot of epubjs --- lib/epub.js/src/utils/replacements.js | 138 ++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 lib/epub.js/src/utils/replacements.js (limited to 'lib/epub.js/src/utils/replacements.js') diff --git a/lib/epub.js/src/utils/replacements.js b/lib/epub.js/src/utils/replacements.js new file mode 100644 index 0000000..a271088 --- /dev/null +++ b/lib/epub.js/src/utils/replacements.js @@ -0,0 +1,138 @@ +import { qs, qsa } from "./core"; +import Url from "./url"; +import Path from "./path"; + +export function replaceBase(doc, section){ + var base; + var head; + var url = section.url; + var absolute = (url.indexOf("://") > -1); + + if(!doc){ + return; + } + + head = qs(doc, "head"); + base = qs(head, "base"); + + if(!base) { + base = doc.createElement("base"); + head.insertBefore(base, head.firstChild); + } + + // Fix for Safari crashing if the url doesn't have an origin + if (!absolute && window && window.location) { + url = window.location.origin + url; + } + + base.setAttribute("href", url); +} + +export function replaceCanonical(doc, section){ + var head; + var link; + var url = section.canonical; + + if(!doc){ + return; + } + + head = qs(doc, "head"); + link = qs(head, "link[rel='canonical']"); + + if (link) { + link.setAttribute("href", url); + } else { + link = doc.createElement("link"); + link.setAttribute("rel", "canonical"); + link.setAttribute("href", url); + head.appendChild(link); + } +} + +export function replaceMeta(doc, section){ + var head; + var meta; + var id = section.idref; + if(!doc){ + return; + } + + head = qs(doc, "head"); + meta = qs(head, "link[property='dc.identifier']"); + + if (meta) { + meta.setAttribute("content", id); + } else { + meta = doc.createElement("meta"); + meta.setAttribute("name", "dc.identifier"); + meta.setAttribute("content", id); + head.appendChild(meta); + } +} + +// TODO: move me to Contents +export function replaceLinks(contents, fn) { + + var links = contents.querySelectorAll("a[href]"); + + if (!links.length) { + return; + } + + var base = qs(contents.ownerDocument, "base"); + var location = base ? base.getAttribute("href") : undefined; + var replaceLink = function(link){ + var href = link.getAttribute("href"); + + if(href.indexOf("mailto:") === 0){ + return; + } + + var absolute = (href.indexOf("://") > -1); + + if(absolute){ + + link.setAttribute("target", "_blank"); + + }else{ + var linkUrl; + try { + linkUrl = new Url(href, location); + } catch(error) { + // NOOP + } + + link.onclick = function(){ + + if(linkUrl && linkUrl.hash) { + fn(linkUrl.Path.path + linkUrl.hash); + } else if(linkUrl){ + fn(linkUrl.Path.path); + } else { + fn(href); + } + + return false; + }; + } + }.bind(this); + + for (var i = 0; i < links.length; i++) { + replaceLink(links[i]); + } + + +} + +export function substitute(content, urls, replacements) { + urls.forEach(function(url, i){ + if (url && replacements[i]) { + // Account for special characters in the file name. + // See https://stackoverflow.com/a/6318729. + url = url.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + content = content.replace(new RegExp(url, "g"), replacements[i]); + } + }); + return content; +} -- cgit v1.2.3