summaryrefslogtreecommitdiff
path: root/lib/epub.js/src/utils/replacements.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/epub.js/src/utils/replacements.js')
-rw-r--r--lib/epub.js/src/utils/replacements.js138
1 files changed, 138 insertions, 0 deletions
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;
+}