diff --git a/README.md b/README.md index 20ad636..5b76d9e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # splash-snap.github.io -Splash is a [Snap*!*](snap.berkeley.edu) mod created by [@space-elephant](https://github.com/space-elephant) containing + +[![GitHub issues](https://img.shields.io/github/issues/splash-snap/splash-snap.github.io.svg)](https://github.com/splash-snap/splash-snap.github.io/issues) +[![GitHub stars](https://img.shields.io/github/stars/splash-snap/splash-snap.github.io.svg)](https://github.com/splash-snap/splash-snap.github.io/stargazers) + +Splash is a [Snap!](snap.berkeley.edu) mod created by [@space-elephant](https://github.com/space-elephant) containing * First class dictionarries * Native [JSON](http://json.org) support @@ -10,13 +14,6 @@ In progress there are * [ship variables](https://scratch.mit.edu/discuss/topic/317138/) * [cookie variables](https://en.wikipedia.org/wiki/HTTP_cookie) -The online site is at [splash-snap.github.io](splash-snap.github.io) - -The /server/ directory is for code related to the server. It is writen in java. - +This will use [firebase](https://console.firebase.google.com/project/splash-clouddata/overview) to store the cloud variables and sinc the messages. diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000..401eda2 --- /dev/null +++ b/about/index.html @@ -0,0 +1,25 @@ + + + + Splash - About + + + + + +
+
+

About

+

Splash is a mod for Snap! by @space-elphant (Snap!, email) with support for first class dictionaries

+

Cloud variables will use firebase to store the cloud vars and sinc the messages.

+
+ + diff --git a/docs/index.html b/docs/index.html index b626a29..cdb18c9 100644 --- a/docs/index.html +++ b/docs/index.html @@ -11,7 +11,8 @@ - + +
  • Case Sensing
  • Looping
  • diff --git a/editor/firebase/app.js b/editor/firebase/app.js new file mode 100644 index 0000000..1e759c3 --- /dev/null +++ b/editor/firebase/app.js @@ -0,0 +1,1481 @@ +! function(t, e) { + "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : t.firebase = e() +}(this, function() { + "use strict"; + ! function(t) { + if (!t.fetch) { + var e = { + searchParams: "URLSearchParams" in t, + iterable: "Symbol" in t && "iterator" in Symbol, + blob: "FileReader" in t && "Blob" in t && function() { + try { + return new Blob, !0 + } catch (t) { + return !1 + } + }(), + formData: "FormData" in t, + arrayBuffer: "ArrayBuffer" in t + }; + if (e.arrayBuffer) var r = ["[object Int8Array]", "[object Uint8Array]", "[object Uint8ClampedArray]", "[object Int16Array]", "[object Uint16Array]", "[object Int32Array]", "[object Uint32Array]", "[object Float32Array]", "[object Float64Array]"], + n = function(t) { + return t && DataView.prototype.isPrototypeOf(t) + }, + o = ArrayBuffer.isView || function(t) { + return t && r.indexOf(Object.prototype.toString.call(t)) > -1 + }; + f.prototype.append = function(t, e) { + t = a(t), e = u(e); + var r = this.map[t]; + this.map[t] = r ? r + "," + e : e + }, f.prototype.delete = function(t) { + delete this.map[a(t)] + }, f.prototype.get = function(t) { + return t = a(t), this.has(t) ? this.map[t] : null + }, f.prototype.has = function(t) { + return this.map.hasOwnProperty(a(t)) + }, f.prototype.set = function(t, e) { + this.map[a(t)] = u(e) + }, f.prototype.forEach = function(t, e) { + for (var r in this.map) this.map.hasOwnProperty(r) && t.call(e, this.map[r], r, this) + }, f.prototype.keys = function() { + var t = []; + return this.forEach(function(e, r) { + t.push(r) + }), c(t) + }, f.prototype.values = function() { + var t = []; + return this.forEach(function(e) { + t.push(e) + }), c(t) + }, f.prototype.entries = function() { + var t = []; + return this.forEach(function(e, r) { + t.push([r, e]) + }), c(t) + }, e.iterable && (f.prototype[Symbol.iterator] = f.prototype.entries); + var i = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"]; + v.prototype.clone = function() { + return new v(this, { + body: this._bodyInit + }) + }, y.call(v.prototype), y.call(m.prototype), m.prototype.clone = function() { + return new m(this._bodyInit, { + status: this.status, + statusText: this.statusText, + headers: new f(this.headers), + url: this.url + }) + }, m.error = function() { + var t = new m(null, { + status: 0, + statusText: "" + }); + return t.type = "error", t + }; + var s = [301, 302, 303, 307, 308]; + m.redirect = function(t, e) { + if (-1 === s.indexOf(e)) throw new RangeError("Invalid status code"); + return new m(null, { + status: e, + headers: { + location: t + } + }) + }, t.Headers = f, t.Request = v, t.Response = m, t.fetch = function(t, r) { + return new Promise(function(n, o) { + var i = new v(t, r), + s = new XMLHttpRequest; + s.onload = function() { + var t, e, r = { + status: s.status, + statusText: s.statusText, + headers: (t = s.getAllResponseHeaders() || "", e = new f, t.replace(/\r?\n[\t ]+/g, " ").split(/\r?\n/).forEach(function(t) { + var r = t.split(":"), + n = r.shift().trim(); + if (n) { + var o = r.join(":").trim(); + e.append(n, o) + } + }), e) + }; + r.url = "responseURL" in s ? s.responseURL : r.headers.get("X-Request-URL"); + var o = "response" in s ? s.response : s.responseText; + n(new m(o, r)) + }, s.onerror = function() { + o(new TypeError("Network request failed")) + }, s.ontimeout = function() { + o(new TypeError("Network request failed")) + }, s.open(i.method, i.url, !0), "include" === i.credentials ? s.withCredentials = !0 : "omit" === i.credentials && (s.withCredentials = !1), "responseType" in s && e.blob && (s.responseType = "blob"), i.headers.forEach(function(t, e) { + s.setRequestHeader(e, t) + }), s.send(void 0 === i._bodyInit ? null : i._bodyInit) + }) + }, t.fetch.polyfill = !0 + } + + function a(t) { + if ("string" != typeof t && (t = String(t)), /[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(t)) throw new TypeError("Invalid character in header field name"); + return t.toLowerCase() + } + + function u(t) { + return "string" != typeof t && (t = String(t)), t + } + + function c(t) { + var r = { + next: function() { + var e = t.shift(); + return { + done: void 0 === e, + value: e + } + } + }; + return e.iterable && (r[Symbol.iterator] = function() { + return r + }), r + } + + function f(t) { + this.map = {}, t instanceof f ? t.forEach(function(t, e) { + this.append(e, t) + }, this) : Array.isArray(t) ? t.forEach(function(t) { + this.append(t[0], t[1]) + }, this) : t && Object.getOwnPropertyNames(t).forEach(function(e) { + this.append(e, t[e]) + }, this) + } + + function h(t) { + if (t.bodyUsed) return Promise.reject(new TypeError("Already read")); + t.bodyUsed = !0 + } + + function l(t) { + return new Promise(function(e, r) { + t.onload = function() { + e(t.result) + }, t.onerror = function() { + r(t.error) + } + }) + } + + function p(t) { + var e = new FileReader, + r = l(e); + return e.readAsArrayBuffer(t), r + } + + function d(t) { + if (t.slice) return t.slice(0); + var e = new Uint8Array(t.byteLength); + return e.set(new Uint8Array(t)), e.buffer + } + + function y() { + return this.bodyUsed = !1, this._initBody = function(t) { + if (this._bodyInit = t, t) + if ("string" == typeof t) this._bodyText = t; + else if (e.blob && Blob.prototype.isPrototypeOf(t)) this._bodyBlob = t; + else if (e.formData && FormData.prototype.isPrototypeOf(t)) this._bodyFormData = t; + else if (e.searchParams && URLSearchParams.prototype.isPrototypeOf(t)) this._bodyText = t.toString(); + else if (e.arrayBuffer && e.blob && n(t)) this._bodyArrayBuffer = d(t.buffer), this._bodyInit = new Blob([this._bodyArrayBuffer]); + else { + if (!e.arrayBuffer || !ArrayBuffer.prototype.isPrototypeOf(t) && !o(t)) throw new Error("unsupported BodyInit type"); + this._bodyArrayBuffer = d(t) + } else this._bodyText = ""; + this.headers.get("content-type") || ("string" == typeof t ? this.headers.set("content-type", "text/plain;charset=UTF-8") : this._bodyBlob && this._bodyBlob.type ? this.headers.set("content-type", this._bodyBlob.type) : e.searchParams && URLSearchParams.prototype.isPrototypeOf(t) && this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8")) + }, e.blob && (this.blob = function() { + var t = h(this); + if (t) return t; + if (this._bodyBlob) return Promise.resolve(this._bodyBlob); + if (this._bodyArrayBuffer) return Promise.resolve(new Blob([this._bodyArrayBuffer])); + if (this._bodyFormData) throw new Error("could not read FormData body as blob"); + return Promise.resolve(new Blob([this._bodyText])) + }, this.arrayBuffer = function() { + return this._bodyArrayBuffer ? h(this) || Promise.resolve(this._bodyArrayBuffer) : this.blob().then(p) + }), this.text = function() { + var t, e, r, n = h(this); + if (n) return n; + if (this._bodyBlob) return t = this._bodyBlob, e = new FileReader, r = l(e), e.readAsText(t), r; + if (this._bodyArrayBuffer) return Promise.resolve(function(t) { + for (var e = new Uint8Array(t), r = new Array(e.length), n = 0; n < e.length; n++) r[n] = String.fromCharCode(e[n]); + return r.join("") + }(this._bodyArrayBuffer)); + if (this._bodyFormData) throw new Error("could not read FormData body as text"); + return Promise.resolve(this._bodyText) + }, e.formData && (this.formData = function() { + return this.text().then(b) + }), this.json = function() { + return this.text().then(JSON.parse) + }, this + } + + function v(t, e) { + var r, n, o = (e = e || {}).body; + if (t instanceof v) { + if (t.bodyUsed) throw new TypeError("Already read"); + this.url = t.url, this.credentials = t.credentials, e.headers || (this.headers = new f(t.headers)), this.method = t.method, this.mode = t.mode, o || null == t._bodyInit || (o = t._bodyInit, t.bodyUsed = !0) + } else this.url = String(t); + if (this.credentials = e.credentials || this.credentials || "omit", !e.headers && this.headers || (this.headers = new f(e.headers)), this.method = (r = e.method || this.method || "GET", n = r.toUpperCase(), i.indexOf(n) > -1 ? n : r), this.mode = e.mode || this.mode || null, this.referrer = null, ("GET" === this.method || "HEAD" === this.method) && o) throw new TypeError("Body not allowed for GET or HEAD requests"); + this._initBody(o) + } + + function b(t) { + var e = new FormData; + return t.trim().split("&").forEach(function(t) { + if (t) { + var r = t.split("="), + n = r.shift().replace(/\+/g, " "), + o = r.join("=").replace(/\+/g, " "); + e.append(decodeURIComponent(n), decodeURIComponent(o)) + } + }), e + } + + function m(t, e) { + e || (e = {}), this.type = "default", this.status = void 0 === e.status ? 200 : e.status, this.ok = this.status >= 200 && this.status < 300, this.statusText = "statusText" in e ? e.statusText : "OK", this.headers = new f(e.headers), this.url = e.url || "", this._initBody(t) + } + }("undefined" != typeof self ? self : void 0); + var t = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {}; + + function e(t, e) { + return t(e = { + exports: {} + }, e.exports), e.exports + } + var r = setTimeout; + + function n() {} + + function o(t) { + if (!(this instanceof o)) throw new TypeError("Promises must be constructed via new"); + if ("function" != typeof t) throw new TypeError("not a function"); + this._state = 0, this._handled = !1, this._value = void 0, this._deferreds = [], c(t, this) + } + + function i(t, e) { + for (; 3 === t._state;) t = t._value; + 0 !== t._state ? (t._handled = !0, o._immediateFn(function() { + var r = 1 === t._state ? e.onFulfilled : e.onRejected; + if (null !== r) { + var n; + try { + n = r(t._value) + } catch (t) { + return void a(e.promise, t) + } + s(e.promise, n) + } else(1 === t._state ? s : a)(e.promise, t._value) + })) : t._deferreds.push(e) + } + + function s(t, e) { + try { + if (e === t) throw new TypeError("A promise cannot be resolved with itself."); + if (e && ("object" == typeof e || "function" == typeof e)) { + var r = e.then; + if (e instanceof o) return t._state = 3, t._value = e, void u(t); + if ("function" == typeof r) return void c((n = r, i = e, function() { + n.apply(i, arguments) + }), t) + } + t._state = 1, t._value = e, u(t) + } catch (e) { + a(t, e) + } + var n, i + } + + function a(t, e) { + t._state = 2, t._value = e, u(t) + } + + function u(t) { + 2 === t._state && 0 === t._deferreds.length && o._immediateFn(function() { + t._handled || o._unhandledRejectionFn(t._value) + }); + for (var e = 0, r = t._deferreds.length; e < r; e++) i(t, t._deferreds[e]); + t._deferreds = null + } + + function c(t, e) { + var r = !1; + try { + t(function(t) { + r || (r = !0, s(e, t)) + }, function(t) { + r || (r = !0, a(e, t)) + }) + } catch (t) { + if (r) return; + r = !0, a(e, t) + } + } + o.prototype.catch = function(t) { + return this.then(null, t) + }, o.prototype.then = function(t, e) { + var r = new this.constructor(n); + return i(this, new function(t, e, r) { + this.onFulfilled = "function" == typeof t ? t : null, this.onRejected = "function" == typeof e ? e : null, this.promise = r + }(t, e, r)), r + }, o.prototype.finally = function(t) { + var e = this.constructor; + return this.then(function(r) { + return e.resolve(t()).then(function() { + return r + }) + }, function(r) { + return e.resolve(t()).then(function() { + return e.reject(r) + }) + }) + }, o.all = function(t) { + return new o(function(e, r) { + if (!t || void 0 === t.length) throw new TypeError("Promise.all accepts an array"); + var n = Array.prototype.slice.call(t); + if (0 === n.length) return e([]); + var o = n.length; + + function i(t, s) { + try { + if (s && ("object" == typeof s || "function" == typeof s)) { + var a = s.then; + if ("function" == typeof a) return void a.call(s, function(e) { + i(t, e) + }, r) + } + n[t] = s, 0 == --o && e(n) + } catch (t) { + r(t) + } + } + for (var s = 0; s < n.length; s++) i(s, n[s]) + }) + }, o.resolve = function(t) { + return t && "object" == typeof t && t.constructor === o ? t : new o(function(e) { + e(t) + }) + }, o.reject = function(t) { + return new o(function(e, r) { + r(t) + }) + }, o.race = function(t) { + return new o(function(e, r) { + for (var n = 0, o = t.length; n < o; n++) t[n].then(e, r) + }) + }, o._immediateFn = "function" == typeof setImmediate && function(t) { + setImmediate(t) + } || function(t) { + r(t, 0) + }, o._unhandledRejectionFn = function(t) { + "undefined" != typeof console && console && console.warn("Possible Unhandled Promise Rejection:", t) + }; + var f = function() { + if ("undefined" != typeof self) return self; + if ("undefined" != typeof window) return window; + if (void 0 !== t) return t; + throw new Error("unable to locate global object") + }(); + f.Promise || (f.Promise = o); + var h = e(function(t) { + var e = t.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")(); + "number" == typeof __g && (__g = e) + }), + l = e(function(t) { + var e = t.exports = { + version: "2.5.5" + }; + "number" == typeof __e && (__e = e) + }), + p = (l.version, function(t) { + return "object" == typeof t ? null !== t : "function" == typeof t + }), + d = function(t) { + if (!p(t)) throw TypeError(t + " is not an object!"); + return t + }, + y = function(t) { + try { + return !!t() + } catch (t) { + return !0 + } + }, + v = !y(function() { + return 7 != Object.defineProperty({}, "a", { + get: function() { + return 7 + } + }).a + }), + b = h.document, + m = p(b) && p(b.createElement), + _ = function(t) { + return m ? b.createElement(t) : {} + }, + g = !v && !y(function() { + return 7 != Object.defineProperty(_("div"), "a", { + get: function() { + return 7 + } + }).a + }), + w = function(t, e) { + if (!p(t)) return t; + var r, n; + if (e && "function" == typeof(r = t.toString) && !p(n = r.call(t))) return n; + if ("function" == typeof(r = t.valueOf) && !p(n = r.call(t))) return n; + if (!e && "function" == typeof(r = t.toString) && !p(n = r.call(t))) return n; + throw TypeError("Can't convert object to primitive value") + }, + O = Object.defineProperty, + S = { + f: v ? Object.defineProperty : function(t, e, r) { + if (d(t), e = w(e, !0), d(r), g) try { + return O(t, e, r) + } catch (t) {} + if ("get" in r || "set" in r) throw TypeError("Accessors not supported!"); + return "value" in r && (t[e] = r.value), t + } + }, + E = function(t, e) { + return { + enumerable: !(1 & t), + configurable: !(2 & t), + writable: !(4 & t), + value: e + } + }, + A = v ? function(t, e, r) { + return S.f(t, e, E(1, r)) + } : function(t, e, r) { + return t[e] = r, t + }, + j = {}.hasOwnProperty, + P = function(t, e) { + return j.call(t, e) + }, + T = 0, + k = Math.random(), + x = function(t) { + return "Symbol(".concat(void 0 === t ? "" : t, ")_", (++T + k).toString(36)) + }, + F = e(function(t) { + var e = x("src"), + r = Function.toString, + n = ("" + r).split("toString"); + l.inspectSource = function(t) { + return r.call(t) + }, (t.exports = function(t, r, o, i) { + var s = "function" == typeof o; + s && (P(o, "name") || A(o, "name", r)), t[r] !== o && (s && (P(o, e) || A(o, e, t[r] ? "" + t[r] : n.join(String(r)))), t === h ? t[r] = o : i ? t[r] ? t[r] = o : A(t, r, o) : (delete t[r], A(t, r, o))) + })(Function.prototype, "toString", function() { + return "function" == typeof this && this[e] || r.call(this) + }) + }), + L = function(t, e, r) { + if (function(t) { + if ("function" != typeof t) throw TypeError(t + " is not a function!") + }(t), void 0 === e) return t; + switch (r) { + case 1: + return function(r) { + return t.call(e, r) + }; + case 2: + return function(r, n) { + return t.call(e, r, n) + }; + case 3: + return function(r, n, o) { + return t.call(e, r, n, o) + } + } + return function() { + return t.apply(e, arguments) + } + }, + N = function(t, e, r) { + var n, o, i, s, a = t & N.F, + u = t & N.G, + c = t & N.S, + f = t & N.P, + p = t & N.B, + d = u ? h : c ? h[e] || (h[e] = {}) : (h[e] || {}).prototype, + y = u ? l : l[e] || (l[e] = {}), + v = y.prototype || (y.prototype = {}); + for (n in u && (r = e), r) i = ((o = !a && d && void 0 !== d[n]) ? d : r)[n], s = p && o ? L(i, h) : f && "function" == typeof i ? L(Function.call, i) : i, d && F(d, n, i, t & N.U), y[n] != i && A(y, n, s), f && v[n] != i && (v[n] = i) + }; + h.core = l, N.F = 1, N.G = 2, N.S = 4, N.P = 8, N.B = 16, N.W = 32, N.U = 64, N.R = 128; + var D = N, + I = {}.toString, + R = function(t) { + return I.call(t).slice(8, -1) + }, + B = Object("z").propertyIsEnumerable(0) ? Object : function(t) { + return "String" == R(t) ? t.split("") : Object(t) + }, + C = function(t) { + if (void 0 == t) throw TypeError("Can't call method on " + t); + return t + }, + U = function(t) { + return Object(C(t)) + }, + M = Math.ceil, + z = Math.floor, + G = function(t) { + return isNaN(t = +t) ? 0 : (t > 0 ? z : M)(t) + }, + W = Math.min, + H = function(t) { + return t > 0 ? W(G(t), 9007199254740991) : 0 + }, + V = Array.isArray || function(t) { + return "Array" == R(t) + }, + q = h["__core-js_shared__"] || (h["__core-js_shared__"] = {}), + K = function(t) { + return q[t] || (q[t] = {}) + }, + $ = e(function(t) { + var e = K("wks"), + r = h.Symbol, + n = "function" == typeof r; + (t.exports = function(t) { + return e[t] || (e[t] = n && r[t] || (n ? r : x)("Symbol." + t)) + }).store = e + }), + J = $("species"), + Y = function(t, e) { + return new(function(t) { + var e; + return V(t) && ("function" != typeof(e = t.constructor) || e !== Array && !V(e.prototype) || (e = void 0), p(e) && null === (e = e[J]) && (e = void 0)), void 0 === e ? Array : e + }(t))(e) + }, + X = function(t, e) { + var r = 1 == t, + n = 2 == t, + o = 3 == t, + i = 4 == t, + s = 6 == t, + a = 5 == t || s, + u = e || Y; + return function(e, c, f) { + for (var h, l, p = U(e), d = B(p), y = L(c, f, 3), v = H(d.length), b = 0, m = r ? u(e, v) : n ? u(e, 0) : void 0; v > b; b++) + if ((a || b in d) && (l = y(h = d[b], b, p), t)) + if (r) m[b] = l; + else if (l) switch (t) { + case 3: + return !0; + case 5: + return h; + case 6: + return b; + case 2: + m.push(h) + } else if (i) return !1; + return s ? -1 : o || i ? i : m + } + }, + Q = $("unscopables"), + Z = Array.prototype; + void 0 == Z[Q] && A(Z, Q, {}); + var tt = function(t) { + Z[Q][t] = !0 + }, + et = X(5), + rt = !0; + "find" in [] && Array(1).find(function() { + rt = !1 + }), D(D.P + D.F * rt, "Array", { + find: function(t) { + return et(this, t, arguments.length > 1 ? arguments[1] : void 0) + } + }), tt("find"); + l.Array.find; + var nt = X(6), + ot = !0; + "findIndex" in [] && Array(1).findIndex(function() { + ot = !1 + }), D(D.P + D.F * ot, "Array", { + findIndex: function(t) { + return nt(this, t, arguments.length > 1 ? arguments[1] : void 0) + } + }), tt("findIndex"); + l.Array.findIndex; + var it, st = function(t) { + return B(C(t)) + }, + at = Math.max, + ut = Math.min, + ct = K("keys"), + ft = function(t) { + return ct[t] || (ct[t] = x(t)) + }, + ht = (it = !1, function(t, e, r) { + var n, o = st(t), + i = H(o.length), + s = function(t, e) { + return (t = G(t)) < 0 ? at(t + e, 0) : ut(t, e) + }(r, i); + if (it && e != e) { + for (; i > s;) + if ((n = o[s++]) != n) return !0 + } else + for (; i > s; s++) + if ((it || s in o) && o[s] === e) return it || s || 0; return !it && -1 + }), + lt = ft("IE_PROTO"), + pt = function(t, e) { + var r, n = st(t), + o = 0, + i = []; + for (r in n) r != lt && P(n, r) && i.push(r); + for (; e.length > o;) P(n, r = e[o++]) && (~ht(i, r) || i.push(r)); + return i + }, + dt = "constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","), + yt = Object.keys || function(t) { + return pt(t, dt) + }, + vt = { + f: Object.getOwnPropertySymbols + }, + bt = { + f: {}.propertyIsEnumerable + }, + mt = Object.assign, + _t = !mt || y(function() { + var t = {}, + e = {}, + r = Symbol(), + n = "abcdefghijklmnopqrst"; + return t[r] = 7, n.split("").forEach(function(t) { + e[t] = t + }), 7 != mt({}, t)[r] || Object.keys(mt({}, e)).join("") != n + }) ? function(t, e) { + for (var r = U(t), n = arguments.length, o = 1, i = vt.f, s = bt.f; n > o;) + for (var a, u = B(arguments[o++]), c = i ? yt(u).concat(i(u)) : yt(u), f = c.length, h = 0; f > h;) s.call(u, a = c[h++]) && (r[a] = u[a]); + return r + } : mt; + D(D.S + D.F, "Object", { + assign: _t + }); + l.Object.assign; + var gt = $("match"), + wt = function(t, e, r) { + if (p(n = e) && (void 0 !== (o = n[gt]) ? o : "RegExp" == R(n))) throw TypeError("String#" + r + " doesn't accept regex!"); + var n, o; + return String(C(t)) + }, + Ot = $("match"), + St = "".startsWith; + D(D.P + D.F * function(t) { + var e = /./; + try { + "/./" [t](e) + } catch (r) { + try { + return e[Ot] = !1, !"/./" [t](e) + } catch (t) {} + } + return !0 + }("startsWith"), "String", { + startsWith: function(t) { + var e = wt(this, t, "startsWith"), + r = H(Math.min(arguments.length > 1 ? arguments[1] : void 0, e.length)), + n = String(t); + return St ? St.call(e, n, r) : e.slice(r, r + n.length) === n + } + }); + l.String.startsWith; + D(D.P, "String", { + repeat: function(t) { + var e = String(C(this)), + r = "", + n = G(t); + if (n < 0 || n == 1 / 0) throw RangeError("Count can't be negative"); + for (; n > 0; + (n >>>= 1) && (e += e)) 1 & n && (r += e); + return r + } + }); + l.String.repeat; + var Et = e(function(t) { + var e = x("meta"), + r = S.f, + n = 0, + o = Object.isExtensible || function() { + return !0 + }, + i = !y(function() { + return o(Object.preventExtensions({})) + }), + s = function(t) { + r(t, e, { + value: { + i: "O" + ++n, + w: {} + } + }) + }, + a = t.exports = { + KEY: e, + NEED: !1, + fastKey: function(t, r) { + if (!p(t)) return "symbol" == typeof t ? t : ("string" == typeof t ? "S" : "P") + t; + if (!P(t, e)) { + if (!o(t)) return "F"; + if (!r) return "E"; + s(t) + } + return t[e].i + }, + getWeak: function(t, r) { + if (!P(t, e)) { + if (!o(t)) return !0; + if (!r) return !1; + s(t) + } + return t[e].w + }, + onFreeze: function(t) { + return i && a.NEED && o(t) && !P(t, e) && s(t), t + } + } + }), + At = (Et.KEY, Et.NEED, Et.fastKey, Et.getWeak, Et.onFreeze, S.f), + jt = $("toStringTag"), + Pt = function(t, e, r) { + t && !P(t = r ? t : t.prototype, jt) && At(t, jt, { + configurable: !0, + value: e + }) + }, + Tt = { + f: $ + }, + kt = S.f, + xt = function(t) { + var e = l.Symbol || (l.Symbol = h.Symbol || {}); + "_" == t.charAt(0) || t in e || kt(e, t, { + value: Tt.f(t) + }) + }, + Ft = v ? Object.defineProperties : function(t, e) { + d(t); + for (var r, n = yt(e), o = n.length, i = 0; o > i;) S.f(t, r = n[i++], e[r]); + return t + }, + Lt = h.document, + Nt = Lt && Lt.documentElement, + Dt = ft("IE_PROTO"), + It = function() {}, + Rt = function() { + var t, e = _("iframe"), + r = dt.length; + for (e.style.display = "none", Nt.appendChild(e), e.src = "javascript:", (t = e.contentWindow.document).open(), t.write(" + + + + + diff --git a/editor/src/firebase.js b/editor/src/firebase.js new file mode 100644 index 0000000..58e1fb8 --- /dev/null +++ b/editor/src/firebase.js @@ -0,0 +1,9 @@ +var config = { + apiKey: "AIzaSyBbtupCAPzGPHyAXQ_blEn5ooNVJFKwZqU", + authDomain: "splash-clouddata.firebaseapp.com", + databaseURL: "https://splash-clouddata.firebaseio.com", + projectId: "splash-clouddata", + storageBucket: "splash-clouddata.appspot.com", + messagingSenderId: "761544928567" +}; +firebase.initializeApp(config); diff --git a/github/index.html b/github/index.html new file mode 100644 index 0000000..bdf2bab --- /dev/null +++ b/github/index.html @@ -0,0 +1,14 @@ + + + + + Redirecting... + + + + +

    Redirecting...

    + Click here if you are not redirected. + + + diff --git a/index.html b/index.html index a5ef486..a88595d 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ Splash - a Snap! mod - + @@ -10,8 +10,9 @@ @@ -19,12 +20,12 @@

    Splash

    - splash image + splash image

    What is Splash?

    Splash is a mod for Snap! - Currently I have added
    + Currently I have


    @@ -58,7 +59,15 @@

    What is Splash?

    Cloud Variable Limitations

    - As in scratch, I will not allow arbitrary types in cloud variables. I don't want my server to need to be able to store and sprites that only make any sense in one specific client. I will support booleans, and convert all other types to strings, to avoid compatibility problems between big numbers like 1+2i and users without bignums enabled. Lists, dicts and sprites will not be supported because they are not atomic, and rings because I don't have a format for them on the server. There will be no character limit, meaning that you may encode your data. + As in scratch, I will not allow arbitrary types in cloud variables. I don't want my server to need to be able to store sprites that only make any sense in one specific client. + I will convert numbers to strings, and support + + There will also be a limit of 1MB, and 20 000 dictionary pairs, per variable due to the use of firebase for the variables.