jekyll 4.2.0 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +350 -347
  3. data/LICENSE +21 -21
  4. data/README.markdown +86 -86
  5. data/exe/jekyll +57 -57
  6. data/lib/blank_template/_config.yml +3 -3
  7. data/lib/blank_template/_layouts/default.html +12 -12
  8. data/lib/blank_template/_sass/main.scss +9 -9
  9. data/lib/blank_template/assets/css/main.scss +4 -4
  10. data/lib/blank_template/index.md +8 -8
  11. data/lib/jekyll/cache.rb +190 -190
  12. data/lib/jekyll/cleaner.rb +111 -111
  13. data/lib/jekyll/collection.rb +309 -309
  14. data/lib/jekyll/command.rb +105 -105
  15. data/lib/jekyll/commands/build.rb +93 -93
  16. data/lib/jekyll/commands/clean.rb +45 -45
  17. data/lib/jekyll/commands/doctor.rb +177 -177
  18. data/lib/jekyll/commands/help.rb +34 -34
  19. data/lib/jekyll/commands/new.rb +169 -169
  20. data/lib/jekyll/commands/new_theme.rb +40 -40
  21. data/lib/jekyll/commands/serve/live_reload_reactor.rb +122 -122
  22. data/lib/jekyll/commands/serve/livereload_assets/livereload.js +1183 -1183
  23. data/lib/jekyll/commands/serve/servlet.rb +202 -202
  24. data/lib/jekyll/commands/serve/websockets.rb +81 -81
  25. data/lib/jekyll/commands/serve.rb +362 -365
  26. data/lib/jekyll/configuration.rb +313 -313
  27. data/lib/jekyll/converter.rb +54 -54
  28. data/lib/jekyll/converters/identity.rb +41 -41
  29. data/lib/jekyll/converters/markdown/kramdown_parser.rb +199 -199
  30. data/lib/jekyll/converters/markdown.rb +113 -113
  31. data/lib/jekyll/converters/smartypants.rb +70 -70
  32. data/lib/jekyll/convertible.rb +257 -260
  33. data/lib/jekyll/deprecator.rb +50 -50
  34. data/lib/jekyll/document.rb +544 -544
  35. data/lib/jekyll/drops/collection_drop.rb +20 -20
  36. data/lib/jekyll/drops/document_drop.rb +70 -70
  37. data/lib/jekyll/drops/drop.rb +293 -293
  38. data/lib/jekyll/drops/excerpt_drop.rb +19 -19
  39. data/lib/jekyll/drops/jekyll_drop.rb +32 -32
  40. data/lib/jekyll/drops/site_drop.rb +66 -66
  41. data/lib/jekyll/drops/static_file_drop.rb +14 -14
  42. data/lib/jekyll/drops/unified_payload_drop.rb +26 -26
  43. data/lib/jekyll/drops/url_drop.rb +140 -140
  44. data/lib/jekyll/entry_filter.rb +121 -121
  45. data/lib/jekyll/errors.rb +20 -20
  46. data/lib/jekyll/excerpt.rb +201 -201
  47. data/lib/jekyll/external.rb +79 -79
  48. data/lib/jekyll/filters/date_filters.rb +110 -110
  49. data/lib/jekyll/filters/grouping_filters.rb +64 -64
  50. data/lib/jekyll/filters/url_filters.rb +98 -98
  51. data/lib/jekyll/filters.rb +535 -535
  52. data/lib/jekyll/frontmatter_defaults.rb +240 -240
  53. data/lib/jekyll/generator.rb +5 -5
  54. data/lib/jekyll/hooks.rb +107 -107
  55. data/lib/jekyll/inclusion.rb +32 -32
  56. data/lib/jekyll/layout.rb +67 -67
  57. data/lib/jekyll/liquid_extensions.rb +22 -22
  58. data/lib/jekyll/liquid_renderer/file.rb +77 -77
  59. data/lib/jekyll/liquid_renderer/table.rb +55 -55
  60. data/lib/jekyll/liquid_renderer.rb +80 -80
  61. data/lib/jekyll/log_adapter.rb +151 -151
  62. data/lib/jekyll/mime.types +866 -866
  63. data/lib/jekyll/page.rb +217 -217
  64. data/lib/jekyll/page_excerpt.rb +25 -25
  65. data/lib/jekyll/page_without_a_file.rb +14 -14
  66. data/lib/jekyll/path_manager.rb +74 -74
  67. data/lib/jekyll/plugin.rb +92 -92
  68. data/lib/jekyll/plugin_manager.rb +115 -115
  69. data/lib/jekyll/profiler.rb +58 -58
  70. data/lib/jekyll/publisher.rb +23 -23
  71. data/lib/jekyll/reader.rb +192 -192
  72. data/lib/jekyll/readers/collection_reader.rb +23 -23
  73. data/lib/jekyll/readers/data_reader.rb +79 -79
  74. data/lib/jekyll/readers/layout_reader.rb +62 -62
  75. data/lib/jekyll/readers/page_reader.rb +25 -25
  76. data/lib/jekyll/readers/post_reader.rb +85 -85
  77. data/lib/jekyll/readers/static_file_reader.rb +25 -25
  78. data/lib/jekyll/readers/theme_assets_reader.rb +52 -52
  79. data/lib/jekyll/regenerator.rb +195 -195
  80. data/lib/jekyll/related_posts.rb +52 -52
  81. data/lib/jekyll/renderer.rb +265 -265
  82. data/lib/jekyll/site.rb +551 -551
  83. data/lib/jekyll/static_file.rb +208 -208
  84. data/lib/jekyll/stevenson.rb +60 -60
  85. data/lib/jekyll/tags/highlight.rb +110 -110
  86. data/lib/jekyll/tags/include.rb +275 -270
  87. data/lib/jekyll/tags/link.rb +42 -42
  88. data/lib/jekyll/tags/post_url.rb +106 -106
  89. data/lib/jekyll/theme.rb +86 -86
  90. data/lib/jekyll/theme_builder.rb +121 -121
  91. data/lib/jekyll/url.rb +167 -167
  92. data/lib/jekyll/utils/ansi.rb +57 -57
  93. data/lib/jekyll/utils/exec.rb +26 -26
  94. data/lib/jekyll/utils/internet.rb +37 -37
  95. data/lib/jekyll/utils/platforms.rb +67 -67
  96. data/lib/jekyll/utils/thread_event.rb +31 -31
  97. data/lib/jekyll/utils/win_tz.rb +75 -75
  98. data/lib/jekyll/utils.rb +367 -367
  99. data/lib/jekyll/version.rb +5 -5
  100. data/lib/jekyll.rb +195 -195
  101. data/lib/site_template/.gitignore +5 -5
  102. data/lib/site_template/404.html +25 -25
  103. data/lib/site_template/_config.yml +55 -55
  104. data/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +29 -29
  105. data/lib/site_template/about.markdown +18 -18
  106. data/lib/site_template/index.markdown +6 -6
  107. data/lib/theme_template/CODE_OF_CONDUCT.md.erb +74 -74
  108. data/lib/theme_template/Gemfile +4 -4
  109. data/lib/theme_template/LICENSE.txt.erb +21 -21
  110. data/lib/theme_template/README.md.erb +52 -52
  111. data/lib/theme_template/_layouts/default.html +1 -1
  112. data/lib/theme_template/_layouts/page.html +5 -5
  113. data/lib/theme_template/_layouts/post.html +5 -5
  114. data/lib/theme_template/example/_config.yml.erb +1 -1
  115. data/lib/theme_template/example/_post.md +12 -12
  116. data/lib/theme_template/example/index.html +14 -14
  117. data/lib/theme_template/example/style.scss +7 -7
  118. data/lib/theme_template/gitignore.erb +6 -6
  119. data/lib/theme_template/theme.gemspec.erb +16 -16
  120. data/rubocop/jekyll/assert_equal_literal_actual.rb +149 -149
  121. data/rubocop/jekyll/no_p_allowed.rb +23 -23
  122. data/rubocop/jekyll/no_puts_allowed.rb +23 -23
  123. data/rubocop/jekyll.rb +5 -5
  124. metadata +3 -3
@@ -1,1183 +1,1183 @@
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.2';
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.https ? "s" : "") + "://" + 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
- __hasProp = {}.hasOwnProperty;
283
-
284
- Connector = require('./connector').Connector;
285
-
286
- Timer = require('./timer').Timer;
287
-
288
- Options = require('./options').Options;
289
-
290
- Reloader = require('./reloader').Reloader;
291
-
292
- exports.LiveReload = LiveReload = (function() {
293
- function LiveReload(window) {
294
- var k, v, _ref;
295
- this.window = window;
296
- this.listeners = {};
297
- this.plugins = [];
298
- this.pluginIdentifiers = {};
299
- this.console = this.window.console && this.window.console.log && this.window.console.error ? this.window.location.href.match(/LR-verbose/) ? this.window.console : {
300
- log: function() {},
301
- error: this.window.console.error.bind(this.window.console)
302
- } : {
303
- log: function() {},
304
- error: function() {}
305
- };
306
- if (!(this.WebSocket = this.window.WebSocket || this.window.MozWebSocket)) {
307
- this.console.error("LiveReload disabled because the browser does not seem to support web sockets");
308
- return;
309
- }
310
- if ('LiveReloadOptions' in window) {
311
- this.options = new Options();
312
- _ref = window['LiveReloadOptions'];
313
- for (k in _ref) {
314
- if (!__hasProp.call(_ref, k)) continue;
315
- v = _ref[k];
316
- this.options.set(k, v);
317
- }
318
- } else {
319
- this.options = Options.extract(this.window.document);
320
- if (!this.options) {
321
- this.console.error("LiveReload disabled because it could not find its own <SCRIPT> tag");
322
- return;
323
- }
324
- }
325
- this.reloader = new Reloader(this.window, this.console, Timer);
326
- this.connector = new Connector(this.options, this.WebSocket, Timer, {
327
- connecting: (function(_this) {
328
- return function() {};
329
- })(this),
330
- socketConnected: (function(_this) {
331
- return function() {};
332
- })(this),
333
- connected: (function(_this) {
334
- return function(protocol) {
335
- var _base;
336
- if (typeof (_base = _this.listeners).connect === "function") {
337
- _base.connect();
338
- }
339
- _this.log("LiveReload is connected to " + _this.options.host + ":" + _this.options.port + " (protocol v" + protocol + ").");
340
- return _this.analyze();
341
- };
342
- })(this),
343
- error: (function(_this) {
344
- return function(e) {
345
- if (e instanceof ProtocolError) {
346
- if (typeof console !== "undefined" && console !== null) {
347
- return console.log("" + e.message + ".");
348
- }
349
- } else {
350
- if (typeof console !== "undefined" && console !== null) {
351
- return console.log("LiveReload internal error: " + e.message);
352
- }
353
- }
354
- };
355
- })(this),
356
- disconnected: (function(_this) {
357
- return function(reason, nextDelay) {
358
- var _base;
359
- if (typeof (_base = _this.listeners).disconnect === "function") {
360
- _base.disconnect();
361
- }
362
- switch (reason) {
363
- case 'cannot-connect':
364
- return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + ", will retry in " + nextDelay + " sec.");
365
- case 'broken':
366
- return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + ", reconnecting in " + nextDelay + " sec.");
367
- case 'handshake-timeout':
368
- return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake timeout), will retry in " + nextDelay + " sec.");
369
- case 'handshake-failed':
370
- return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake failed), will retry in " + nextDelay + " sec.");
371
- case 'manual':
372
- break;
373
- case 'error':
374
- break;
375
- default:
376
- return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + " (" + reason + "), reconnecting in " + nextDelay + " sec.");
377
- }
378
- };
379
- })(this),
380
- message: (function(_this) {
381
- return function(message) {
382
- switch (message.command) {
383
- case 'reload':
384
- return _this.performReload(message);
385
- case 'alert':
386
- return _this.performAlert(message);
387
- }
388
- };
389
- })(this)
390
- });
391
- this.initialized = true;
392
- }
393
-
394
- LiveReload.prototype.on = function(eventName, handler) {
395
- return this.listeners[eventName] = handler;
396
- };
397
-
398
- LiveReload.prototype.log = function(message) {
399
- return this.console.log("" + message);
400
- };
401
-
402
- LiveReload.prototype.performReload = function(message) {
403
- var _ref, _ref1;
404
- this.log("LiveReload received reload request: " + (JSON.stringify(message, null, 2)));
405
- return this.reloader.reload(message.path, {
406
- liveCSS: (_ref = message.liveCSS) != null ? _ref : true,
407
- liveImg: (_ref1 = message.liveImg) != null ? _ref1 : true,
408
- originalPath: message.originalPath || '',
409
- overrideURL: message.overrideURL || '',
410
- serverURL: "http://" + this.options.host + ":" + this.options.port
411
- });
412
- };
413
-
414
- LiveReload.prototype.performAlert = function(message) {
415
- return alert(message.message);
416
- };
417
-
418
- LiveReload.prototype.shutDown = function() {
419
- var _base;
420
- if (!this.initialized) {
421
- return;
422
- }
423
- this.connector.disconnect();
424
- this.log("LiveReload disconnected.");
425
- return typeof (_base = this.listeners).shutdown === "function" ? _base.shutdown() : void 0;
426
- };
427
-
428
- LiveReload.prototype.hasPlugin = function(identifier) {
429
- return !!this.pluginIdentifiers[identifier];
430
- };
431
-
432
- LiveReload.prototype.addPlugin = function(pluginClass) {
433
- var plugin;
434
- if (!this.initialized) {
435
- return;
436
- }
437
- if (this.hasPlugin(pluginClass.identifier)) {
438
- return;
439
- }
440
- this.pluginIdentifiers[pluginClass.identifier] = true;
441
- plugin = new pluginClass(this.window, {
442
- _livereload: this,
443
- _reloader: this.reloader,
444
- _connector: this.connector,
445
- console: this.console,
446
- Timer: Timer,
447
- generateCacheBustUrl: (function(_this) {
448
- return function(url) {
449
- return _this.reloader.generateCacheBustUrl(url);
450
- };
451
- })(this)
452
- });
453
- this.plugins.push(plugin);
454
- this.reloader.addPlugin(plugin);
455
- };
456
-
457
- LiveReload.prototype.analyze = function() {
458
- var plugin, pluginData, pluginsData, _i, _len, _ref;
459
- if (!this.initialized) {
460
- return;
461
- }
462
- if (!(this.connector.protocol >= 7)) {
463
- return;
464
- }
465
- pluginsData = {};
466
- _ref = this.plugins;
467
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
468
- plugin = _ref[_i];
469
- pluginsData[plugin.constructor.identifier] = pluginData = (typeof plugin.analyze === "function" ? plugin.analyze() : void 0) || {};
470
- pluginData.version = plugin.constructor.version;
471
- }
472
- this.connector.sendCommand({
473
- command: 'info',
474
- plugins: pluginsData,
475
- url: this.window.location.href
476
- });
477
- };
478
-
479
- return LiveReload;
480
-
481
- })();
482
-
483
- }).call(this);
484
-
485
- },{"./connector":1,"./options":5,"./reloader":7,"./timer":9}],5:[function(require,module,exports){
486
- (function() {
487
- var Options;
488
-
489
- exports.Options = Options = (function() {
490
- function Options() {
491
- this.https = false;
492
- this.host = null;
493
- this.port = 35729;
494
- this.snipver = null;
495
- this.ext = null;
496
- this.extver = null;
497
- this.mindelay = 1000;
498
- this.maxdelay = 60000;
499
- this.handshake_timeout = 5000;
500
- }
501
-
502
- Options.prototype.set = function(name, value) {
503
- if (typeof value === 'undefined') {
504
- return;
505
- }
506
- if (!isNaN(+value)) {
507
- value = +value;
508
- }
509
- return this[name] = value;
510
- };
511
-
512
- return Options;
513
-
514
- })();
515
-
516
- Options.extract = function(document) {
517
- var element, keyAndValue, m, mm, options, pair, src, _i, _j, _len, _len1, _ref, _ref1;
518
- _ref = document.getElementsByTagName('script');
519
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
520
- element = _ref[_i];
521
- if ((src = element.src) && (m = src.match(/^[^:]+:\/\/(.*)\/z?livereload\.js(?:\?(.*))?$/))) {
522
- options = new Options();
523
- options.https = src.indexOf("https") === 0;
524
- if (mm = m[1].match(/^([^\/:]+)(?::(\d+))?$/)) {
525
- options.host = mm[1];
526
- if (mm[2]) {
527
- options.port = parseInt(mm[2], 10);
528
- }
529
- }
530
- if (m[2]) {
531
- _ref1 = m[2].split('&');
532
- for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
533
- pair = _ref1[_j];
534
- if ((keyAndValue = pair.split('=')).length > 1) {
535
- options.set(keyAndValue[0].replace(/-/g, '_'), keyAndValue.slice(1).join('='));
536
- }
537
- }
538
- }
539
- return options;
540
- }
541
- }
542
- return null;
543
- };
544
-
545
- }).call(this);
546
-
547
- },{}],6:[function(require,module,exports){
548
- (function() {
549
- var PROTOCOL_6, PROTOCOL_7, Parser, ProtocolError,
550
- __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; };
551
-
552
- exports.PROTOCOL_6 = PROTOCOL_6 = 'http://livereload.com/protocols/official-6';
553
-
554
- exports.PROTOCOL_7 = PROTOCOL_7 = 'http://livereload.com/protocols/official-7';
555
-
556
- exports.ProtocolError = ProtocolError = (function() {
557
- function ProtocolError(reason, data) {
558
- this.message = "LiveReload protocol error (" + reason + ") after receiving data: \"" + data + "\".";
559
- }
560
-
561
- return ProtocolError;
562
-
563
- })();
564
-
565
- exports.Parser = Parser = (function() {
566
- function Parser(handlers) {
567
- this.handlers = handlers;
568
- this.reset();
569
- }
570
-
571
- Parser.prototype.reset = function() {
572
- return this.protocol = null;
573
- };
574
-
575
- Parser.prototype.process = function(data) {
576
- var command, e, message, options, _ref;
577
- try {
578
- if (this.protocol == null) {
579
- if (data.match(/^!!ver:([\d.]+)$/)) {
580
- this.protocol = 6;
581
- } else if (message = this._parseMessage(data, ['hello'])) {
582
- if (!message.protocols.length) {
583
- throw new ProtocolError("no protocols specified in handshake message");
584
- } else if (__indexOf.call(message.protocols, PROTOCOL_7) >= 0) {
585
- this.protocol = 7;
586
- } else if (__indexOf.call(message.protocols, PROTOCOL_6) >= 0) {
587
- this.protocol = 6;
588
- } else {
589
- throw new ProtocolError("no supported protocols found");
590
- }
591
- }
592
- return this.handlers.connected(this.protocol);
593
- } else if (this.protocol === 6) {
594
- message = JSON.parse(data);
595
- if (!message.length) {
596
- throw new ProtocolError("protocol 6 messages must be arrays");
597
- }
598
- command = message[0], options = message[1];
599
- if (command !== 'refresh') {
600
- throw new ProtocolError("unknown protocol 6 command");
601
- }
602
- return this.handlers.message({
603
- command: 'reload',
604
- path: options.path,
605
- liveCSS: (_ref = options.apply_css_live) != null ? _ref : true
606
- });
607
- } else {
608
- message = this._parseMessage(data, ['reload', 'alert']);
609
- return this.handlers.message(message);
610
- }
611
- } catch (_error) {
612
- e = _error;
613
- if (e instanceof ProtocolError) {
614
- return this.handlers.error(e);
615
- } else {
616
- throw e;
617
- }
618
- }
619
- };
620
-
621
- Parser.prototype._parseMessage = function(data, validCommands) {
622
- var e, message, _ref;
623
- try {
624
- message = JSON.parse(data);
625
- } catch (_error) {
626
- e = _error;
627
- throw new ProtocolError('unparsable JSON', data);
628
- }
629
- if (!message.command) {
630
- throw new ProtocolError('missing "command" key', data);
631
- }
632
- if (_ref = message.command, __indexOf.call(validCommands, _ref) < 0) {
633
- throw new ProtocolError("invalid command '" + message.command + "', only valid commands are: " + (validCommands.join(', ')) + ")", data);
634
- }
635
- return message;
636
- };
637
-
638
- return Parser;
639
-
640
- })();
641
-
642
- }).call(this);
643
-
644
- },{}],7:[function(require,module,exports){
645
- (function() {
646
- var IMAGE_STYLES, Reloader, numberOfMatchingSegments, pathFromUrl, pathsMatch, pickBestMatch, splitUrl;
647
-
648
- splitUrl = function(url) {
649
- var hash, index, params;
650
- if ((index = url.indexOf('#')) >= 0) {
651
- hash = url.slice(index);
652
- url = url.slice(0, index);
653
- } else {
654
- hash = '';
655
- }
656
- if ((index = url.indexOf('?')) >= 0) {
657
- params = url.slice(index);
658
- url = url.slice(0, index);
659
- } else {
660
- params = '';
661
- }
662
- return {
663
- url: url,
664
- params: params,
665
- hash: hash
666
- };
667
- };
668
-
669
- pathFromUrl = function(url) {
670
- var path;
671
- url = splitUrl(url).url;
672
- if (url.indexOf('file://') === 0) {
673
- path = url.replace(/^file:\/\/(localhost)?/, '');
674
- } else {
675
- path = url.replace(/^([^:]+:)?\/\/([^:\/]+)(:\d*)?\//, '/');
676
- }
677
- return decodeURIComponent(path);
678
- };
679
-
680
- pickBestMatch = function(path, objects, pathFunc) {
681
- var bestMatch, object, score, _i, _len;
682
- bestMatch = {
683
- score: 0
684
- };
685
- for (_i = 0, _len = objects.length; _i < _len; _i++) {
686
- object = objects[_i];
687
- score = numberOfMatchingSegments(path, pathFunc(object));
688
- if (score > bestMatch.score) {
689
- bestMatch = {
690
- object: object,
691
- score: score
692
- };
693
- }
694
- }
695
- if (bestMatch.score > 0) {
696
- return bestMatch;
697
- } else {
698
- return null;
699
- }
700
- };
701
-
702
- numberOfMatchingSegments = function(path1, path2) {
703
- var comps1, comps2, eqCount, len;
704
- path1 = path1.replace(/^\/+/, '').toLowerCase();
705
- path2 = path2.replace(/^\/+/, '').toLowerCase();
706
- if (path1 === path2) {
707
- return 10000;
708
- }
709
- comps1 = path1.split('/').reverse();
710
- comps2 = path2.split('/').reverse();
711
- len = Math.min(comps1.length, comps2.length);
712
- eqCount = 0;
713
- while (eqCount < len && comps1[eqCount] === comps2[eqCount]) {
714
- ++eqCount;
715
- }
716
- return eqCount;
717
- };
718
-
719
- pathsMatch = function(path1, path2) {
720
- return numberOfMatchingSegments(path1, path2) > 0;
721
- };
722
-
723
- IMAGE_STYLES = [
724
- {
725
- selector: 'background',
726
- styleNames: ['backgroundImage']
727
- }, {
728
- selector: 'border',
729
- styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage']
730
- }
731
- ];
732
-
733
- exports.Reloader = Reloader = (function() {
734
- function Reloader(window, console, Timer) {
735
- this.window = window;
736
- this.console = console;
737
- this.Timer = Timer;
738
- this.document = this.window.document;
739
- this.importCacheWaitPeriod = 200;
740
- this.plugins = [];
741
- }
742
-
743
- Reloader.prototype.addPlugin = function(plugin) {
744
- return this.plugins.push(plugin);
745
- };
746
-
747
- Reloader.prototype.analyze = function(callback) {
748
- return results;
749
- };
750
-
751
- Reloader.prototype.reload = function(path, options) {
752
- var plugin, _base, _i, _len, _ref;
753
- this.options = options;
754
- if ((_base = this.options).stylesheetReloadTimeout == null) {
755
- _base.stylesheetReloadTimeout = 15000;
756
- }
757
- _ref = this.plugins;
758
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
759
- plugin = _ref[_i];
760
- if (plugin.reload && plugin.reload(path, options)) {
761
- return;
762
- }
763
- }
764
- if (options.liveCSS) {
765
- if (path.match(/\.css$/i)) {
766
- if (this.reloadStylesheet(path)) {
767
- return;
768
- }
769
- }
770
- }
771
- if (options.liveImg) {
772
- if (path.match(/\.(jpe?g|png|gif)$/i)) {
773
- this.reloadImages(path);
774
- return;
775
- }
776
- }
777
- return this.reloadPage();
778
- };
779
-
780
- Reloader.prototype.reloadPage = function() {
781
- return this.window.document.location.reload();
782
- };
783
-
784
- Reloader.prototype.reloadImages = function(path) {
785
- var expando, img, selector, styleNames, styleSheet, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _results;
786
- expando = this.generateUniqueString();
787
- _ref = this.document.images;
788
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
789
- img = _ref[_i];
790
- if (pathsMatch(path, pathFromUrl(img.src))) {
791
- img.src = this.generateCacheBustUrl(img.src, expando);
792
- }
793
- }
794
- if (this.document.querySelectorAll) {
795
- for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) {
796
- _ref1 = IMAGE_STYLES[_j], selector = _ref1.selector, styleNames = _ref1.styleNames;
797
- _ref2 = this.document.querySelectorAll("[style*=" + selector + "]");
798
- for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
799
- img = _ref2[_k];
800
- this.reloadStyleImages(img.style, styleNames, path, expando);
801
- }
802
- }
803
- }
804
- if (this.document.styleSheets) {
805
- _ref3 = this.document.styleSheets;
806
- _results = [];
807
- for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
808
- styleSheet = _ref3[_l];
809
- _results.push(this.reloadStylesheetImages(styleSheet, path, expando));
810
- }
811
- return _results;
812
- }
813
- };
814
-
815
- Reloader.prototype.reloadStylesheetImages = function(styleSheet, path, expando) {
816
- var e, rule, rules, styleNames, _i, _j, _len, _len1;
817
- try {
818
- rules = styleSheet != null ? styleSheet.cssRules : void 0;
819
- } catch (_error) {
820
- e = _error;
821
- }
822
- if (!rules) {
823
- return;
824
- }
825
- for (_i = 0, _len = rules.length; _i < _len; _i++) {
826
- rule = rules[_i];
827
- switch (rule.type) {
828
- case CSSRule.IMPORT_RULE:
829
- this.reloadStylesheetImages(rule.styleSheet, path, expando);
830
- break;
831
- case CSSRule.STYLE_RULE:
832
- for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) {
833
- styleNames = IMAGE_STYLES[_j].styleNames;
834
- this.reloadStyleImages(rule.style, styleNames, path, expando);
835
- }
836
- break;
837
- case CSSRule.MEDIA_RULE:
838
- this.reloadStylesheetImages(rule, path, expando);
839
- }
840
- }
841
- };
842
-
843
- Reloader.prototype.reloadStyleImages = function(style, styleNames, path, expando) {
844
- var newValue, styleName, value, _i, _len;
845
- for (_i = 0, _len = styleNames.length; _i < _len; _i++) {
846
- styleName = styleNames[_i];
847
- value = style[styleName];
848
- if (typeof value === 'string') {
849
- newValue = value.replace(/\burl\s*\(([^)]*)\)/, (function(_this) {
850
- return function(match, src) {
851
- if (pathsMatch(path, pathFromUrl(src))) {
852
- return "url(" + (_this.generateCacheBustUrl(src, expando)) + ")";
853
- } else {
854
- return match;
855
- }
856
- };
857
- })(this));
858
- if (newValue !== value) {
859
- style[styleName] = newValue;
860
- }
861
- }
862
- }
863
- };
864
-
865
- Reloader.prototype.reloadStylesheet = function(path) {
866
- var imported, link, links, match, style, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1;
867
- links = (function() {
868
- var _i, _len, _ref, _results;
869
- _ref = this.document.getElementsByTagName('link');
870
- _results = [];
871
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
872
- link = _ref[_i];
873
- if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) {
874
- _results.push(link);
875
- }
876
- }
877
- return _results;
878
- }).call(this);
879
- imported = [];
880
- _ref = this.document.getElementsByTagName('style');
881
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
882
- style = _ref[_i];
883
- if (style.sheet) {
884
- this.collectImportedStylesheets(style, style.sheet, imported);
885
- }
886
- }
887
- for (_j = 0, _len1 = links.length; _j < _len1; _j++) {
888
- link = links[_j];
889
- this.collectImportedStylesheets(link, link.sheet, imported);
890
- }
891
- if (this.window.StyleFix && this.document.querySelectorAll) {
892
- _ref1 = this.document.querySelectorAll('style[data-href]');
893
- for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {
894
- style = _ref1[_k];
895
- links.push(style);
896
- }
897
- }
898
- this.console.log("LiveReload found " + links.length + " LINKed stylesheets, " + imported.length + " @imported stylesheets");
899
- match = pickBestMatch(path, links.concat(imported), (function(_this) {
900
- return function(l) {
901
- return pathFromUrl(_this.linkHref(l));
902
- };
903
- })(this));
904
- if (match) {
905
- if (match.object.rule) {
906
- this.console.log("LiveReload is reloading imported stylesheet: " + match.object.href);
907
- this.reattachImportedRule(match.object);
908
- } else {
909
- this.console.log("LiveReload is reloading stylesheet: " + (this.linkHref(match.object)));
910
- this.reattachStylesheetLink(match.object);
911
- }
912
- } else {
913
- this.console.log("LiveReload will reload all stylesheets because path '" + path + "' did not match any specific one");
914
- for (_l = 0, _len3 = links.length; _l < _len3; _l++) {
915
- link = links[_l];
916
- this.reattachStylesheetLink(link);
917
- }
918
- }
919
- return true;
920
- };
921
-
922
- Reloader.prototype.collectImportedStylesheets = function(link, styleSheet, result) {
923
- var e, index, rule, rules, _i, _len;
924
- try {
925
- rules = styleSheet != null ? styleSheet.cssRules : void 0;
926
- } catch (_error) {
927
- e = _error;
928
- }
929
- if (rules && rules.length) {
930
- for (index = _i = 0, _len = rules.length; _i < _len; index = ++_i) {
931
- rule = rules[index];
932
- switch (rule.type) {
933
- case CSSRule.CHARSET_RULE:
934
- continue;
935
- case CSSRule.IMPORT_RULE:
936
- result.push({
937
- link: link,
938
- rule: rule,
939
- index: index,
940
- href: rule.href
941
- });
942
- this.collectImportedStylesheets(link, rule.styleSheet, result);
943
- break;
944
- default:
945
- break;
946
- }
947
- }
948
- }
949
- };
950
-
951
- Reloader.prototype.waitUntilCssLoads = function(clone, func) {
952
- var callbackExecuted, executeCallback, poll;
953
- callbackExecuted = false;
954
- executeCallback = (function(_this) {
955
- return function() {
956
- if (callbackExecuted) {
957
- return;
958
- }
959
- callbackExecuted = true;
960
- return func();
961
- };
962
- })(this);
963
- clone.onload = (function(_this) {
964
- return function() {
965
- _this.console.log("LiveReload: the new stylesheet has finished loading");
966
- _this.knownToSupportCssOnLoad = true;
967
- return executeCallback();
968
- };
969
- })(this);
970
- if (!this.knownToSupportCssOnLoad) {
971
- (poll = (function(_this) {
972
- return function() {
973
- if (clone.sheet) {
974
- _this.console.log("LiveReload is polling until the new CSS finishes loading...");
975
- return executeCallback();
976
- } else {
977
- return _this.Timer.start(50, poll);
978
- }
979
- };
980
- })(this))();
981
- }
982
- return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback);
983
- };
984
-
985
- Reloader.prototype.linkHref = function(link) {
986
- return link.href || link.getAttribute('data-href');
987
- };
988
-
989
- Reloader.prototype.reattachStylesheetLink = function(link) {
990
- var clone, parent;
991
- if (link.__LiveReload_pendingRemoval) {
992
- return;
993
- }
994
- link.__LiveReload_pendingRemoval = true;
995
- if (link.tagName === 'STYLE') {
996
- clone = this.document.createElement('link');
997
- clone.rel = 'stylesheet';
998
- clone.media = link.media;
999
- clone.disabled = link.disabled;
1000
- } else {
1001
- clone = link.cloneNode(false);
1002
- }
1003
- clone.href = this.generateCacheBustUrl(this.linkHref(link));
1004
- parent = link.parentNode;
1005
- if (parent.lastChild === link) {
1006
- parent.appendChild(clone);
1007
- } else {
1008
- parent.insertBefore(clone, link.nextSibling);
1009
- }
1010
- return this.waitUntilCssLoads(clone, (function(_this) {
1011
- return function() {
1012
- var additionalWaitingTime;
1013
- if (/AppleWebKit/.test(navigator.userAgent)) {
1014
- additionalWaitingTime = 5;
1015
- } else {
1016
- additionalWaitingTime = 200;
1017
- }
1018
- return _this.Timer.start(additionalWaitingTime, function() {
1019
- var _ref;
1020
- if (!link.parentNode) {
1021
- return;
1022
- }
1023
- link.parentNode.removeChild(link);
1024
- clone.onreadystatechange = null;
1025
- return (_ref = _this.window.StyleFix) != null ? _ref.link(clone) : void 0;
1026
- });
1027
- };
1028
- })(this));
1029
- };
1030
-
1031
- Reloader.prototype.reattachImportedRule = function(_arg) {
1032
- var href, index, link, media, newRule, parent, rule, tempLink;
1033
- rule = _arg.rule, index = _arg.index, link = _arg.link;
1034
- parent = rule.parentStyleSheet;
1035
- href = this.generateCacheBustUrl(rule.href);
1036
- media = rule.media.length ? [].join.call(rule.media, ', ') : '';
1037
- newRule = "@import url(\"" + href + "\") " + media + ";";
1038
- rule.__LiveReload_newHref = href;
1039
- tempLink = this.document.createElement("link");
1040
- tempLink.rel = 'stylesheet';
1041
- tempLink.href = href;
1042
- tempLink.__LiveReload_pendingRemoval = true;
1043
- if (link.parentNode) {
1044
- link.parentNode.insertBefore(tempLink, link);
1045
- }
1046
- return this.Timer.start(this.importCacheWaitPeriod, (function(_this) {
1047
- return function() {
1048
- if (tempLink.parentNode) {
1049
- tempLink.parentNode.removeChild(tempLink);
1050
- }
1051
- if (rule.__LiveReload_newHref !== href) {
1052
- return;
1053
- }
1054
- parent.insertRule(newRule, index);
1055
- parent.deleteRule(index + 1);
1056
- rule = parent.cssRules[index];
1057
- rule.__LiveReload_newHref = href;
1058
- return _this.Timer.start(_this.importCacheWaitPeriod, function() {
1059
- if (rule.__LiveReload_newHref !== href) {
1060
- return;
1061
- }
1062
- parent.insertRule(newRule, index);
1063
- return parent.deleteRule(index + 1);
1064
- });
1065
- };
1066
- })(this));
1067
- };
1068
-
1069
- Reloader.prototype.generateUniqueString = function() {
1070
- return 'livereload=' + Date.now();
1071
- };
1072
-
1073
- Reloader.prototype.generateCacheBustUrl = function(url, expando) {
1074
- var hash, oldParams, originalUrl, params, _ref;
1075
- if (expando == null) {
1076
- expando = this.generateUniqueString();
1077
- }
1078
- _ref = splitUrl(url), url = _ref.url, hash = _ref.hash, oldParams = _ref.params;
1079
- if (this.options.overrideURL) {
1080
- if (url.indexOf(this.options.serverURL) < 0) {
1081
- originalUrl = url;
1082
- url = this.options.serverURL + this.options.overrideURL + "?url=" + encodeURIComponent(url);
1083
- this.console.log("LiveReload is overriding source URL " + originalUrl + " with " + url);
1084
- }
1085
- }
1086
- params = oldParams.replace(/(\?|&)livereload=(\d+)/, function(match, sep) {
1087
- return "" + sep + expando;
1088
- });
1089
- if (params === oldParams) {
1090
- if (oldParams.length === 0) {
1091
- params = "?" + expando;
1092
- } else {
1093
- params = "" + oldParams + "&" + expando;
1094
- }
1095
- }
1096
- return url + params + hash;
1097
- };
1098
-
1099
- return Reloader;
1100
-
1101
- })();
1102
-
1103
- }).call(this);
1104
-
1105
- },{}],8:[function(require,module,exports){
1106
- (function() {
1107
- var CustomEvents, LiveReload, k;
1108
-
1109
- CustomEvents = require('./customevents');
1110
-
1111
- LiveReload = window.LiveReload = new (require('./livereload').LiveReload)(window);
1112
-
1113
- for (k in window) {
1114
- if (k.match(/^LiveReloadPlugin/)) {
1115
- LiveReload.addPlugin(window[k]);
1116
- }
1117
- }
1118
-
1119
- LiveReload.addPlugin(require('./less'));
1120
-
1121
- LiveReload.on('shutdown', function() {
1122
- return delete window.LiveReload;
1123
- });
1124
-
1125
- LiveReload.on('connect', function() {
1126
- return CustomEvents.fire(document, 'LiveReloadConnect');
1127
- });
1128
-
1129
- LiveReload.on('disconnect', function() {
1130
- return CustomEvents.fire(document, 'LiveReloadDisconnect');
1131
- });
1132
-
1133
- CustomEvents.bind(document, 'LiveReloadShutDown', function() {
1134
- return LiveReload.shutDown();
1135
- });
1136
-
1137
- }).call(this);
1138
-
1139
- },{"./customevents":2,"./less":3,"./livereload":4}],9:[function(require,module,exports){
1140
- (function() {
1141
- var Timer;
1142
-
1143
- exports.Timer = Timer = (function() {
1144
- function Timer(func) {
1145
- this.func = func;
1146
- this.running = false;
1147
- this.id = null;
1148
- this._handler = (function(_this) {
1149
- return function() {
1150
- _this.running = false;
1151
- _this.id = null;
1152
- return _this.func();
1153
- };
1154
- })(this);
1155
- }
1156
-
1157
- Timer.prototype.start = function(timeout) {
1158
- if (this.running) {
1159
- clearTimeout(this.id);
1160
- }
1161
- this.id = setTimeout(this._handler, timeout);
1162
- return this.running = true;
1163
- };
1164
-
1165
- Timer.prototype.stop = function() {
1166
- if (this.running) {
1167
- clearTimeout(this.id);
1168
- this.running = false;
1169
- return this.id = null;
1170
- }
1171
- };
1172
-
1173
- return Timer;
1174
-
1175
- })();
1176
-
1177
- Timer.start = function(timeout, func) {
1178
- return setTimeout(func, timeout);
1179
- };
1180
-
1181
- }).call(this);
1182
-
1183
- },{}]},{},[8]);
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.2';
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.https ? "s" : "") + "://" + 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
+ __hasProp = {}.hasOwnProperty;
283
+
284
+ Connector = require('./connector').Connector;
285
+
286
+ Timer = require('./timer').Timer;
287
+
288
+ Options = require('./options').Options;
289
+
290
+ Reloader = require('./reloader').Reloader;
291
+
292
+ exports.LiveReload = LiveReload = (function() {
293
+ function LiveReload(window) {
294
+ var k, v, _ref;
295
+ this.window = window;
296
+ this.listeners = {};
297
+ this.plugins = [];
298
+ this.pluginIdentifiers = {};
299
+ this.console = this.window.console && this.window.console.log && this.window.console.error ? this.window.location.href.match(/LR-verbose/) ? this.window.console : {
300
+ log: function() {},
301
+ error: this.window.console.error.bind(this.window.console)
302
+ } : {
303
+ log: function() {},
304
+ error: function() {}
305
+ };
306
+ if (!(this.WebSocket = this.window.WebSocket || this.window.MozWebSocket)) {
307
+ this.console.error("LiveReload disabled because the browser does not seem to support web sockets");
308
+ return;
309
+ }
310
+ if ('LiveReloadOptions' in window) {
311
+ this.options = new Options();
312
+ _ref = window['LiveReloadOptions'];
313
+ for (k in _ref) {
314
+ if (!__hasProp.call(_ref, k)) continue;
315
+ v = _ref[k];
316
+ this.options.set(k, v);
317
+ }
318
+ } else {
319
+ this.options = Options.extract(this.window.document);
320
+ if (!this.options) {
321
+ this.console.error("LiveReload disabled because it could not find its own <SCRIPT> tag");
322
+ return;
323
+ }
324
+ }
325
+ this.reloader = new Reloader(this.window, this.console, Timer);
326
+ this.connector = new Connector(this.options, this.WebSocket, Timer, {
327
+ connecting: (function(_this) {
328
+ return function() {};
329
+ })(this),
330
+ socketConnected: (function(_this) {
331
+ return function() {};
332
+ })(this),
333
+ connected: (function(_this) {
334
+ return function(protocol) {
335
+ var _base;
336
+ if (typeof (_base = _this.listeners).connect === "function") {
337
+ _base.connect();
338
+ }
339
+ _this.log("LiveReload is connected to " + _this.options.host + ":" + _this.options.port + " (protocol v" + protocol + ").");
340
+ return _this.analyze();
341
+ };
342
+ })(this),
343
+ error: (function(_this) {
344
+ return function(e) {
345
+ if (e instanceof ProtocolError) {
346
+ if (typeof console !== "undefined" && console !== null) {
347
+ return console.log("" + e.message + ".");
348
+ }
349
+ } else {
350
+ if (typeof console !== "undefined" && console !== null) {
351
+ return console.log("LiveReload internal error: " + e.message);
352
+ }
353
+ }
354
+ };
355
+ })(this),
356
+ disconnected: (function(_this) {
357
+ return function(reason, nextDelay) {
358
+ var _base;
359
+ if (typeof (_base = _this.listeners).disconnect === "function") {
360
+ _base.disconnect();
361
+ }
362
+ switch (reason) {
363
+ case 'cannot-connect':
364
+ return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + ", will retry in " + nextDelay + " sec.");
365
+ case 'broken':
366
+ return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + ", reconnecting in " + nextDelay + " sec.");
367
+ case 'handshake-timeout':
368
+ return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake timeout), will retry in " + nextDelay + " sec.");
369
+ case 'handshake-failed':
370
+ return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake failed), will retry in " + nextDelay + " sec.");
371
+ case 'manual':
372
+ break;
373
+ case 'error':
374
+ break;
375
+ default:
376
+ return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + " (" + reason + "), reconnecting in " + nextDelay + " sec.");
377
+ }
378
+ };
379
+ })(this),
380
+ message: (function(_this) {
381
+ return function(message) {
382
+ switch (message.command) {
383
+ case 'reload':
384
+ return _this.performReload(message);
385
+ case 'alert':
386
+ return _this.performAlert(message);
387
+ }
388
+ };
389
+ })(this)
390
+ });
391
+ this.initialized = true;
392
+ }
393
+
394
+ LiveReload.prototype.on = function(eventName, handler) {
395
+ return this.listeners[eventName] = handler;
396
+ };
397
+
398
+ LiveReload.prototype.log = function(message) {
399
+ return this.console.log("" + message);
400
+ };
401
+
402
+ LiveReload.prototype.performReload = function(message) {
403
+ var _ref, _ref1;
404
+ this.log("LiveReload received reload request: " + (JSON.stringify(message, null, 2)));
405
+ return this.reloader.reload(message.path, {
406
+ liveCSS: (_ref = message.liveCSS) != null ? _ref : true,
407
+ liveImg: (_ref1 = message.liveImg) != null ? _ref1 : true,
408
+ originalPath: message.originalPath || '',
409
+ overrideURL: message.overrideURL || '',
410
+ serverURL: "http://" + this.options.host + ":" + this.options.port
411
+ });
412
+ };
413
+
414
+ LiveReload.prototype.performAlert = function(message) {
415
+ return alert(message.message);
416
+ };
417
+
418
+ LiveReload.prototype.shutDown = function() {
419
+ var _base;
420
+ if (!this.initialized) {
421
+ return;
422
+ }
423
+ this.connector.disconnect();
424
+ this.log("LiveReload disconnected.");
425
+ return typeof (_base = this.listeners).shutdown === "function" ? _base.shutdown() : void 0;
426
+ };
427
+
428
+ LiveReload.prototype.hasPlugin = function(identifier) {
429
+ return !!this.pluginIdentifiers[identifier];
430
+ };
431
+
432
+ LiveReload.prototype.addPlugin = function(pluginClass) {
433
+ var plugin;
434
+ if (!this.initialized) {
435
+ return;
436
+ }
437
+ if (this.hasPlugin(pluginClass.identifier)) {
438
+ return;
439
+ }
440
+ this.pluginIdentifiers[pluginClass.identifier] = true;
441
+ plugin = new pluginClass(this.window, {
442
+ _livereload: this,
443
+ _reloader: this.reloader,
444
+ _connector: this.connector,
445
+ console: this.console,
446
+ Timer: Timer,
447
+ generateCacheBustUrl: (function(_this) {
448
+ return function(url) {
449
+ return _this.reloader.generateCacheBustUrl(url);
450
+ };
451
+ })(this)
452
+ });
453
+ this.plugins.push(plugin);
454
+ this.reloader.addPlugin(plugin);
455
+ };
456
+
457
+ LiveReload.prototype.analyze = function() {
458
+ var plugin, pluginData, pluginsData, _i, _len, _ref;
459
+ if (!this.initialized) {
460
+ return;
461
+ }
462
+ if (!(this.connector.protocol >= 7)) {
463
+ return;
464
+ }
465
+ pluginsData = {};
466
+ _ref = this.plugins;
467
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
468
+ plugin = _ref[_i];
469
+ pluginsData[plugin.constructor.identifier] = pluginData = (typeof plugin.analyze === "function" ? plugin.analyze() : void 0) || {};
470
+ pluginData.version = plugin.constructor.version;
471
+ }
472
+ this.connector.sendCommand({
473
+ command: 'info',
474
+ plugins: pluginsData,
475
+ url: this.window.location.href
476
+ });
477
+ };
478
+
479
+ return LiveReload;
480
+
481
+ })();
482
+
483
+ }).call(this);
484
+
485
+ },{"./connector":1,"./options":5,"./reloader":7,"./timer":9}],5:[function(require,module,exports){
486
+ (function() {
487
+ var Options;
488
+
489
+ exports.Options = Options = (function() {
490
+ function Options() {
491
+ this.https = false;
492
+ this.host = null;
493
+ this.port = 35729;
494
+ this.snipver = null;
495
+ this.ext = null;
496
+ this.extver = null;
497
+ this.mindelay = 1000;
498
+ this.maxdelay = 60000;
499
+ this.handshake_timeout = 5000;
500
+ }
501
+
502
+ Options.prototype.set = function(name, value) {
503
+ if (typeof value === 'undefined') {
504
+ return;
505
+ }
506
+ if (!isNaN(+value)) {
507
+ value = +value;
508
+ }
509
+ return this[name] = value;
510
+ };
511
+
512
+ return Options;
513
+
514
+ })();
515
+
516
+ Options.extract = function(document) {
517
+ var element, keyAndValue, m, mm, options, pair, src, _i, _j, _len, _len1, _ref, _ref1;
518
+ _ref = document.getElementsByTagName('script');
519
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
520
+ element = _ref[_i];
521
+ if ((src = element.src) && (m = src.match(/^[^:]+:\/\/(.*)\/z?livereload\.js(?:\?(.*))?$/))) {
522
+ options = new Options();
523
+ options.https = src.indexOf("https") === 0;
524
+ if (mm = m[1].match(/^([^\/:]+)(?::(\d+))?$/)) {
525
+ options.host = mm[1];
526
+ if (mm[2]) {
527
+ options.port = parseInt(mm[2], 10);
528
+ }
529
+ }
530
+ if (m[2]) {
531
+ _ref1 = m[2].split('&');
532
+ for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
533
+ pair = _ref1[_j];
534
+ if ((keyAndValue = pair.split('=')).length > 1) {
535
+ options.set(keyAndValue[0].replace(/-/g, '_'), keyAndValue.slice(1).join('='));
536
+ }
537
+ }
538
+ }
539
+ return options;
540
+ }
541
+ }
542
+ return null;
543
+ };
544
+
545
+ }).call(this);
546
+
547
+ },{}],6:[function(require,module,exports){
548
+ (function() {
549
+ var PROTOCOL_6, PROTOCOL_7, Parser, ProtocolError,
550
+ __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; };
551
+
552
+ exports.PROTOCOL_6 = PROTOCOL_6 = 'http://livereload.com/protocols/official-6';
553
+
554
+ exports.PROTOCOL_7 = PROTOCOL_7 = 'http://livereload.com/protocols/official-7';
555
+
556
+ exports.ProtocolError = ProtocolError = (function() {
557
+ function ProtocolError(reason, data) {
558
+ this.message = "LiveReload protocol error (" + reason + ") after receiving data: \"" + data + "\".";
559
+ }
560
+
561
+ return ProtocolError;
562
+
563
+ })();
564
+
565
+ exports.Parser = Parser = (function() {
566
+ function Parser(handlers) {
567
+ this.handlers = handlers;
568
+ this.reset();
569
+ }
570
+
571
+ Parser.prototype.reset = function() {
572
+ return this.protocol = null;
573
+ };
574
+
575
+ Parser.prototype.process = function(data) {
576
+ var command, e, message, options, _ref;
577
+ try {
578
+ if (this.protocol == null) {
579
+ if (data.match(/^!!ver:([\d.]+)$/)) {
580
+ this.protocol = 6;
581
+ } else if (message = this._parseMessage(data, ['hello'])) {
582
+ if (!message.protocols.length) {
583
+ throw new ProtocolError("no protocols specified in handshake message");
584
+ } else if (__indexOf.call(message.protocols, PROTOCOL_7) >= 0) {
585
+ this.protocol = 7;
586
+ } else if (__indexOf.call(message.protocols, PROTOCOL_6) >= 0) {
587
+ this.protocol = 6;
588
+ } else {
589
+ throw new ProtocolError("no supported protocols found");
590
+ }
591
+ }
592
+ return this.handlers.connected(this.protocol);
593
+ } else if (this.protocol === 6) {
594
+ message = JSON.parse(data);
595
+ if (!message.length) {
596
+ throw new ProtocolError("protocol 6 messages must be arrays");
597
+ }
598
+ command = message[0], options = message[1];
599
+ if (command !== 'refresh') {
600
+ throw new ProtocolError("unknown protocol 6 command");
601
+ }
602
+ return this.handlers.message({
603
+ command: 'reload',
604
+ path: options.path,
605
+ liveCSS: (_ref = options.apply_css_live) != null ? _ref : true
606
+ });
607
+ } else {
608
+ message = this._parseMessage(data, ['reload', 'alert']);
609
+ return this.handlers.message(message);
610
+ }
611
+ } catch (_error) {
612
+ e = _error;
613
+ if (e instanceof ProtocolError) {
614
+ return this.handlers.error(e);
615
+ } else {
616
+ throw e;
617
+ }
618
+ }
619
+ };
620
+
621
+ Parser.prototype._parseMessage = function(data, validCommands) {
622
+ var e, message, _ref;
623
+ try {
624
+ message = JSON.parse(data);
625
+ } catch (_error) {
626
+ e = _error;
627
+ throw new ProtocolError('unparsable JSON', data);
628
+ }
629
+ if (!message.command) {
630
+ throw new ProtocolError('missing "command" key', data);
631
+ }
632
+ if (_ref = message.command, __indexOf.call(validCommands, _ref) < 0) {
633
+ throw new ProtocolError("invalid command '" + message.command + "', only valid commands are: " + (validCommands.join(', ')) + ")", data);
634
+ }
635
+ return message;
636
+ };
637
+
638
+ return Parser;
639
+
640
+ })();
641
+
642
+ }).call(this);
643
+
644
+ },{}],7:[function(require,module,exports){
645
+ (function() {
646
+ var IMAGE_STYLES, Reloader, numberOfMatchingSegments, pathFromUrl, pathsMatch, pickBestMatch, splitUrl;
647
+
648
+ splitUrl = function(url) {
649
+ var hash, index, params;
650
+ if ((index = url.indexOf('#')) >= 0) {
651
+ hash = url.slice(index);
652
+ url = url.slice(0, index);
653
+ } else {
654
+ hash = '';
655
+ }
656
+ if ((index = url.indexOf('?')) >= 0) {
657
+ params = url.slice(index);
658
+ url = url.slice(0, index);
659
+ } else {
660
+ params = '';
661
+ }
662
+ return {
663
+ url: url,
664
+ params: params,
665
+ hash: hash
666
+ };
667
+ };
668
+
669
+ pathFromUrl = function(url) {
670
+ var path;
671
+ url = splitUrl(url).url;
672
+ if (url.indexOf('file://') === 0) {
673
+ path = url.replace(/^file:\/\/(localhost)?/, '');
674
+ } else {
675
+ path = url.replace(/^([^:]+:)?\/\/([^:\/]+)(:\d*)?\//, '/');
676
+ }
677
+ return decodeURIComponent(path);
678
+ };
679
+
680
+ pickBestMatch = function(path, objects, pathFunc) {
681
+ var bestMatch, object, score, _i, _len;
682
+ bestMatch = {
683
+ score: 0
684
+ };
685
+ for (_i = 0, _len = objects.length; _i < _len; _i++) {
686
+ object = objects[_i];
687
+ score = numberOfMatchingSegments(path, pathFunc(object));
688
+ if (score > bestMatch.score) {
689
+ bestMatch = {
690
+ object: object,
691
+ score: score
692
+ };
693
+ }
694
+ }
695
+ if (bestMatch.score > 0) {
696
+ return bestMatch;
697
+ } else {
698
+ return null;
699
+ }
700
+ };
701
+
702
+ numberOfMatchingSegments = function(path1, path2) {
703
+ var comps1, comps2, eqCount, len;
704
+ path1 = path1.replace(/^\/+/, '').toLowerCase();
705
+ path2 = path2.replace(/^\/+/, '').toLowerCase();
706
+ if (path1 === path2) {
707
+ return 10000;
708
+ }
709
+ comps1 = path1.split('/').reverse();
710
+ comps2 = path2.split('/').reverse();
711
+ len = Math.min(comps1.length, comps2.length);
712
+ eqCount = 0;
713
+ while (eqCount < len && comps1[eqCount] === comps2[eqCount]) {
714
+ ++eqCount;
715
+ }
716
+ return eqCount;
717
+ };
718
+
719
+ pathsMatch = function(path1, path2) {
720
+ return numberOfMatchingSegments(path1, path2) > 0;
721
+ };
722
+
723
+ IMAGE_STYLES = [
724
+ {
725
+ selector: 'background',
726
+ styleNames: ['backgroundImage']
727
+ }, {
728
+ selector: 'border',
729
+ styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage']
730
+ }
731
+ ];
732
+
733
+ exports.Reloader = Reloader = (function() {
734
+ function Reloader(window, console, Timer) {
735
+ this.window = window;
736
+ this.console = console;
737
+ this.Timer = Timer;
738
+ this.document = this.window.document;
739
+ this.importCacheWaitPeriod = 200;
740
+ this.plugins = [];
741
+ }
742
+
743
+ Reloader.prototype.addPlugin = function(plugin) {
744
+ return this.plugins.push(plugin);
745
+ };
746
+
747
+ Reloader.prototype.analyze = function(callback) {
748
+ return results;
749
+ };
750
+
751
+ Reloader.prototype.reload = function(path, options) {
752
+ var plugin, _base, _i, _len, _ref;
753
+ this.options = options;
754
+ if ((_base = this.options).stylesheetReloadTimeout == null) {
755
+ _base.stylesheetReloadTimeout = 15000;
756
+ }
757
+ _ref = this.plugins;
758
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
759
+ plugin = _ref[_i];
760
+ if (plugin.reload && plugin.reload(path, options)) {
761
+ return;
762
+ }
763
+ }
764
+ if (options.liveCSS) {
765
+ if (path.match(/\.css$/i)) {
766
+ if (this.reloadStylesheet(path)) {
767
+ return;
768
+ }
769
+ }
770
+ }
771
+ if (options.liveImg) {
772
+ if (path.match(/\.(jpe?g|png|gif)$/i)) {
773
+ this.reloadImages(path);
774
+ return;
775
+ }
776
+ }
777
+ return this.reloadPage();
778
+ };
779
+
780
+ Reloader.prototype.reloadPage = function() {
781
+ return this.window.document.location.reload();
782
+ };
783
+
784
+ Reloader.prototype.reloadImages = function(path) {
785
+ var expando, img, selector, styleNames, styleSheet, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _results;
786
+ expando = this.generateUniqueString();
787
+ _ref = this.document.images;
788
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
789
+ img = _ref[_i];
790
+ if (pathsMatch(path, pathFromUrl(img.src))) {
791
+ img.src = this.generateCacheBustUrl(img.src, expando);
792
+ }
793
+ }
794
+ if (this.document.querySelectorAll) {
795
+ for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) {
796
+ _ref1 = IMAGE_STYLES[_j], selector = _ref1.selector, styleNames = _ref1.styleNames;
797
+ _ref2 = this.document.querySelectorAll("[style*=" + selector + "]");
798
+ for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
799
+ img = _ref2[_k];
800
+ this.reloadStyleImages(img.style, styleNames, path, expando);
801
+ }
802
+ }
803
+ }
804
+ if (this.document.styleSheets) {
805
+ _ref3 = this.document.styleSheets;
806
+ _results = [];
807
+ for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
808
+ styleSheet = _ref3[_l];
809
+ _results.push(this.reloadStylesheetImages(styleSheet, path, expando));
810
+ }
811
+ return _results;
812
+ }
813
+ };
814
+
815
+ Reloader.prototype.reloadStylesheetImages = function(styleSheet, path, expando) {
816
+ var e, rule, rules, styleNames, _i, _j, _len, _len1;
817
+ try {
818
+ rules = styleSheet != null ? styleSheet.cssRules : void 0;
819
+ } catch (_error) {
820
+ e = _error;
821
+ }
822
+ if (!rules) {
823
+ return;
824
+ }
825
+ for (_i = 0, _len = rules.length; _i < _len; _i++) {
826
+ rule = rules[_i];
827
+ switch (rule.type) {
828
+ case CSSRule.IMPORT_RULE:
829
+ this.reloadStylesheetImages(rule.styleSheet, path, expando);
830
+ break;
831
+ case CSSRule.STYLE_RULE:
832
+ for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) {
833
+ styleNames = IMAGE_STYLES[_j].styleNames;
834
+ this.reloadStyleImages(rule.style, styleNames, path, expando);
835
+ }
836
+ break;
837
+ case CSSRule.MEDIA_RULE:
838
+ this.reloadStylesheetImages(rule, path, expando);
839
+ }
840
+ }
841
+ };
842
+
843
+ Reloader.prototype.reloadStyleImages = function(style, styleNames, path, expando) {
844
+ var newValue, styleName, value, _i, _len;
845
+ for (_i = 0, _len = styleNames.length; _i < _len; _i++) {
846
+ styleName = styleNames[_i];
847
+ value = style[styleName];
848
+ if (typeof value === 'string') {
849
+ newValue = value.replace(/\burl\s*\(([^)]*)\)/, (function(_this) {
850
+ return function(match, src) {
851
+ if (pathsMatch(path, pathFromUrl(src))) {
852
+ return "url(" + (_this.generateCacheBustUrl(src, expando)) + ")";
853
+ } else {
854
+ return match;
855
+ }
856
+ };
857
+ })(this));
858
+ if (newValue !== value) {
859
+ style[styleName] = newValue;
860
+ }
861
+ }
862
+ }
863
+ };
864
+
865
+ Reloader.prototype.reloadStylesheet = function(path) {
866
+ var imported, link, links, match, style, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1;
867
+ links = (function() {
868
+ var _i, _len, _ref, _results;
869
+ _ref = this.document.getElementsByTagName('link');
870
+ _results = [];
871
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
872
+ link = _ref[_i];
873
+ if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) {
874
+ _results.push(link);
875
+ }
876
+ }
877
+ return _results;
878
+ }).call(this);
879
+ imported = [];
880
+ _ref = this.document.getElementsByTagName('style');
881
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
882
+ style = _ref[_i];
883
+ if (style.sheet) {
884
+ this.collectImportedStylesheets(style, style.sheet, imported);
885
+ }
886
+ }
887
+ for (_j = 0, _len1 = links.length; _j < _len1; _j++) {
888
+ link = links[_j];
889
+ this.collectImportedStylesheets(link, link.sheet, imported);
890
+ }
891
+ if (this.window.StyleFix && this.document.querySelectorAll) {
892
+ _ref1 = this.document.querySelectorAll('style[data-href]');
893
+ for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {
894
+ style = _ref1[_k];
895
+ links.push(style);
896
+ }
897
+ }
898
+ this.console.log("LiveReload found " + links.length + " LINKed stylesheets, " + imported.length + " @imported stylesheets");
899
+ match = pickBestMatch(path, links.concat(imported), (function(_this) {
900
+ return function(l) {
901
+ return pathFromUrl(_this.linkHref(l));
902
+ };
903
+ })(this));
904
+ if (match) {
905
+ if (match.object.rule) {
906
+ this.console.log("LiveReload is reloading imported stylesheet: " + match.object.href);
907
+ this.reattachImportedRule(match.object);
908
+ } else {
909
+ this.console.log("LiveReload is reloading stylesheet: " + (this.linkHref(match.object)));
910
+ this.reattachStylesheetLink(match.object);
911
+ }
912
+ } else {
913
+ this.console.log("LiveReload will reload all stylesheets because path '" + path + "' did not match any specific one");
914
+ for (_l = 0, _len3 = links.length; _l < _len3; _l++) {
915
+ link = links[_l];
916
+ this.reattachStylesheetLink(link);
917
+ }
918
+ }
919
+ return true;
920
+ };
921
+
922
+ Reloader.prototype.collectImportedStylesheets = function(link, styleSheet, result) {
923
+ var e, index, rule, rules, _i, _len;
924
+ try {
925
+ rules = styleSheet != null ? styleSheet.cssRules : void 0;
926
+ } catch (_error) {
927
+ e = _error;
928
+ }
929
+ if (rules && rules.length) {
930
+ for (index = _i = 0, _len = rules.length; _i < _len; index = ++_i) {
931
+ rule = rules[index];
932
+ switch (rule.type) {
933
+ case CSSRule.CHARSET_RULE:
934
+ continue;
935
+ case CSSRule.IMPORT_RULE:
936
+ result.push({
937
+ link: link,
938
+ rule: rule,
939
+ index: index,
940
+ href: rule.href
941
+ });
942
+ this.collectImportedStylesheets(link, rule.styleSheet, result);
943
+ break;
944
+ default:
945
+ break;
946
+ }
947
+ }
948
+ }
949
+ };
950
+
951
+ Reloader.prototype.waitUntilCssLoads = function(clone, func) {
952
+ var callbackExecuted, executeCallback, poll;
953
+ callbackExecuted = false;
954
+ executeCallback = (function(_this) {
955
+ return function() {
956
+ if (callbackExecuted) {
957
+ return;
958
+ }
959
+ callbackExecuted = true;
960
+ return func();
961
+ };
962
+ })(this);
963
+ clone.onload = (function(_this) {
964
+ return function() {
965
+ _this.console.log("LiveReload: the new stylesheet has finished loading");
966
+ _this.knownToSupportCssOnLoad = true;
967
+ return executeCallback();
968
+ };
969
+ })(this);
970
+ if (!this.knownToSupportCssOnLoad) {
971
+ (poll = (function(_this) {
972
+ return function() {
973
+ if (clone.sheet) {
974
+ _this.console.log("LiveReload is polling until the new CSS finishes loading...");
975
+ return executeCallback();
976
+ } else {
977
+ return _this.Timer.start(50, poll);
978
+ }
979
+ };
980
+ })(this))();
981
+ }
982
+ return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback);
983
+ };
984
+
985
+ Reloader.prototype.linkHref = function(link) {
986
+ return link.href || link.getAttribute('data-href');
987
+ };
988
+
989
+ Reloader.prototype.reattachStylesheetLink = function(link) {
990
+ var clone, parent;
991
+ if (link.__LiveReload_pendingRemoval) {
992
+ return;
993
+ }
994
+ link.__LiveReload_pendingRemoval = true;
995
+ if (link.tagName === 'STYLE') {
996
+ clone = this.document.createElement('link');
997
+ clone.rel = 'stylesheet';
998
+ clone.media = link.media;
999
+ clone.disabled = link.disabled;
1000
+ } else {
1001
+ clone = link.cloneNode(false);
1002
+ }
1003
+ clone.href = this.generateCacheBustUrl(this.linkHref(link));
1004
+ parent = link.parentNode;
1005
+ if (parent.lastChild === link) {
1006
+ parent.appendChild(clone);
1007
+ } else {
1008
+ parent.insertBefore(clone, link.nextSibling);
1009
+ }
1010
+ return this.waitUntilCssLoads(clone, (function(_this) {
1011
+ return function() {
1012
+ var additionalWaitingTime;
1013
+ if (/AppleWebKit/.test(navigator.userAgent)) {
1014
+ additionalWaitingTime = 5;
1015
+ } else {
1016
+ additionalWaitingTime = 200;
1017
+ }
1018
+ return _this.Timer.start(additionalWaitingTime, function() {
1019
+ var _ref;
1020
+ if (!link.parentNode) {
1021
+ return;
1022
+ }
1023
+ link.parentNode.removeChild(link);
1024
+ clone.onreadystatechange = null;
1025
+ return (_ref = _this.window.StyleFix) != null ? _ref.link(clone) : void 0;
1026
+ });
1027
+ };
1028
+ })(this));
1029
+ };
1030
+
1031
+ Reloader.prototype.reattachImportedRule = function(_arg) {
1032
+ var href, index, link, media, newRule, parent, rule, tempLink;
1033
+ rule = _arg.rule, index = _arg.index, link = _arg.link;
1034
+ parent = rule.parentStyleSheet;
1035
+ href = this.generateCacheBustUrl(rule.href);
1036
+ media = rule.media.length ? [].join.call(rule.media, ', ') : '';
1037
+ newRule = "@import url(\"" + href + "\") " + media + ";";
1038
+ rule.__LiveReload_newHref = href;
1039
+ tempLink = this.document.createElement("link");
1040
+ tempLink.rel = 'stylesheet';
1041
+ tempLink.href = href;
1042
+ tempLink.__LiveReload_pendingRemoval = true;
1043
+ if (link.parentNode) {
1044
+ link.parentNode.insertBefore(tempLink, link);
1045
+ }
1046
+ return this.Timer.start(this.importCacheWaitPeriod, (function(_this) {
1047
+ return function() {
1048
+ if (tempLink.parentNode) {
1049
+ tempLink.parentNode.removeChild(tempLink);
1050
+ }
1051
+ if (rule.__LiveReload_newHref !== href) {
1052
+ return;
1053
+ }
1054
+ parent.insertRule(newRule, index);
1055
+ parent.deleteRule(index + 1);
1056
+ rule = parent.cssRules[index];
1057
+ rule.__LiveReload_newHref = href;
1058
+ return _this.Timer.start(_this.importCacheWaitPeriod, function() {
1059
+ if (rule.__LiveReload_newHref !== href) {
1060
+ return;
1061
+ }
1062
+ parent.insertRule(newRule, index);
1063
+ return parent.deleteRule(index + 1);
1064
+ });
1065
+ };
1066
+ })(this));
1067
+ };
1068
+
1069
+ Reloader.prototype.generateUniqueString = function() {
1070
+ return 'livereload=' + Date.now();
1071
+ };
1072
+
1073
+ Reloader.prototype.generateCacheBustUrl = function(url, expando) {
1074
+ var hash, oldParams, originalUrl, params, _ref;
1075
+ if (expando == null) {
1076
+ expando = this.generateUniqueString();
1077
+ }
1078
+ _ref = splitUrl(url), url = _ref.url, hash = _ref.hash, oldParams = _ref.params;
1079
+ if (this.options.overrideURL) {
1080
+ if (url.indexOf(this.options.serverURL) < 0) {
1081
+ originalUrl = url;
1082
+ url = this.options.serverURL + this.options.overrideURL + "?url=" + encodeURIComponent(url);
1083
+ this.console.log("LiveReload is overriding source URL " + originalUrl + " with " + url);
1084
+ }
1085
+ }
1086
+ params = oldParams.replace(/(\?|&)livereload=(\d+)/, function(match, sep) {
1087
+ return "" + sep + expando;
1088
+ });
1089
+ if (params === oldParams) {
1090
+ if (oldParams.length === 0) {
1091
+ params = "?" + expando;
1092
+ } else {
1093
+ params = "" + oldParams + "&" + expando;
1094
+ }
1095
+ }
1096
+ return url + params + hash;
1097
+ };
1098
+
1099
+ return Reloader;
1100
+
1101
+ })();
1102
+
1103
+ }).call(this);
1104
+
1105
+ },{}],8:[function(require,module,exports){
1106
+ (function() {
1107
+ var CustomEvents, LiveReload, k;
1108
+
1109
+ CustomEvents = require('./customevents');
1110
+
1111
+ LiveReload = window.LiveReload = new (require('./livereload').LiveReload)(window);
1112
+
1113
+ for (k in window) {
1114
+ if (k.match(/^LiveReloadPlugin/)) {
1115
+ LiveReload.addPlugin(window[k]);
1116
+ }
1117
+ }
1118
+
1119
+ LiveReload.addPlugin(require('./less'));
1120
+
1121
+ LiveReload.on('shutdown', function() {
1122
+ return delete window.LiveReload;
1123
+ });
1124
+
1125
+ LiveReload.on('connect', function() {
1126
+ return CustomEvents.fire(document, 'LiveReloadConnect');
1127
+ });
1128
+
1129
+ LiveReload.on('disconnect', function() {
1130
+ return CustomEvents.fire(document, 'LiveReloadDisconnect');
1131
+ });
1132
+
1133
+ CustomEvents.bind(document, 'LiveReloadShutDown', function() {
1134
+ return LiveReload.shutDown();
1135
+ });
1136
+
1137
+ }).call(this);
1138
+
1139
+ },{"./customevents":2,"./less":3,"./livereload":4}],9:[function(require,module,exports){
1140
+ (function() {
1141
+ var Timer;
1142
+
1143
+ exports.Timer = Timer = (function() {
1144
+ function Timer(func) {
1145
+ this.func = func;
1146
+ this.running = false;
1147
+ this.id = null;
1148
+ this._handler = (function(_this) {
1149
+ return function() {
1150
+ _this.running = false;
1151
+ _this.id = null;
1152
+ return _this.func();
1153
+ };
1154
+ })(this);
1155
+ }
1156
+
1157
+ Timer.prototype.start = function(timeout) {
1158
+ if (this.running) {
1159
+ clearTimeout(this.id);
1160
+ }
1161
+ this.id = setTimeout(this._handler, timeout);
1162
+ return this.running = true;
1163
+ };
1164
+
1165
+ Timer.prototype.stop = function() {
1166
+ if (this.running) {
1167
+ clearTimeout(this.id);
1168
+ this.running = false;
1169
+ return this.id = null;
1170
+ }
1171
+ };
1172
+
1173
+ return Timer;
1174
+
1175
+ })();
1176
+
1177
+ Timer.start = function(timeout, func) {
1178
+ return setTimeout(func, timeout);
1179
+ };
1180
+
1181
+ }).call(this);
1182
+
1183
+ },{}]},{},[8]);