| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475 | (function() {  var IMAGE_STYLES, Reloader, numberOfMatchingSegments, pathFromUrl, pathsMatch, pickBestMatch, splitUrl;  splitUrl = function(url) {    var comboSign, hash, index, params;    if ((index = url.indexOf('#')) >= 0) {      hash = url.slice(index);      url = url.slice(0, index);    } else {      hash = '';    }    comboSign = url.indexOf('??');    if (comboSign >= 0) {      if (comboSign + 1 !== url.lastIndexOf('?')) {        index = url.lastIndexOf('?');      }    } else {      index = url.indexOf('?');    }    if (index >= 0) {      params = url.slice(index);      url = url.slice(0, index);    } else {      params = '';    }    return {      url: url,      params: params,      hash: hash    };  };  pathFromUrl = function(url) {    var path;    url = splitUrl(url).url;    if (url.indexOf('file://') === 0) {      path = url.replace(/^file:\/\/(localhost)?/, '');    } else {      path = url.replace(/^([^:]+:)?\/\/([^:\/]+)(:\d*)?\//, '/');    }    return decodeURIComponent(path);  };  pickBestMatch = function(path, objects, pathFunc) {    var bestMatch, i, len1, object, score;    bestMatch = {      score: 0    };    for (i = 0, len1 = objects.length; i < len1; i++) {      object = objects[i];      score = numberOfMatchingSegments(path, pathFunc(object));      if (score > bestMatch.score) {        bestMatch = {          object: object,          score: score        };      }    }    if (bestMatch.score > 0) {      return bestMatch;    } else {      return null;    }  };  numberOfMatchingSegments = function(path1, path2) {    var comps1, comps2, eqCount, len;    path1 = path1.replace(/^\/+/, '').toLowerCase();    path2 = path2.replace(/^\/+/, '').toLowerCase();    if (path1 === path2) {      return 10000;    }    comps1 = path1.split('/').reverse();    comps2 = path2.split('/').reverse();    len = Math.min(comps1.length, comps2.length);    eqCount = 0;    while (eqCount < len && comps1[eqCount] === comps2[eqCount]) {      ++eqCount;    }    return eqCount;  };  pathsMatch = function(path1, path2) {    return numberOfMatchingSegments(path1, path2) > 0;  };  IMAGE_STYLES = [    {      selector: 'background',      styleNames: ['backgroundImage']    }, {      selector: 'border',      styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage']    }  ];  exports.Reloader = Reloader = (function() {    function Reloader(window, console, Timer) {      this.window = window;      this.console = console;      this.Timer = Timer;      this.document = this.window.document;      this.importCacheWaitPeriod = 200;      this.plugins = [];    }    Reloader.prototype.addPlugin = function(plugin) {      return this.plugins.push(plugin);    };    Reloader.prototype.analyze = function(callback) {      return results;    };    Reloader.prototype.reload = function(path, options) {      var base, i, len1, plugin, ref;      this.options = options;      if ((base = this.options).stylesheetReloadTimeout == null) {        base.stylesheetReloadTimeout = 15000;      }      ref = this.plugins;      for (i = 0, len1 = ref.length; i < len1; i++) {        plugin = ref[i];        if (plugin.reload && plugin.reload(path, options)) {          return;        }      }      if (options.liveCSS && path.match(/\.css(?:\.map)?$/i)) {        if (this.reloadStylesheet(path)) {          return;        }      }      if (options.liveImg && path.match(/\.(jpe?g|png|gif)$/i)) {        this.reloadImages(path);        return;      }      if (options.isChromeExtension) {        this.reloadChromeExtension();        return;      }      return this.reloadPage();    };    Reloader.prototype.reloadPage = function() {      return this.window.document.location.reload();    };    Reloader.prototype.reloadChromeExtension = function() {      return this.window.chrome.runtime.reload();    };    Reloader.prototype.reloadImages = function(path) {      var expando, i, img, j, k, len1, len2, len3, len4, m, ref, ref1, ref2, ref3, results1, selector, styleNames, styleSheet;      expando = this.generateUniqueString();      ref = this.document.images;      for (i = 0, len1 = ref.length; i < len1; i++) {        img = ref[i];        if (pathsMatch(path, pathFromUrl(img.src))) {          img.src = this.generateCacheBustUrl(img.src, expando);        }      }      if (this.document.querySelectorAll) {        for (j = 0, len2 = IMAGE_STYLES.length; j < len2; j++) {          ref1 = IMAGE_STYLES[j], selector = ref1.selector, styleNames = ref1.styleNames;          ref2 = this.document.querySelectorAll("[style*=" + selector + "]");          for (k = 0, len3 = ref2.length; k < len3; k++) {            img = ref2[k];            this.reloadStyleImages(img.style, styleNames, path, expando);          }        }      }      if (this.document.styleSheets) {        ref3 = this.document.styleSheets;        results1 = [];        for (m = 0, len4 = ref3.length; m < len4; m++) {          styleSheet = ref3[m];          results1.push(this.reloadStylesheetImages(styleSheet, path, expando));        }        return results1;      }    };    Reloader.prototype.reloadStylesheetImages = function(styleSheet, path, expando) {      var e, error, i, j, len1, len2, rule, rules, styleNames;      try {        rules = styleSheet != null ? styleSheet.cssRules : void 0;      } catch (error) {        e = error;      }      if (!rules) {        return;      }      for (i = 0, len1 = rules.length; i < len1; i++) {        rule = rules[i];        switch (rule.type) {          case CSSRule.IMPORT_RULE:            this.reloadStylesheetImages(rule.styleSheet, path, expando);            break;          case CSSRule.STYLE_RULE:            for (j = 0, len2 = IMAGE_STYLES.length; j < len2; j++) {              styleNames = IMAGE_STYLES[j].styleNames;              this.reloadStyleImages(rule.style, styleNames, path, expando);            }            break;          case CSSRule.MEDIA_RULE:            this.reloadStylesheetImages(rule, path, expando);        }      }    };    Reloader.prototype.reloadStyleImages = function(style, styleNames, path, expando) {      var i, len1, newValue, styleName, value;      for (i = 0, len1 = styleNames.length; i < len1; i++) {        styleName = styleNames[i];        value = style[styleName];        if (typeof value === 'string') {          newValue = value.replace(/\burl\s*\(([^)]*)\)/, (function(_this) {            return function(match, src) {              if (pathsMatch(path, pathFromUrl(src))) {                return "url(" + (_this.generateCacheBustUrl(src, expando)) + ")";              } else {                return match;              }            };          })(this));          if (newValue !== value) {            style[styleName] = newValue;          }        }      }    };    Reloader.prototype.reloadStylesheet = function(path) {      var i, imported, j, k, len1, len2, len3, len4, link, links, m, match, ref, ref1, style;      links = (function() {        var i, len1, ref, results1;        ref = this.document.getElementsByTagName('link');        results1 = [];        for (i = 0, len1 = ref.length; i < len1; i++) {          link = ref[i];          if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) {            results1.push(link);          }        }        return results1;      }).call(this);      imported = [];      ref = this.document.getElementsByTagName('style');      for (i = 0, len1 = ref.length; i < len1; i++) {        style = ref[i];        if (style.sheet) {          this.collectImportedStylesheets(style, style.sheet, imported);        }      }      for (j = 0, len2 = links.length; j < len2; j++) {        link = links[j];        this.collectImportedStylesheets(link, link.sheet, imported);      }      if (this.window.StyleFix && this.document.querySelectorAll) {        ref1 = this.document.querySelectorAll('style[data-href]');        for (k = 0, len3 = ref1.length; k < len3; k++) {          style = ref1[k];          links.push(style);        }      }      this.console.log("LiveReload found " + links.length + " LINKed stylesheets, " + imported.length + " @imported stylesheets");      match = pickBestMatch(path, links.concat(imported), (function(_this) {        return function(l) {          return pathFromUrl(_this.linkHref(l));        };      })(this));      if (match) {        if (match.object.rule) {          this.console.log("LiveReload is reloading imported stylesheet: " + match.object.href);          this.reattachImportedRule(match.object);        } else {          this.console.log("LiveReload is reloading stylesheet: " + (this.linkHref(match.object)));          this.reattachStylesheetLink(match.object);        }      } else {        if (this.options.reloadMissingCSS) {          this.console.log("LiveReload will reload all stylesheets because path '" + path + "' did not match any specific one. To disable this behavior, set 'options.reloadMissingCSS' to 'false'.");          for (m = 0, len4 = links.length; m < len4; m++) {            link = links[m];            this.reattachStylesheetLink(link);          }        } else {          this.console.log("LiveReload will not reload path '" + path + "' because the stylesheet was not found on the page and 'options.reloadMissingCSS' was set to 'false'.");        }      }      return true;    };    Reloader.prototype.collectImportedStylesheets = function(link, styleSheet, result) {      var e, error, i, index, len1, rule, rules;      try {        rules = styleSheet != null ? styleSheet.cssRules : void 0;      } catch (error) {        e = error;      }      if (rules && rules.length) {        for (index = i = 0, len1 = rules.length; i < len1; index = ++i) {          rule = rules[index];          switch (rule.type) {            case CSSRule.CHARSET_RULE:              continue;            case CSSRule.IMPORT_RULE:              result.push({                link: link,                rule: rule,                index: index,                href: rule.href              });              this.collectImportedStylesheets(link, rule.styleSheet, result);              break;            default:              break;          }        }      }    };    Reloader.prototype.waitUntilCssLoads = function(clone, func) {      var callbackExecuted, executeCallback, poll;      callbackExecuted = false;      executeCallback = (function(_this) {        return function() {          if (callbackExecuted) {            return;          }          callbackExecuted = true;          return func();        };      })(this);      clone.onload = (function(_this) {        return function() {          _this.console.log("LiveReload: the new stylesheet has finished loading");          _this.knownToSupportCssOnLoad = true;          return executeCallback();        };      })(this);      if (!this.knownToSupportCssOnLoad) {        (poll = (function(_this) {          return function() {            if (clone.sheet) {              _this.console.log("LiveReload is polling until the new CSS finishes loading...");              return executeCallback();            } else {              return _this.Timer.start(50, poll);            }          };        })(this))();      }      return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback);    };    Reloader.prototype.linkHref = function(link) {      return link.href || link.getAttribute('data-href');    };    Reloader.prototype.reattachStylesheetLink = function(link) {      var clone, parent;      if (link.__LiveReload_pendingRemoval) {        return;      }      link.__LiveReload_pendingRemoval = true;      if (link.tagName === 'STYLE') {        clone = this.document.createElement('link');        clone.rel = 'stylesheet';        clone.media = link.media;        clone.disabled = link.disabled;      } else {        clone = link.cloneNode(false);      }      clone.href = this.generateCacheBustUrl(this.linkHref(link));      parent = link.parentNode;      if (parent.lastChild === link) {        parent.appendChild(clone);      } else {        parent.insertBefore(clone, link.nextSibling);      }      return this.waitUntilCssLoads(clone, (function(_this) {        return function() {          var additionalWaitingTime;          if (/AppleWebKit/.test(navigator.userAgent)) {            additionalWaitingTime = 5;          } else {            additionalWaitingTime = 200;          }          return _this.Timer.start(additionalWaitingTime, function() {            var ref;            if (!link.parentNode) {              return;            }            link.parentNode.removeChild(link);            clone.onreadystatechange = null;            return (ref = _this.window.StyleFix) != null ? ref.link(clone) : void 0;          });        };      })(this));    };    Reloader.prototype.reattachImportedRule = function(arg) {      var href, index, link, media, newRule, parent, rule, tempLink;      rule = arg.rule, index = arg.index, link = arg.link;      parent = rule.parentStyleSheet;      href = this.generateCacheBustUrl(rule.href);      media = rule.media.length ? [].join.call(rule.media, ', ') : '';      newRule = "@import url(\"" + href + "\") " + media + ";";      rule.__LiveReload_newHref = href;      tempLink = this.document.createElement("link");      tempLink.rel = 'stylesheet';      tempLink.href = href;      tempLink.__LiveReload_pendingRemoval = true;      if (link.parentNode) {        link.parentNode.insertBefore(tempLink, link);      }      return this.Timer.start(this.importCacheWaitPeriod, (function(_this) {        return function() {          if (tempLink.parentNode) {            tempLink.parentNode.removeChild(tempLink);          }          if (rule.__LiveReload_newHref !== href) {            return;          }          parent.insertRule(newRule, index);          parent.deleteRule(index + 1);          rule = parent.cssRules[index];          rule.__LiveReload_newHref = href;          return _this.Timer.start(_this.importCacheWaitPeriod, function() {            if (rule.__LiveReload_newHref !== href) {              return;            }            parent.insertRule(newRule, index);            return parent.deleteRule(index + 1);          });        };      })(this));    };    Reloader.prototype.generateUniqueString = function() {      return 'livereload=' + Date.now();    };    Reloader.prototype.generateCacheBustUrl = function(url, expando) {      var hash, oldParams, originalUrl, params, ref;      if (expando == null) {        expando = this.generateUniqueString();      }      ref = splitUrl(url), url = ref.url, hash = ref.hash, oldParams = ref.params;      if (this.options.overrideURL) {        if (url.indexOf(this.options.serverURL) < 0) {          originalUrl = url;          url = this.options.serverURL + this.options.overrideURL + "?url=" + encodeURIComponent(url);          this.console.log("LiveReload is overriding source URL " + originalUrl + " with " + url);        }      }      params = oldParams.replace(/(\?|&)livereload=(\d+)/, function(match, sep) {        return "" + sep + expando;      });      if (params === oldParams) {        if (oldParams.length === 0) {          params = "?" + expando;        } else {          params = oldParams + "&" + expando;        }      }      return url + params + hash;    };    return Reloader;  })();}).call(this);
 |