github.com/rezahousseini/hugo@v0.32.3/docs/static/js/livereload.js (about)

     1  (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
     2  (function() {
     3    var Connector, PROTOCOL_6, PROTOCOL_7, Parser, Version, _ref;
     4  
     5    _ref = require('./protocol'), Parser = _ref.Parser, PROTOCOL_6 = _ref.PROTOCOL_6, PROTOCOL_7 = _ref.PROTOCOL_7;
     6  
     7    Version = '2.2.1';
     8  
     9    exports.Connector = Connector = (function() {
    10      function Connector(options, WebSocket, Timer, handlers) {
    11        this.options = options;
    12        this.WebSocket = WebSocket;
    13        this.Timer = Timer;
    14        this.handlers = handlers;
    15        this._uri = "ws://" + this.options.host + ":" + this.options.port + "/livereload";
    16        this._nextDelay = this.options.mindelay;
    17        this._connectionDesired = false;
    18        this.protocol = 0;
    19        this.protocolParser = new Parser({
    20          connected: (function(_this) {
    21            return function(protocol) {
    22              _this.protocol = protocol;
    23              _this._handshakeTimeout.stop();
    24              _this._nextDelay = _this.options.mindelay;
    25              _this._disconnectionReason = 'broken';
    26              return _this.handlers.connected(protocol);
    27            };
    28          })(this),
    29          error: (function(_this) {
    30            return function(e) {
    31              _this.handlers.error(e);
    32              return _this._closeOnError();
    33            };
    34          })(this),
    35          message: (function(_this) {
    36            return function(message) {
    37              return _this.handlers.message(message);
    38            };
    39          })(this)
    40        });
    41        this._handshakeTimeout = new Timer((function(_this) {
    42          return function() {
    43            if (!_this._isSocketConnected()) {
    44              return;
    45            }
    46            _this._disconnectionReason = 'handshake-timeout';
    47            return _this.socket.close();
    48          };
    49        })(this));
    50        this._reconnectTimer = new Timer((function(_this) {
    51          return function() {
    52            if (!_this._connectionDesired) {
    53              return;
    54            }
    55            return _this.connect();
    56          };
    57        })(this));
    58        this.connect();
    59      }
    60  
    61      Connector.prototype._isSocketConnected = function() {
    62        return this.socket && this.socket.readyState === this.WebSocket.OPEN;
    63      };
    64  
    65      Connector.prototype.connect = function() {
    66        this._connectionDesired = true;
    67        if (this._isSocketConnected()) {
    68          return;
    69        }
    70        this._reconnectTimer.stop();
    71        this._disconnectionReason = 'cannot-connect';
    72        this.protocolParser.reset();
    73        this.handlers.connecting();
    74        this.socket = new this.WebSocket(this._uri);
    75        this.socket.onopen = (function(_this) {
    76          return function(e) {
    77            return _this._onopen(e);
    78          };
    79        })(this);
    80        this.socket.onclose = (function(_this) {
    81          return function(e) {
    82            return _this._onclose(e);
    83          };
    84        })(this);
    85        this.socket.onmessage = (function(_this) {
    86          return function(e) {
    87            return _this._onmessage(e);
    88          };
    89        })(this);
    90        return this.socket.onerror = (function(_this) {
    91          return function(e) {
    92            return _this._onerror(e);
    93          };
    94        })(this);
    95      };
    96  
    97      Connector.prototype.disconnect = function() {
    98        this._connectionDesired = false;
    99        this._reconnectTimer.stop();
   100        if (!this._isSocketConnected()) {
   101          return;
   102        }
   103        this._disconnectionReason = 'manual';
   104        return this.socket.close();
   105      };
   106  
   107      Connector.prototype._scheduleReconnection = function() {
   108        if (!this._connectionDesired) {
   109          return;
   110        }
   111        if (!this._reconnectTimer.running) {
   112          this._reconnectTimer.start(this._nextDelay);
   113          return this._nextDelay = Math.min(this.options.maxdelay, this._nextDelay * 2);
   114        }
   115      };
   116  
   117      Connector.prototype.sendCommand = function(command) {
   118        if (this.protocol == null) {
   119          return;
   120        }
   121        return this._sendCommand(command);
   122      };
   123  
   124      Connector.prototype._sendCommand = function(command) {
   125        return this.socket.send(JSON.stringify(command));
   126      };
   127  
   128      Connector.prototype._closeOnError = function() {
   129        this._handshakeTimeout.stop();
   130        this._disconnectionReason = 'error';
   131        return this.socket.close();
   132      };
   133  
   134      Connector.prototype._onopen = function(e) {
   135        var hello;
   136        this.handlers.socketConnected();
   137        this._disconnectionReason = 'handshake-failed';
   138        hello = {
   139          command: 'hello',
   140          protocols: [PROTOCOL_6, PROTOCOL_7]
   141        };
   142        hello.ver = Version;
   143        if (this.options.ext) {
   144          hello.ext = this.options.ext;
   145        }
   146        if (this.options.extver) {
   147          hello.extver = this.options.extver;
   148        }
   149        if (this.options.snipver) {
   150          hello.snipver = this.options.snipver;
   151        }
   152        this._sendCommand(hello);
   153        return this._handshakeTimeout.start(this.options.handshake_timeout);
   154      };
   155  
   156      Connector.prototype._onclose = function(e) {
   157        this.protocol = 0;
   158        this.handlers.disconnected(this._disconnectionReason, this._nextDelay);
   159        return this._scheduleReconnection();
   160      };
   161  
   162      Connector.prototype._onerror = function(e) {};
   163  
   164      Connector.prototype._onmessage = function(e) {
   165        return this.protocolParser.process(e.data);
   166      };
   167  
   168      return Connector;
   169  
   170    })();
   171  
   172  }).call(this);
   173  
   174  },{"./protocol":6}],2:[function(require,module,exports){
   175  (function() {
   176    var CustomEvents;
   177  
   178    CustomEvents = {
   179      bind: function(element, eventName, handler) {
   180        if (element.addEventListener) {
   181          return element.addEventListener(eventName, handler, false);
   182        } else if (element.attachEvent) {
   183          element[eventName] = 1;
   184          return element.attachEvent('onpropertychange', function(event) {
   185            if (event.propertyName === eventName) {
   186              return handler();
   187            }
   188          });
   189        } else {
   190          throw new Error("Attempt to attach custom event " + eventName + " to something which isn't a DOMElement");
   191        }
   192      },
   193      fire: function(element, eventName) {
   194        var event;
   195        if (element.addEventListener) {
   196          event = document.createEvent('HTMLEvents');
   197          event.initEvent(eventName, true, true);
   198          return document.dispatchEvent(event);
   199        } else if (element.attachEvent) {
   200          if (element[eventName]) {
   201            return element[eventName]++;
   202          }
   203        } else {
   204          throw new Error("Attempt to fire custom event " + eventName + " on something which isn't a DOMElement");
   205        }
   206      }
   207    };
   208  
   209    exports.bind = CustomEvents.bind;
   210  
   211    exports.fire = CustomEvents.fire;
   212  
   213  }).call(this);
   214  
   215  },{}],3:[function(require,module,exports){
   216  (function() {
   217    var LessPlugin;
   218  
   219    module.exports = LessPlugin = (function() {
   220      LessPlugin.identifier = 'less';
   221  
   222      LessPlugin.version = '1.0';
   223  
   224      function LessPlugin(window, host) {
   225        this.window = window;
   226        this.host = host;
   227      }
   228  
   229      LessPlugin.prototype.reload = function(path, options) {
   230        if (this.window.less && this.window.less.refresh) {
   231          if (path.match(/\.less$/i)) {
   232            return this.reloadLess(path);
   233          }
   234          if (options.originalPath.match(/\.less$/i)) {
   235            return this.reloadLess(options.originalPath);
   236          }
   237        }
   238        return false;
   239      };
   240  
   241      LessPlugin.prototype.reloadLess = function(path) {
   242        var link, links, _i, _len;
   243        links = (function() {
   244          var _i, _len, _ref, _results;
   245          _ref = document.getElementsByTagName('link');
   246          _results = [];
   247          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
   248            link = _ref[_i];
   249            if (link.href && link.rel.match(/^stylesheet\/less$/i) || (link.rel.match(/stylesheet/i) && link.type.match(/^text\/(x-)?less$/i))) {
   250              _results.push(link);
   251            }
   252          }
   253          return _results;
   254        })();
   255        if (links.length === 0) {
   256          return false;
   257        }
   258        for (_i = 0, _len = links.length; _i < _len; _i++) {
   259          link = links[_i];
   260          link.href = this.host.generateCacheBustUrl(link.href);
   261        }
   262        this.host.console.log("LiveReload is asking LESS to recompile all stylesheets");
   263        this.window.less.refresh(true);
   264        return true;
   265      };
   266  
   267      LessPlugin.prototype.analyze = function() {
   268        return {
   269          disable: !!(this.window.less && this.window.less.refresh)
   270        };
   271      };
   272  
   273      return LessPlugin;
   274  
   275    })();
   276  
   277  }).call(this);
   278  
   279  },{}],4:[function(require,module,exports){
   280  (function() {
   281    var Connector, LiveReload, Options, Reloader, Timer;
   282  
   283    Connector = require('./connector').Connector;
   284  
   285    Timer = require('./timer').Timer;
   286  
   287    Options = require('./options').Options;
   288  
   289    Reloader = require('./reloader').Reloader;
   290  
   291    exports.LiveReload = LiveReload = (function() {
   292      function LiveReload(window) {
   293        this.window = window;
   294        this.listeners = {};
   295        this.plugins = [];
   296        this.pluginIdentifiers = {};
   297        this.console = this.window.location.href.match(/LR-verbose/) && this.window.console && this.window.console.log && this.window.console.error ? this.window.console : {
   298          log: function() {},
   299          error: function() {}
   300        };
   301        if (!(this.WebSocket = this.window.WebSocket || this.window.MozWebSocket)) {
   302          this.console.error("LiveReload disabled because the browser does not seem to support web sockets");
   303          return;
   304        }
   305        if (!(this.options = Options.extract(this.window.document))) {
   306          this.console.error("LiveReload disabled because it could not find its own <SCRIPT> tag");
   307          return;
   308        }
   309        this.reloader = new Reloader(this.window, this.console, Timer);
   310        this.connector = new Connector(this.options, this.WebSocket, Timer, {
   311          connecting: (function(_this) {
   312            return function() {};
   313          })(this),
   314          socketConnected: (function(_this) {
   315            return function() {};
   316          })(this),
   317          connected: (function(_this) {
   318            return function(protocol) {
   319              var _base;
   320              if (typeof (_base = _this.listeners).connect === "function") {
   321                _base.connect();
   322              }
   323              _this.log("LiveReload is connected to " + _this.options.host + ":" + _this.options.port + " (protocol v" + protocol + ").");
   324              return _this.analyze();
   325            };
   326          })(this),
   327          error: (function(_this) {
   328            return function(e) {
   329              if (e instanceof ProtocolError) {
   330                if (typeof console !== "undefined" && console !== null) {
   331                  return console.log("" + e.message + ".");
   332                }
   333              } else {
   334                if (typeof console !== "undefined" && console !== null) {
   335                  return console.log("LiveReload internal error: " + e.message);
   336                }
   337              }
   338            };
   339          })(this),
   340          disconnected: (function(_this) {
   341            return function(reason, nextDelay) {
   342              var _base;
   343              if (typeof (_base = _this.listeners).disconnect === "function") {
   344                _base.disconnect();
   345              }
   346              switch (reason) {
   347                case 'cannot-connect':
   348                  return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + ", will retry in " + nextDelay + " sec.");
   349                case 'broken':
   350                  return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + ", reconnecting in " + nextDelay + " sec.");
   351                case 'handshake-timeout':
   352                  return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake timeout), will retry in " + nextDelay + " sec.");
   353                case 'handshake-failed':
   354                  return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake failed), will retry in " + nextDelay + " sec.");
   355                case 'manual':
   356                  break;
   357                case 'error':
   358                  break;
   359                default:
   360                  return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + " (" + reason + "), reconnecting in " + nextDelay + " sec.");
   361              }
   362            };
   363          })(this),
   364          message: (function(_this) {
   365            return function(message) {
   366              switch (message.command) {
   367                case 'reload':
   368                  return _this.performReload(message);
   369                case 'alert':
   370                  return _this.performAlert(message);
   371              }
   372            };
   373          })(this)
   374        });
   375      }
   376  
   377      LiveReload.prototype.on = function(eventName, handler) {
   378        return this.listeners[eventName] = handler;
   379      };
   380  
   381      LiveReload.prototype.log = function(message) {
   382        return this.console.log("" + message);
   383      };
   384  
   385      LiveReload.prototype.performReload = function(message) {
   386        var _ref, _ref1;
   387        this.log("LiveReload received reload request: " + (JSON.stringify(message, null, 2)));
   388        return this.reloader.reload(message.path, {
   389          liveCSS: (_ref = message.liveCSS) != null ? _ref : true,
   390          liveImg: (_ref1 = message.liveImg) != null ? _ref1 : true,
   391          originalPath: message.originalPath || '',
   392          overrideURL: message.overrideURL || '',
   393          serverURL: "http://" + this.options.host + ":" + this.options.port
   394        });
   395      };
   396  
   397      LiveReload.prototype.performAlert = function(message) {
   398        return alert(message.message);
   399      };
   400  
   401      LiveReload.prototype.shutDown = function() {
   402        var _base;
   403        this.connector.disconnect();
   404        this.log("LiveReload disconnected.");
   405        return typeof (_base = this.listeners).shutdown === "function" ? _base.shutdown() : void 0;
   406      };
   407  
   408      LiveReload.prototype.hasPlugin = function(identifier) {
   409        return !!this.pluginIdentifiers[identifier];
   410      };
   411  
   412      LiveReload.prototype.addPlugin = function(pluginClass) {
   413        var plugin;
   414        if (this.hasPlugin(pluginClass.identifier)) {
   415          return;
   416        }
   417        this.pluginIdentifiers[pluginClass.identifier] = true;
   418        plugin = new pluginClass(this.window, {
   419          _livereload: this,
   420          _reloader: this.reloader,
   421          _connector: this.connector,
   422          console: this.console,
   423          Timer: Timer,
   424          generateCacheBustUrl: (function(_this) {
   425            return function(url) {
   426              return _this.reloader.generateCacheBustUrl(url);
   427            };
   428          })(this)
   429        });
   430        this.plugins.push(plugin);
   431        this.reloader.addPlugin(plugin);
   432      };
   433  
   434      LiveReload.prototype.analyze = function() {
   435        var plugin, pluginData, pluginsData, _i, _len, _ref;
   436        if (!(this.connector.protocol >= 7)) {
   437          return;
   438        }
   439        pluginsData = {};
   440        _ref = this.plugins;
   441        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
   442          plugin = _ref[_i];
   443          pluginsData[plugin.constructor.identifier] = pluginData = (typeof plugin.analyze === "function" ? plugin.analyze() : void 0) || {};
   444          pluginData.version = plugin.constructor.version;
   445        }
   446        this.connector.sendCommand({
   447          command: 'info',
   448          plugins: pluginsData,
   449          url: this.window.location.href
   450        });
   451      };
   452  
   453      return LiveReload;
   454  
   455    })();
   456  
   457  }).call(this);
   458  
   459  },{"./connector":1,"./options":5,"./reloader":7,"./timer":9}],5:[function(require,module,exports){
   460  (function() {
   461    var Options;
   462  
   463    exports.Options = Options = (function() {
   464      function Options() {
   465        this.host = null;
   466        this.port = 35729;
   467        this.snipver = null;
   468        this.ext = null;
   469        this.extver = null;
   470        this.mindelay = 1000;
   471        this.maxdelay = 60000;
   472        this.handshake_timeout = 5000;
   473      }
   474  
   475      Options.prototype.set = function(name, value) {
   476        if (typeof value === 'undefined') {
   477          return;
   478        }
   479        if (!isNaN(+value)) {
   480          value = +value;
   481        }
   482        return this[name] = value;
   483      };
   484  
   485      return Options;
   486  
   487    })();
   488  
   489    Options.extract = function(document) {
   490      var element, keyAndValue, m, mm, options, pair, src, _i, _j, _len, _len1, _ref, _ref1;
   491      _ref = document.getElementsByTagName('script');
   492      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
   493        element = _ref[_i];
   494        if ((src = element.src) && (m = src.match(/^[^:]+:\/\/(.*)\/z?livereload\.js(?:\?(.*))?$/))) {
   495          options = new Options();
   496          if (mm = m[1].match(/^([^\/:]+)(?::(\d+))?$/)) {
   497            options.host = mm[1];
   498            if (mm[2]) {
   499              options.port = parseInt(mm[2], 10);
   500            }
   501          }
   502          if (m[2]) {
   503            _ref1 = m[2].split('&');
   504            for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
   505              pair = _ref1[_j];
   506              if ((keyAndValue = pair.split('=')).length > 1) {
   507                options.set(keyAndValue[0].replace(/-/g, '_'), keyAndValue.slice(1).join('='));
   508              }
   509            }
   510          }
   511          return options;
   512        }
   513      }
   514      return null;
   515    };
   516  
   517  }).call(this);
   518  
   519  },{}],6:[function(require,module,exports){
   520  (function() {
   521    var PROTOCOL_6, PROTOCOL_7, Parser, ProtocolError,
   522      __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
   523  
   524    exports.PROTOCOL_6 = PROTOCOL_6 = 'http://livereload.com/protocols/official-6';
   525  
   526    exports.PROTOCOL_7 = PROTOCOL_7 = 'http://livereload.com/protocols/official-7';
   527  
   528    exports.ProtocolError = ProtocolError = (function() {
   529      function ProtocolError(reason, data) {
   530        this.message = "LiveReload protocol error (" + reason + ") after receiving data: \"" + data + "\".";
   531      }
   532  
   533      return ProtocolError;
   534  
   535    })();
   536  
   537    exports.Parser = Parser = (function() {
   538      function Parser(handlers) {
   539        this.handlers = handlers;
   540        this.reset();
   541      }
   542  
   543      Parser.prototype.reset = function() {
   544        return this.protocol = null;
   545      };
   546  
   547      Parser.prototype.process = function(data) {
   548        var command, e, message, options, _ref;
   549        try {
   550          if (this.protocol == null) {
   551            if (data.match(/^!!ver:([\d.]+)$/)) {
   552              this.protocol = 6;
   553            } else if (message = this._parseMessage(data, ['hello'])) {
   554              if (!message.protocols.length) {
   555                throw new ProtocolError("no protocols specified in handshake message");
   556              } else if (__indexOf.call(message.protocols, PROTOCOL_7) >= 0) {
   557                this.protocol = 7;
   558              } else if (__indexOf.call(message.protocols, PROTOCOL_6) >= 0) {
   559                this.protocol = 6;
   560              } else {
   561                throw new ProtocolError("no supported protocols found");
   562              }
   563            }
   564            return this.handlers.connected(this.protocol);
   565          } else if (this.protocol === 6) {
   566            message = JSON.parse(data);
   567            if (!message.length) {
   568              throw new ProtocolError("protocol 6 messages must be arrays");
   569            }
   570            command = message[0], options = message[1];
   571            if (command !== 'refresh') {
   572              throw new ProtocolError("unknown protocol 6 command");
   573            }
   574            return this.handlers.message({
   575              command: 'reload',
   576              path: options.path,
   577              liveCSS: (_ref = options.apply_css_live) != null ? _ref : true
   578            });
   579          } else {
   580            message = this._parseMessage(data, ['reload', 'alert']);
   581            return this.handlers.message(message);
   582          }
   583        } catch (_error) {
   584          e = _error;
   585          if (e instanceof ProtocolError) {
   586            return this.handlers.error(e);
   587          } else {
   588            throw e;
   589          }
   590        }
   591      };
   592  
   593      Parser.prototype._parseMessage = function(data, validCommands) {
   594        var e, message, _ref;
   595        try {
   596          message = JSON.parse(data);
   597        } catch (_error) {
   598          e = _error;
   599          throw new ProtocolError('unparsable JSON', data);
   600        }
   601        if (!message.command) {
   602          throw new ProtocolError('missing "command" key', data);
   603        }
   604        if (_ref = message.command, __indexOf.call(validCommands, _ref) < 0) {
   605          throw new ProtocolError("invalid command '" + message.command + "', only valid commands are: " + (validCommands.join(', ')) + ")", data);
   606        }
   607        return message;
   608      };
   609  
   610      return Parser;
   611  
   612    })();
   613  
   614  }).call(this);
   615  
   616  },{}],7:[function(require,module,exports){
   617  (function() {
   618    var IMAGE_STYLES, Reloader, numberOfMatchingSegments, pathFromUrl, pathsMatch, pickBestMatch, splitUrl;
   619  
   620    splitUrl = function(url) {
   621      var hash, index, params;
   622      if ((index = url.indexOf('#')) >= 0) {
   623        hash = url.slice(index);
   624        url = url.slice(0, index);
   625      } else {
   626        hash = '';
   627      }
   628      if ((index = url.indexOf('?')) >= 0) {
   629        params = url.slice(index);
   630        url = url.slice(0, index);
   631      } else {
   632        params = '';
   633      }
   634      return {
   635        url: url,
   636        params: params,
   637        hash: hash
   638      };
   639    };
   640  
   641    pathFromUrl = function(url) {
   642      var path;
   643      url = splitUrl(url).url;
   644      if (url.indexOf('file://') === 0) {
   645        path = url.replace(/^file:\/\/(localhost)?/, '');
   646      } else {
   647        path = url.replace(/^([^:]+:)?\/\/([^:\/]+)(:\d*)?\//, '/');
   648      }
   649      return decodeURIComponent(path);
   650    };
   651  
   652    pickBestMatch = function(path, objects, pathFunc) {
   653      var bestMatch, object, score, _i, _len;
   654      bestMatch = {
   655        score: 0
   656      };
   657      for (_i = 0, _len = objects.length; _i < _len; _i++) {
   658        object = objects[_i];
   659        score = numberOfMatchingSegments(path, pathFunc(object));
   660        if (score > bestMatch.score) {
   661          bestMatch = {
   662            object: object,
   663            score: score
   664          };
   665        }
   666      }
   667      if (bestMatch.score > 0) {
   668        return bestMatch;
   669      } else {
   670        return null;
   671      }
   672    };
   673  
   674    numberOfMatchingSegments = function(path1, path2) {
   675      var comps1, comps2, eqCount, len;
   676      path1 = path1.replace(/^\/+/, '').toLowerCase();
   677      path2 = path2.replace(/^\/+/, '').toLowerCase();
   678      if (path1 === path2) {
   679        return 10000;
   680      }
   681      comps1 = path1.split('/').reverse();
   682      comps2 = path2.split('/').reverse();
   683      len = Math.min(comps1.length, comps2.length);
   684      eqCount = 0;
   685      while (eqCount < len && comps1[eqCount] === comps2[eqCount]) {
   686        ++eqCount;
   687      }
   688      return eqCount;
   689    };
   690  
   691    pathsMatch = function(path1, path2) {
   692      return numberOfMatchingSegments(path1, path2) > 0;
   693    };
   694  
   695    IMAGE_STYLES = [
   696      {
   697        selector: 'background',
   698        styleNames: ['backgroundImage']
   699      }, {
   700        selector: 'border',
   701        styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage']
   702      }
   703    ];
   704  
   705    exports.Reloader = Reloader = (function() {
   706      function Reloader(window, console, Timer) {
   707        this.window = window;
   708        this.console = console;
   709        this.Timer = Timer;
   710        this.document = this.window.document;
   711        this.importCacheWaitPeriod = 200;
   712        this.plugins = [];
   713      }
   714  
   715      Reloader.prototype.addPlugin = function(plugin) {
   716        return this.plugins.push(plugin);
   717      };
   718  
   719      Reloader.prototype.analyze = function(callback) {
   720        return results;
   721      };
   722  
   723      Reloader.prototype.reload = function(path, options) {
   724        var plugin, _base, _i, _len, _ref;
   725        this.options = options;
   726        if ((_base = this.options).stylesheetReloadTimeout == null) {
   727          _base.stylesheetReloadTimeout = 15000;
   728        }
   729        _ref = this.plugins;
   730        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
   731          plugin = _ref[_i];
   732          if (plugin.reload && plugin.reload(path, options)) {
   733            return;
   734          }
   735        }
   736        if (options.liveCSS) {
   737          if (path.match(/\.css$/i)) {
   738            if (this.reloadStylesheet(path)) {
   739              return;
   740            }
   741          }
   742        }
   743        if (options.liveImg) {
   744          if (path.match(/\.(jpe?g|png|gif)$/i)) {
   745            this.reloadImages(path);
   746            return;
   747          }
   748        }
   749        return this.reloadPage();
   750      };
   751  
   752      Reloader.prototype.reloadPage = function() {
   753        return this.window.document.location.reload();
   754      };
   755  
   756      Reloader.prototype.reloadImages = function(path) {
   757        var expando, img, selector, styleNames, styleSheet, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _results;
   758        expando = this.generateUniqueString();
   759        _ref = this.document.images;
   760        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
   761          img = _ref[_i];
   762          if (pathsMatch(path, pathFromUrl(img.src))) {
   763            img.src = this.generateCacheBustUrl(img.src, expando);
   764          }
   765        }
   766        if (this.document.querySelectorAll) {
   767          for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) {
   768            _ref1 = IMAGE_STYLES[_j], selector = _ref1.selector, styleNames = _ref1.styleNames;
   769            _ref2 = this.document.querySelectorAll("[style*=" + selector + "]");
   770            for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
   771              img = _ref2[_k];
   772              this.reloadStyleImages(img.style, styleNames, path, expando);
   773            }
   774          }
   775        }
   776        if (this.document.styleSheets) {
   777          _ref3 = this.document.styleSheets;
   778          _results = [];
   779          for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
   780            styleSheet = _ref3[_l];
   781            _results.push(this.reloadStylesheetImages(styleSheet, path, expando));
   782          }
   783          return _results;
   784        }
   785      };
   786  
   787      Reloader.prototype.reloadStylesheetImages = function(styleSheet, path, expando) {
   788        var e, rule, rules, styleNames, _i, _j, _len, _len1;
   789        try {
   790          rules = styleSheet != null ? styleSheet.cssRules : void 0;
   791        } catch (_error) {
   792          e = _error;
   793        }
   794        if (!rules) {
   795          return;
   796        }
   797        for (_i = 0, _len = rules.length; _i < _len; _i++) {
   798          rule = rules[_i];
   799          switch (rule.type) {
   800            case CSSRule.IMPORT_RULE:
   801              this.reloadStylesheetImages(rule.styleSheet, path, expando);
   802              break;
   803            case CSSRule.STYLE_RULE:
   804              for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) {
   805                styleNames = IMAGE_STYLES[_j].styleNames;
   806                this.reloadStyleImages(rule.style, styleNames, path, expando);
   807              }
   808              break;
   809            case CSSRule.MEDIA_RULE:
   810              this.reloadStylesheetImages(rule, path, expando);
   811          }
   812        }
   813      };
   814  
   815      Reloader.prototype.reloadStyleImages = function(style, styleNames, path, expando) {
   816        var newValue, styleName, value, _i, _len;
   817        for (_i = 0, _len = styleNames.length; _i < _len; _i++) {
   818          styleName = styleNames[_i];
   819          value = style[styleName];
   820          if (typeof value === 'string') {
   821            newValue = value.replace(/\burl\s*\(([^)]*)\)/, (function(_this) {
   822              return function(match, src) {
   823                if (pathsMatch(path, pathFromUrl(src))) {
   824                  return "url(" + (_this.generateCacheBustUrl(src, expando)) + ")";
   825                } else {
   826                  return match;
   827                }
   828              };
   829            })(this));
   830            if (newValue !== value) {
   831              style[styleName] = newValue;
   832            }
   833          }
   834        }
   835      };
   836  
   837      Reloader.prototype.reloadStylesheet = function(path) {
   838        var imported, link, links, match, style, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1;
   839        links = (function() {
   840          var _i, _len, _ref, _results;
   841          _ref = this.document.getElementsByTagName('link');
   842          _results = [];
   843          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
   844            link = _ref[_i];
   845            if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) {
   846              _results.push(link);
   847            }
   848          }
   849          return _results;
   850        }).call(this);
   851        imported = [];
   852        _ref = this.document.getElementsByTagName('style');
   853        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
   854          style = _ref[_i];
   855          if (style.sheet) {
   856            this.collectImportedStylesheets(style, style.sheet, imported);
   857          }
   858        }
   859        for (_j = 0, _len1 = links.length; _j < _len1; _j++) {
   860          link = links[_j];
   861          this.collectImportedStylesheets(link, link.sheet, imported);
   862        }
   863        if (this.window.StyleFix && this.document.querySelectorAll) {
   864          _ref1 = this.document.querySelectorAll('style[data-href]');
   865          for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {
   866            style = _ref1[_k];
   867            links.push(style);
   868          }
   869        }
   870        this.console.log("LiveReload found " + links.length + " LINKed stylesheets, " + imported.length + " @imported stylesheets");
   871        match = pickBestMatch(path, links.concat(imported), (function(_this) {
   872          return function(l) {
   873            return pathFromUrl(_this.linkHref(l));
   874          };
   875        })(this));
   876        if (match) {
   877          if (match.object.rule) {
   878            this.console.log("LiveReload is reloading imported stylesheet: " + match.object.href);
   879            this.reattachImportedRule(match.object);
   880          } else {
   881            this.console.log("LiveReload is reloading stylesheet: " + (this.linkHref(match.object)));
   882            this.reattachStylesheetLink(match.object);
   883          }
   884        } else {
   885          this.console.log("LiveReload will reload all stylesheets because path '" + path + "' did not match any specific one");
   886          for (_l = 0, _len3 = links.length; _l < _len3; _l++) {
   887            link = links[_l];
   888            this.reattachStylesheetLink(link);
   889          }
   890        }
   891        return true;
   892      };
   893  
   894      Reloader.prototype.collectImportedStylesheets = function(link, styleSheet, result) {
   895        var e, index, rule, rules, _i, _len;
   896        try {
   897          rules = styleSheet != null ? styleSheet.cssRules : void 0;
   898        } catch (_error) {
   899          e = _error;
   900        }
   901        if (rules && rules.length) {
   902          for (index = _i = 0, _len = rules.length; _i < _len; index = ++_i) {
   903            rule = rules[index];
   904            switch (rule.type) {
   905              case CSSRule.CHARSET_RULE:
   906                continue;
   907              case CSSRule.IMPORT_RULE:
   908                result.push({
   909                  link: link,
   910                  rule: rule,
   911                  index: index,
   912                  href: rule.href
   913                });
   914                this.collectImportedStylesheets(link, rule.styleSheet, result);
   915                break;
   916              default:
   917                break;
   918            }
   919          }
   920        }
   921      };
   922  
   923      Reloader.prototype.waitUntilCssLoads = function(clone, func) {
   924        var callbackExecuted, executeCallback, poll;
   925        callbackExecuted = false;
   926        executeCallback = (function(_this) {
   927          return function() {
   928            if (callbackExecuted) {
   929              return;
   930            }
   931            callbackExecuted = true;
   932            return func();
   933          };
   934        })(this);
   935        clone.onload = (function(_this) {
   936          return function() {
   937            _this.console.log("LiveReload: the new stylesheet has finished loading");
   938            _this.knownToSupportCssOnLoad = true;
   939            return executeCallback();
   940          };
   941        })(this);
   942        if (!this.knownToSupportCssOnLoad) {
   943          (poll = (function(_this) {
   944            return function() {
   945              if (clone.sheet) {
   946                _this.console.log("LiveReload is polling until the new CSS finishes loading...");
   947                return executeCallback();
   948              } else {
   949                return _this.Timer.start(50, poll);
   950              }
   951            };
   952          })(this))();
   953        }
   954        return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback);
   955      };
   956  
   957      Reloader.prototype.linkHref = function(link) {
   958        return link.href || link.getAttribute('data-href');
   959      };
   960  
   961      Reloader.prototype.reattachStylesheetLink = function(link) {
   962        var clone, parent;
   963        if (link.__LiveReload_pendingRemoval) {
   964          return;
   965        }
   966        link.__LiveReload_pendingRemoval = true;
   967        if (link.tagName === 'STYLE') {
   968          clone = this.document.createElement('link');
   969          clone.rel = 'stylesheet';
   970          clone.media = link.media;
   971          clone.disabled = link.disabled;
   972        } else {
   973          clone = link.cloneNode(false);
   974        }
   975        clone.href = this.generateCacheBustUrl(this.linkHref(link));
   976        parent = link.parentNode;
   977        if (parent.lastChild === link) {
   978          parent.appendChild(clone);
   979        } else {
   980          parent.insertBefore(clone, link.nextSibling);
   981        }
   982        return this.waitUntilCssLoads(clone, (function(_this) {
   983          return function() {
   984            var additionalWaitingTime;
   985            if (/AppleWebKit/.test(navigator.userAgent)) {
   986              additionalWaitingTime = 5;
   987            } else {
   988              additionalWaitingTime = 200;
   989            }
   990            return _this.Timer.start(additionalWaitingTime, function() {
   991              var _ref;
   992              if (!link.parentNode) {
   993                return;
   994              }
   995              link.parentNode.removeChild(link);
   996              clone.onreadystatechange = null;
   997              return (_ref = _this.window.StyleFix) != null ? _ref.link(clone) : void 0;
   998            });
   999          };
  1000        })(this));
  1001      };
  1002  
  1003      Reloader.prototype.reattachImportedRule = function(_arg) {
  1004        var href, index, link, media, newRule, parent, rule, tempLink;
  1005        rule = _arg.rule, index = _arg.index, link = _arg.link;
  1006        parent = rule.parentStyleSheet;
  1007        href = this.generateCacheBustUrl(rule.href);
  1008        media = rule.media.length ? [].join.call(rule.media, ', ') : '';
  1009        newRule = "@import url(\"" + href + "\") " + media + ";";
  1010        rule.__LiveReload_newHref = href;
  1011        tempLink = this.document.createElement("link");
  1012        tempLink.rel = 'stylesheet';
  1013        tempLink.href = href;
  1014        tempLink.__LiveReload_pendingRemoval = true;
  1015        if (link.parentNode) {
  1016          link.parentNode.insertBefore(tempLink, link);
  1017        }
  1018        return this.Timer.start(this.importCacheWaitPeriod, (function(_this) {
  1019          return function() {
  1020            if (tempLink.parentNode) {
  1021              tempLink.parentNode.removeChild(tempLink);
  1022            }
  1023            if (rule.__LiveReload_newHref !== href) {
  1024              return;
  1025            }
  1026            parent.insertRule(newRule, index);
  1027            parent.deleteRule(index + 1);
  1028            rule = parent.cssRules[index];
  1029            rule.__LiveReload_newHref = href;
  1030            return _this.Timer.start(_this.importCacheWaitPeriod, function() {
  1031              if (rule.__LiveReload_newHref !== href) {
  1032                return;
  1033              }
  1034              parent.insertRule(newRule, index);
  1035              return parent.deleteRule(index + 1);
  1036            });
  1037          };
  1038        })(this));
  1039      };
  1040  
  1041      Reloader.prototype.generateUniqueString = function() {
  1042        return 'livereload=' + Date.now();
  1043      };
  1044  
  1045      Reloader.prototype.generateCacheBustUrl = function(url, expando) {
  1046        var hash, oldParams, originalUrl, params, _ref;
  1047        if (expando == null) {
  1048          expando = this.generateUniqueString();
  1049        }
  1050        _ref = splitUrl(url), url = _ref.url, hash = _ref.hash, oldParams = _ref.params;
  1051        if (this.options.overrideURL) {
  1052          if (url.indexOf(this.options.serverURL) < 0) {
  1053            originalUrl = url;
  1054            url = this.options.serverURL + this.options.overrideURL + "?url=" + encodeURIComponent(url);
  1055            this.console.log("LiveReload is overriding source URL " + originalUrl + " with " + url);
  1056          }
  1057        }
  1058        params = oldParams.replace(/(\?|&)livereload=(\d+)/, function(match, sep) {
  1059          return "" + sep + expando;
  1060        });
  1061        if (params === oldParams) {
  1062          if (oldParams.length === 0) {
  1063            params = "?" + expando;
  1064          } else {
  1065            params = "" + oldParams + "&" + expando;
  1066          }
  1067        }
  1068        return url + params + hash;
  1069      };
  1070  
  1071      return Reloader;
  1072  
  1073    })();
  1074  
  1075  }).call(this);
  1076  
  1077  },{}],8:[function(require,module,exports){
  1078  (function() {
  1079    var CustomEvents, LiveReload, k;
  1080  
  1081    CustomEvents = require('./customevents');
  1082  
  1083    LiveReload = window.LiveReload = new (require('./livereload').LiveReload)(window);
  1084  
  1085    for (k in window) {
  1086      if (k.match(/^LiveReloadPlugin/)) {
  1087        LiveReload.addPlugin(window[k]);
  1088      }
  1089    }
  1090  
  1091    LiveReload.addPlugin(require('./less'));
  1092  
  1093    LiveReload.on('shutdown', function() {
  1094      return delete window.LiveReload;
  1095    });
  1096  
  1097    LiveReload.on('connect', function() {
  1098      return CustomEvents.fire(document, 'LiveReloadConnect');
  1099    });
  1100  
  1101    LiveReload.on('disconnect', function() {
  1102      return CustomEvents.fire(document, 'LiveReloadDisconnect');
  1103    });
  1104  
  1105    CustomEvents.bind(document, 'LiveReloadShutDown', function() {
  1106      return LiveReload.shutDown();
  1107    });
  1108  
  1109  }).call(this);
  1110  
  1111  },{"./customevents":2,"./less":3,"./livereload":4}],9:[function(require,module,exports){
  1112  (function() {
  1113    var Timer;
  1114  
  1115    exports.Timer = Timer = (function() {
  1116      function Timer(func) {
  1117        this.func = func;
  1118        this.running = false;
  1119        this.id = null;
  1120        this._handler = (function(_this) {
  1121          return function() {
  1122            _this.running = false;
  1123            _this.id = null;
  1124            return _this.func();
  1125          };
  1126        })(this);
  1127      }
  1128  
  1129      Timer.prototype.start = function(timeout) {
  1130        if (this.running) {
  1131          clearTimeout(this.id);
  1132        }
  1133        this.id = setTimeout(this._handler, timeout);
  1134        return this.running = true;
  1135      };
  1136  
  1137      Timer.prototype.stop = function() {
  1138        if (this.running) {
  1139          clearTimeout(this.id);
  1140          this.running = false;
  1141          return this.id = null;
  1142        }
  1143      };
  1144  
  1145      return Timer;
  1146  
  1147    })();
  1148  
  1149    Timer.start = function(timeout, func) {
  1150      return setTimeout(func, timeout);
  1151    };
  1152  
  1153  }).call(this);
  1154  
  1155  },{}]},{},[8]);