var EPUBJS = EPUBJS || {}; EPUBJS.replace = {}; EPUBJS.replace.head = function(callback, renderer) { renderer.replaceWithStored("link[href]", "href", EPUBJS.replace.links, callback); }; //-- Replaces assets src's to point to stored version if browser is offline EPUBJS.replace.resources = function(callback, renderer){ //srcs = this.doc.querySelectorAll('[src]'); renderer.replaceWithStored("[src]", "src", EPUBJS.replace.srcs, callback); }; EPUBJS.replace.svg = function(callback, renderer) { renderer.replaceWithStored("image", "xlink:href", function(_store, full, done){ _store.getUrl(full).then(done); }, callback); }; EPUBJS.replace.srcs = function(_store, full, done){ _store.getUrl(full).then(done); }; //-- Replaces links in head, such as stylesheets - link[href] EPUBJS.replace.links = function(_store, full, done, link){ //-- Handle replacing urls in CSS if(link.getAttribute("rel") === "stylesheet") { EPUBJS.replace.stylesheets(_store, full).then(done); }else{ _store.getUrl(full).then(done); } }; EPUBJS.replace.stylesheets = function(_store, full) { var deferred = new RSVP.defer(); if(!_store) return; _store.getText(full).then(function(text){ var url; EPUBJS.replace.cssUrls(_store, full, text).then(function(newText){ var _URL = window.URL || window.webkitURL || window.mozURL; var blob = new Blob([newText], { "type" : "text\/css" }), url = _URL.createObjectURL(blob); deferred.resolve(url); }, function(e) { console.error(e); }); }); return deferred.promise; }; EPUBJS.replace.cssUrls = function(_store, base, text){ var deferred = new RSVP.defer(), promises = [], matches = text.match(/url\(\'?\"?([^\'|^\"]*)\'?\"?\)/g); if(!_store) return; if(!matches){ deferred.resolve(text); return deferred.promise; } matches.forEach(function(str){ var full = EPUBJS.core.resolveUrl(base, str.replace(/url\(|[|\)|\'|\"]/g, '')); var replaced = _store.getUrl(full).then(function(url){ text = text.replace(str, 'url("'+url+'")'); }, function(e) { console.error(e); }); promises.push(replaced); }); RSVP.all(promises).then(function(){ deferred.resolve(text); }); return deferred.promise; };