Initial support for parsing old URLs
This commit is contained in:
parent
4f6693091c
commit
106ff7cd40
|
@ -23,6 +23,7 @@
|
|||
"jquery": "^3.1.0",
|
||||
"bootstrap": "^3.3.7",
|
||||
"selectize": "^0.12.2",
|
||||
"eventEmitter": "^5.1.0"
|
||||
"eventEmitter": "^5.1.0",
|
||||
"lz-string": "^1.4.4"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,2 +1,6 @@
|
|||
http://localhost:10240/#%7B%22version%22%3A2%2C%22source%22%3A%22%23include%20%3Cxmmintrin.h%3E%5Cn%5Cnvoid%20f(__m128%20a%2C%20__m128%20b)%5Cn%7B%5Cn%20%20%2F%2F%20I%20am%20a%20walrus.%5Cn%7D%22%2C%22compiler%22%3A%22%2Fhome%2Fmgodbolt%2Fapps%2Fintel-icc-oss%2Fbin%2Ficc%22%2C%22options%22%3A%22-O3%20-std%3Dc%2B%2B0x%22%2C%22filterAsm%22%3A%7B%22labels%22%3Atrue%2C%22directives%22%3Atrue%7D%7D
|
||||
http://lud-ldnmg01:10240/#%7B%22version%22%3A2%2C%22source%22%3A%22%23include%20%3Cxmmintrin.h%3E%5Cn%5Cnvoid%20f(__m128%20a%2C%20__m128%20b)%5Cn%7B%5Cn%20%20%2F%2F%20I%20am%20a%20walrus.%5Cn%7D%22%2C%22compiler%22%3A%22%2Fhome%2Fmgodbolt%2Fapps%2Fintel-icc-oss%2Fbin%2Ficc%22%2C%22options%22%3A%22-O3%20-std%3Dc%2B%2B0x%22%2C%22filterAsm%22%3A%7B%22labels%22%3Atrue%2C%22directives%22%3Atrue%7D%7D
|
||||
-- should be icc, "-O3 -std=c++0x", all filters but comments
|
||||
http://lud-ldnmg01:10240/#compilers:!((compiler:g7snapshot,options:'-std%3Dc%2B%2B1z+-O3+',source:'%23include+%3Cvector%3E%0A%0Astruct+Widget+%7B%0A++int+n%3B%0A++double+x,+y%3B%0A++Widget(const+Widget%26+o)+:+x(o.x),+y(o.y),+n(o.n)+%7B%7D%0A++Widget(int+n,+double+x,+double+y)+:+n(n),+x(x),+y(y)+%7B%7D%0A%7D%3B%0A%0Astd::vector%3CWidget%3E+vector%3B%0Aconst+int+N+%3D+1002%3B%0Adouble+a+%3D+0.1%3B%0Adouble+b+%3D+0.2%3B%0A%0Avoid+demo()+%7B%0A++vector.reserve(N)%3B%0A++for+(int+i+%3D+01%3B+i+%3C+N%3B+%2B%2Bi)%0A++%7B%0A%09Widget+w+%7Bi,+a,+b%7D%3B%0A%09vector.push_back(w)%3B+//+or+vector.push_back(std::move(w))%0A++%7D%0A%7D%0A%0Aint+main()%0A%7B%0A+%0A+%0A%7D%0A')),filterAsm:(colouriseAsm:!t,commentOnly:!t,directives:!t,intel:!t,labels:!t),version:3
|
||||
-- should be GCC 7, with widgets source. Binary mode off, all other labels on. -std=c++1z -O3
|
||||
http://lud-ldnmg01:10240/#compilers:!((compiler:g474,options:'',sourcez:PQKgBALgpgzhYHsBmYDGCC2AHATrGAlggHYB0pamGUx8AFlHmEgjmADY0DmEdAXACgAhiNFjxEyVOkzZw2QsVLl85WvVrVG7TolbdB7fsMmlx0xennLNsddu37Dy0%2BenXbwx8%2B7vPo/7OfoGaIMACAgS0YBhCUQAUUfBCOFyoADSUxHBodClgICApXABuAJRgAN4CYGB4EACuOMRgAIwATADcAgC%2BQAA)),filterAsm:(binary:!t,colouriseAsm:!t,commentOnly:!t,directives:!t,intel:!t,labels:!t),version:3
|
||||
-- should be 4.7.4, no options, binary, intel, colourise.
|
||||
|
|
|
@ -113,7 +113,7 @@ define(function (require) {
|
|||
|
||||
// Gets the filters that will actually be used (accounting for issues with binary
|
||||
// mode etc).
|
||||
Compiler.prototype.getEffectiveFilters = function() {
|
||||
Compiler.prototype.getEffectiveFilters = function () {
|
||||
if (!this.compiler) return {};
|
||||
var filters = this.filters.get();
|
||||
if (filters.binary && !this.compiler.supportsBinary) {
|
||||
|
@ -330,6 +330,18 @@ define(function (require) {
|
|||
componentName: 'compilerOutput',
|
||||
componentState: {source: editorId}
|
||||
};
|
||||
},
|
||||
getComponentWith: function (editorId, filters, options, compilerId) {
|
||||
return {
|
||||
type: 'component',
|
||||
componentName: 'compilerOutput',
|
||||
componentState: {
|
||||
source: editorId,
|
||||
filters: filters,
|
||||
options: options,
|
||||
compiler: compilerId
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
});
|
|
@ -78,8 +78,8 @@ define(function (require) {
|
|||
mode: cmMode
|
||||
});
|
||||
|
||||
if (state.src) {
|
||||
this.editor.setValue(state.src);
|
||||
if (state.source) {
|
||||
this.editor.setValue(state.source);
|
||||
} else if (defaultSrc) {
|
||||
this.editor.setValue(defaultSrc);
|
||||
}
|
||||
|
@ -166,7 +166,7 @@ define(function (require) {
|
|||
Editor.prototype.updateState = function () {
|
||||
this.container.setState({
|
||||
id: this.id,
|
||||
src: this.getSource(),
|
||||
source: this.getSource(),
|
||||
options: this.options.get()
|
||||
});
|
||||
};
|
||||
|
@ -285,6 +285,14 @@ define(function (require) {
|
|||
componentState: {id: id},
|
||||
isClosable: false
|
||||
};
|
||||
},
|
||||
getComponentWith: function (id, source, options) {
|
||||
return {
|
||||
type: 'component',
|
||||
componentName: 'codeEditor',
|
||||
componentState: {id: id, source: source, options: options},
|
||||
isClosable: false
|
||||
};
|
||||
}
|
||||
};
|
||||
});
|
|
@ -12,9 +12,7 @@
|
|||
<link href="ext/selectize/dist/css/selectize.bootstrap2.css" rel="stylesheet">
|
||||
<link href="explorer.css" rel="stylesheet">
|
||||
<script data-main="main" src="ext/requirejs/require.js"></script>
|
||||
<!--<script src="ext/rison.js"></script>-->
|
||||
<!--<script src="ext/clipboard.min.js"></script>x-->
|
||||
<!--<script src="ext/lz-string/lz-string-1.3.3-min.js"></script>-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="navbar navbar-inverse">
|
||||
|
|
|
@ -32,7 +32,8 @@ require.config({
|
|||
selectize: 'ext/selectize/dist/js/selectize.min',
|
||||
sifter: 'ext/sifter/sifter.min',
|
||||
microplugin: 'ext/microplugin/src/microplugin',
|
||||
events: 'ext/eventEmitter/EventEmitter'
|
||||
events: 'ext/eventEmitter/EventEmitter',
|
||||
lzstring: 'ext/lz-string/libs/lz-string'
|
||||
},
|
||||
packages: [{
|
||||
name: "codemirror",
|
||||
|
@ -54,6 +55,7 @@ define(function (require) {
|
|||
var GoldenLayout = require('goldenlayout');
|
||||
var compiler = require('compiler');
|
||||
var editor = require('editor');
|
||||
var url = require('url');
|
||||
var Hub = require('hub');
|
||||
|
||||
analytics.initialise();
|
||||
|
@ -68,9 +70,16 @@ define(function (require) {
|
|||
content: [{type: 'row', content: [editor.getComponent(1), compiler.getComponent(1)]}]
|
||||
};
|
||||
var root = $("#root");
|
||||
// TODO: find old storage and convert
|
||||
var savedState = localStorage.getItem('gl');
|
||||
var config = savedState !== null ? JSON.parse(savedState) : defaultConfig;
|
||||
var config = url.deserialiseState(window.location.hash.substr(1));
|
||||
$(window).bind('hashchange', function () {
|
||||
window.location.reload(); // punt on hash events and just reload the page
|
||||
});
|
||||
|
||||
if (!config) {
|
||||
// TODO: find old storage and convert
|
||||
var savedState = localStorage.getItem('gl');
|
||||
config = savedState !== null ? JSON.parse(savedState) : defaultConfig;
|
||||
}
|
||||
|
||||
var layout = new GoldenLayout(config, root);
|
||||
layout.on('stateChanged', function () {
|
||||
|
|
|
@ -0,0 +1,520 @@
|
|||
// Taken from https://github.com/Nanonid/rison at 917679fb6cafa15e2a186cd5a47163792899b321
|
||||
|
||||
// Uses CommonJS, AMD or browser globals to create a module.
|
||||
// Based on: https://github.com/umdjs/umd/blob/master/commonjsStrict.js
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(['exports'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
// CommonJS
|
||||
factory(exports);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory((root.rison = {}));
|
||||
}
|
||||
}(this, function (exports) {
|
||||
var rison = exports;
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
//
|
||||
// the stringifier is based on
|
||||
// http://json.org/json.js as of 2006-04-28 from json.org
|
||||
// the parser is based on
|
||||
// http://osteele.com/sources/openlaszlo/json
|
||||
//
|
||||
|
||||
if (typeof rison == 'undefined')
|
||||
window.rison = {};
|
||||
|
||||
/**
|
||||
* rules for an uri encoder that is more tolerant than encodeURIComponent
|
||||
*
|
||||
* encodeURIComponent passes ~!*()-_.'
|
||||
*
|
||||
* we also allow ,:@$/
|
||||
*
|
||||
*/
|
||||
rison.uri_ok = { // ok in url paths and in form query args
|
||||
'~': true, '!': true, '*': true, '(': true, ')': true,
|
||||
'-': true, '_': true, '.': true, ',': true,
|
||||
':': true, '@': true, '$': true,
|
||||
"'": true, '/': true
|
||||
};
|
||||
|
||||
/*
|
||||
* we divide the uri-safe glyphs into three sets
|
||||
* <rison> - used by rison ' ! : ( ) ,
|
||||
* <reserved> - not common in strings, reserved * @ $ & ; =
|
||||
*
|
||||
* we define <identifier> as anything that's not forbidden
|
||||
*/
|
||||
|
||||
/**
|
||||
* punctuation characters that are legal inside ids.
|
||||
*/
|
||||
// this var isn't actually used
|
||||
//rison.idchar_punctuation = "_-./~";
|
||||
|
||||
(function () {
|
||||
var l = [];
|
||||
for (var hi = 0; hi < 16; hi++) {
|
||||
for (var lo = 0; lo < 16; lo++) {
|
||||
if (hi+lo == 0) continue;
|
||||
var c = String.fromCharCode(hi*16 + lo);
|
||||
if (! /\w|[-_.\/~]/.test(c))
|
||||
l.push('\\u00' + hi.toString(16) + lo.toString(16));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* characters that are illegal inside ids.
|
||||
* <rison> and <reserved> classes are illegal in ids.
|
||||
*
|
||||
*/
|
||||
rison.not_idchar = l.join('')
|
||||
//idcrx = new RegExp('[' + rison.not_idchar + ']');
|
||||
//console.log('NOT', (idcrx.test(' ')) );
|
||||
})();
|
||||
//rison.not_idchar = " \t\r\n\"<>[]{}'!=:(),*@$;&";
|
||||
rison.not_idchar = " '!:(),*@$";
|
||||
|
||||
|
||||
/**
|
||||
* characters that are illegal as the start of an id
|
||||
* this is so ids can't look like numbers.
|
||||
*/
|
||||
rison.not_idstart = "-0123456789";
|
||||
|
||||
|
||||
(function () {
|
||||
var idrx = '[^' + rison.not_idstart + rison.not_idchar +
|
||||
'][^' + rison.not_idchar + ']*';
|
||||
|
||||
rison.id_ok = new RegExp('^' + idrx + '$');
|
||||
|
||||
// regexp to find the end of an id when parsing
|
||||
// g flag on the regexp is necessary for iterative regexp.exec()
|
||||
rison.next_id = new RegExp(idrx, 'g');
|
||||
})();
|
||||
|
||||
/**
|
||||
* this is like encodeURIComponent() but quotes fewer characters.
|
||||
*
|
||||
* @see rison.uri_ok
|
||||
*
|
||||
* encodeURIComponent passes ~!*()-_.'
|
||||
* rison.quote also passes ,:@$/
|
||||
* and quotes " " as "+" instead of "%20"
|
||||
*/
|
||||
rison.quote = function(x) {
|
||||
if (/^[-A-Za-z0-9~!*()_.',:@$\/]*$/.test(x))
|
||||
return x;
|
||||
|
||||
return encodeURIComponent(x)
|
||||
.replace(/%2C/g, ',')
|
||||
.replace(/%3A/g, ':')
|
||||
.replace(/%40/g, '@')
|
||||
.replace(/%24/g, '$')
|
||||
.replace(/%2F/g, '/')
|
||||
.replace(/%20/g, '+');
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// based on json.js 2006-04-28 from json.org
|
||||
// license: http://www.json.org/license.html
|
||||
//
|
||||
// hacked by nix for use in uris.
|
||||
//
|
||||
|
||||
(function () {
|
||||
var sq = { // url-ok but quoted in strings
|
||||
"'": true, '!': true
|
||||
},
|
||||
enc = function (v) {
|
||||
if (v && typeof v.toJSON === 'function') v = v.toJSON();
|
||||
var fn = s[typeof v];
|
||||
if (fn) return fn(v);
|
||||
},
|
||||
s = {
|
||||
array: function (x) {
|
||||
var a = ['!('], b, f, i, l = x.length, v;
|
||||
for (i = 0; i < l; i += 1) {
|
||||
v = enc(x[i]);
|
||||
if (typeof v == 'string') {
|
||||
if (b) {
|
||||
a[a.length] = ',';
|
||||
}
|
||||
a[a.length] = v;
|
||||
b = true;
|
||||
}
|
||||
}
|
||||
a[a.length] = ')';
|
||||
return a.join('');
|
||||
},
|
||||
'boolean': function (x) {
|
||||
if (x)
|
||||
return '!t';
|
||||
return '!f'
|
||||
},
|
||||
'null': function (x) {
|
||||
return "!n";
|
||||
},
|
||||
number: function (x) {
|
||||
if (!isFinite(x))
|
||||
return '!n';
|
||||
// strip '+' out of exponent, '-' is ok though
|
||||
return String(x).replace(/\+/,'');
|
||||
},
|
||||
object: function (x) {
|
||||
if (x) {
|
||||
if (x instanceof Array) {
|
||||
return s.array(x);
|
||||
}
|
||||
// WILL: will this work on non-Firefox browsers?
|
||||
if (typeof x.__prototype__ === 'object' && typeof x.__prototype__.encode_rison !== 'undefined')
|
||||
return x.encode_rison();
|
||||
|
||||
var a = ['('], b, f, i, v, ki, ks=[];
|
||||
for (i in x)
|
||||
ks[ks.length] = i;
|
||||
ks.sort();
|
||||
for (ki = 0; ki < ks.length; ki++) {
|
||||
i = ks[ki];
|
||||
v = enc(x[i]);
|
||||
if (typeof v == 'string') {
|
||||
if (b) {
|
||||
a[a.length] = ',';
|
||||
}
|
||||
a.push(s.string(i), ':', v);
|
||||
b = true;
|
||||
}
|
||||
}
|
||||
a[a.length] = ')';
|
||||
return a.join('');
|
||||
}
|
||||
return '!n';
|
||||
},
|
||||
string: function (x) {
|
||||
if (x == '')
|
||||
return "''";
|
||||
|
||||
if (rison.id_ok.test(x))
|
||||
return x;
|
||||
|
||||
x = x.replace(/(['!])/g, function(a, b) {
|
||||
if (sq[b]) return '!'+b;
|
||||
return b;
|
||||
});
|
||||
return "'" + x + "'";
|
||||
},
|
||||
undefined: function (x) {
|
||||
// ignore undefined just like JSON
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* rison-encode a javascript structure
|
||||
*
|
||||
* implemementation based on Douglas Crockford's json.js:
|
||||
* http://json.org/json.js as of 2006-04-28 from json.org
|
||||
*
|
||||
*/
|
||||
rison.encode = function (v) {
|
||||
return enc(v);
|
||||
};
|
||||
|
||||
/**
|
||||
* rison-encode a javascript object without surrounding parens
|
||||
*
|
||||
*/
|
||||
rison.encode_object = function (v) {
|
||||
if (typeof v != 'object' || v === null || v instanceof Array)
|
||||
throw new Error("rison.encode_object expects an object argument");
|
||||
var r = s[typeof v](v);
|
||||
return r.substring(1, r.length-1);
|
||||
};
|
||||
|
||||
/**
|
||||
* rison-encode a javascript array without surrounding parens
|
||||
*
|
||||
*/
|
||||
rison.encode_array = function (v) {
|
||||
if (!(v instanceof Array))
|
||||
throw new Error("rison.encode_array expects an array argument");
|
||||
var r = s[typeof v](v);
|
||||
return r.substring(2, r.length-1);
|
||||
};
|
||||
|
||||
/**
|
||||
* rison-encode and uri-encode a javascript structure
|
||||
*
|
||||
*/
|
||||
rison.encode_uri = function (v) {
|
||||
return rison.quote(s[typeof v](v));
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
// based on openlaszlo-json and hacked by nix for use in uris.
|
||||
//
|
||||
// Author: Oliver Steele
|
||||
// Copyright: Copyright 2006 Oliver Steele. All rights reserved.
|
||||
// Homepage: http://osteele.com/sources/openlaszlo/json
|
||||
// License: MIT License.
|
||||
// Version: 1.0
|
||||
|
||||
|
||||
/**
|
||||
* parse a rison string into a javascript structure.
|
||||
*
|
||||
* this is the simplest decoder entry point.
|
||||
*
|
||||
* based on Oliver Steele's OpenLaszlo-JSON
|
||||
* http://osteele.com/sources/openlaszlo/json
|
||||
*/
|
||||
rison.decode = function(r) {
|
||||
var errcb = function(e) { throw Error('rison decoder error: ' + e); };
|
||||
var p = new rison.parser(errcb);
|
||||
return p.parse(r);
|
||||
};
|
||||
|
||||
/**
|
||||
* parse an o-rison string into a javascript structure.
|
||||
*
|
||||
* this simply adds parentheses around the string before parsing.
|
||||
*/
|
||||
rison.decode_object = function(r) {
|
||||
return rison.decode('('+r+')');
|
||||
};
|
||||
|
||||
/**
|
||||
* parse an a-rison string into a javascript structure.
|
||||
*
|
||||
* this simply adds array markup around the string before parsing.
|
||||
*/
|
||||
rison.decode_array = function(r) {
|
||||
return rison.decode('!('+r+')');
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* construct a new parser object for reuse.
|
||||
*
|
||||
* @constructor
|
||||
* @class A Rison parser class. You should probably
|
||||
* use rison.decode instead.
|
||||
* @see rison.decode
|
||||
*/
|
||||
rison.parser = function (errcb) {
|
||||
this.errorHandler = errcb;
|
||||
};
|
||||
|
||||
/**
|
||||
* a string containing acceptable whitespace characters.
|
||||
* by default the rison decoder tolerates no whitespace.
|
||||
* to accept whitespace set rison.parser.WHITESPACE = " \t\n\r\f";
|
||||
*/
|
||||
rison.parser.WHITESPACE = "";
|
||||
|
||||
// expose this as-is?
|
||||
rison.parser.prototype.setOptions = function (options) {
|
||||
if (options['errorHandler'])
|
||||
this.errorHandler = options.errorHandler;
|
||||
};
|
||||
|
||||
/**
|
||||
* parse a rison string into a javascript structure.
|
||||
*/
|
||||
rison.parser.prototype.parse = function (str) {
|
||||
this.string = str;
|
||||
this.index = 0;
|
||||
this.message = null;
|
||||
var value = this.readValue();
|
||||
if (!this.message && this.next())
|
||||
value = this.error("unable to parse string as rison: '" + rison.encode(str) + "'");
|
||||
if (this.message && this.errorHandler)
|
||||
this.errorHandler(this.message, this.index);
|
||||
return value;
|
||||
};
|
||||
|
||||
rison.parser.prototype.error = function (message) {
|
||||
if (typeof(console) != 'undefined')
|
||||
console.log('rison parser error: ', message);
|
||||
this.message = message;
|
||||
return undefined;
|
||||
}
|
||||
|
||||
rison.parser.prototype.readValue = function () {
|
||||
var c = this.next();
|
||||
var fn = c && this.table[c];
|
||||
|
||||
if (fn)
|
||||
return fn.apply(this);
|
||||
|
||||
// fell through table, parse as an id
|
||||
|
||||
var s = this.string;
|
||||
var i = this.index-1;
|
||||
|
||||
// Regexp.lastIndex may not work right in IE before 5.5?
|
||||
// g flag on the regexp is also necessary
|
||||
rison.next_id.lastIndex = i;
|
||||
var m = rison.next_id.exec(s);
|
||||
|
||||
// console.log('matched id', i, r.lastIndex);
|
||||
|
||||
if (m.length > 0) {
|
||||
var id = m[0];
|
||||
this.index = i+id.length;
|
||||
return id; // a string
|
||||
}
|
||||
|
||||
if (c) return this.error("invalid character: '" + c + "'");
|
||||
return this.error("empty expression");
|
||||
}
|
||||
|
||||
rison.parser.parse_array = function (parser) {
|
||||
var ar = [];
|
||||
var c;
|
||||
while ((c = parser.next()) != ')') {
|
||||
if (!c) return parser.error("unmatched '!('");
|
||||
if (ar.length) {
|
||||
if (c != ',')
|
||||
parser.error("missing ','");
|
||||
} else if (c == ',') {
|
||||
return parser.error("extra ','");
|
||||
} else
|
||||
--parser.index;
|
||||
var n = parser.readValue();
|
||||
if (typeof n == "undefined") return undefined;
|
||||
ar.push(n);
|
||||
}
|
||||
return ar;
|
||||
};
|
||||
|
||||
rison.parser.bangs = {
|
||||
t: true,
|
||||
f: false,
|
||||
n: null,
|
||||
'(': rison.parser.parse_array
|
||||
}
|
||||
|
||||
rison.parser.prototype.table = {
|
||||
'!': function () {
|
||||
var s = this.string;
|
||||
var c = s.charAt(this.index++);
|
||||
if (!c) return this.error('"!" at end of input');
|
||||
var x = rison.parser.bangs[c];
|
||||
if (typeof(x) == 'function') {
|
||||
return x.call(null, this);
|
||||
} else if (typeof(x) == 'undefined') {
|
||||
return this.error('unknown literal: "!' + c + '"');
|
||||
}
|
||||
return x;
|
||||
},
|
||||
'(': function () {
|
||||
var o = {};
|
||||
var c;
|
||||
var count = 0;
|
||||
while ((c = this.next()) != ')') {
|
||||
if (count) {
|
||||
if (c != ',')
|
||||
this.error("missing ','");
|
||||
} else if (c == ',') {
|
||||
return this.error("extra ','");
|
||||
} else
|
||||
--this.index;
|
||||
var k = this.readValue();
|
||||
if (typeof k == "undefined") return undefined;
|
||||
if (this.next() != ':') return this.error("missing ':'");
|
||||
var v = this.readValue();
|
||||
if (typeof v == "undefined") return undefined;
|
||||
o[k] = v;
|
||||
count++;
|
||||
}
|
||||
return o;
|
||||
},
|
||||
"'": function () {
|
||||
var s = this.string;
|
||||
var i = this.index;
|
||||
var start = i;
|
||||
var segments = [];
|
||||
var c;
|
||||
while ((c = s.charAt(i++)) != "'") {
|
||||
//if (i == s.length) return this.error('unmatched "\'"');
|
||||
if (!c) return this.error('unmatched "\'"');
|
||||
if (c == '!') {
|
||||
if (start < i-1)
|
||||
segments.push(s.slice(start, i-1));
|
||||
c = s.charAt(i++);
|
||||
if ("!'".indexOf(c) >= 0) {
|
||||
segments.push(c);
|
||||
} else {
|
||||
return this.error('invalid string escape: "!'+c+'"');
|
||||
}
|
||||
start = i;
|
||||
}
|
||||
}
|
||||
if (start < i-1)
|
||||
segments.push(s.slice(start, i-1));
|
||||
this.index = i;
|
||||
return segments.length == 1 ? segments[0] : segments.join('');
|
||||
},
|
||||
// Also any digit. The statement that follows this table
|
||||
// definition fills in the digits.
|
||||
'-': function () {
|
||||
var s = this.string;
|
||||
var i = this.index;
|
||||
var start = i-1;
|
||||
var state = 'int';
|
||||
var permittedSigns = '-';
|
||||
var transitions = {
|
||||
'int+.': 'frac',
|
||||
'int+e': 'exp',
|
||||
'frac+e': 'exp'
|
||||
};
|
||||
do {
|
||||
var c = s.charAt(i++);
|
||||
if (!c) break;
|
||||
if ('0' <= c && c <= '9') continue;
|
||||
if (permittedSigns.indexOf(c) >= 0) {
|
||||
permittedSigns = '';
|
||||
continue;
|
||||
}
|
||||
state = transitions[state+'+'+c.toLowerCase()];
|
||||
if (state == 'exp') permittedSigns = '-';
|
||||
} while (state);
|
||||
this.index = --i;
|
||||
s = s.slice(start, i)
|
||||
if (s == '-') return this.error("invalid number");
|
||||
return Number(s);
|
||||
}
|
||||
};
|
||||
// copy table['-'] to each of table[i] | i <- '0'..'9':
|
||||
(function (table) {
|
||||
for (var i = 0; i <= 9; i++)
|
||||
table[String(i)] = table['-'];
|
||||
})(rison.parser.prototype.table);
|
||||
|
||||
// return the next non-whitespace character, or undefined
|
||||
rison.parser.prototype.next = function () {
|
||||
var c;
|
||||
var s = this.string;
|
||||
var i = this.index;
|
||||
do {
|
||||
if (i == s.length) return undefined;
|
||||
c = s.charAt(i++);
|
||||
} while (rison.parser.WHITESPACE.indexOf(c) >= 0);
|
||||
this.index = i;
|
||||
return c;
|
||||
};
|
||||
|
||||
// End of UMD module wrapper
|
||||
}));
|
|
@ -0,0 +1,101 @@
|
|||
// Copyright (c) 2012-2016, Matt Godbolt
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
define(function (require) {
|
||||
"use strict";
|
||||
var rison = require('rison');
|
||||
var $ = require('jquery');
|
||||
var editor = require('editor');
|
||||
var compiler = require('compiler');
|
||||
var lzstring = require('lzstring');
|
||||
|
||||
function convertOldState(state) {
|
||||
var sc = state.compilers[0];
|
||||
if (!sc) return false;
|
||||
var content = [];
|
||||
var source;
|
||||
if (sc.sourcez) {
|
||||
source = lzstring.decompressFromBase64(sc.sourcez);
|
||||
} else {
|
||||
source = sc.source;
|
||||
}
|
||||
var options = {compileOnChange: true, colouriseAsm: state.filterAsm.colouriseAsm};
|
||||
var filters = _.clone(state.filterAsm);
|
||||
delete filters.colouriseAsm;
|
||||
content.push(editor.getComponentWith(1, source, options));
|
||||
content.push(compiler.getComponentWith(1, filters, sc.options, sc.compiler));
|
||||
return {version: 4, content: [{type: 'row', content: content}]};
|
||||
}
|
||||
|
||||
function loadState(state) {
|
||||
if (!state || state['version'] === undefined) return false;
|
||||
switch (state.version) {
|
||||
case 1:
|
||||
state.filterAsm = {};
|
||||
state.version = 2;
|
||||
/* falls through */
|
||||
case 2:
|
||||
state.compilers = [state];
|
||||
state.version = 3;
|
||||
/* falls through */
|
||||
case 3:
|
||||
state = convertOldState(state);
|
||||
break;
|
||||
case 4:
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
function deserialiseState(stateText) {
|
||||
var state;
|
||||
try {
|
||||
state = rison.decode_object(decodeURIComponent(stateText.replace(/\+/g, '%20')));
|
||||
} catch (ignored) {
|
||||
}
|
||||
|
||||
if (!state) {
|
||||
try {
|
||||
state = $.parseJSON(decodeURIComponent(stateText));
|
||||
} catch (ignored) {
|
||||
}
|
||||
}
|
||||
return loadState(state);
|
||||
}
|
||||
|
||||
function serialiseState(stateText) {
|
||||
// convert arrays to objects
|
||||
// filter out anything barring content from non-leaves
|
||||
// filter out anything barring type, componentName, componentState from leaves
|
||||
// compress the whole thing if savings made?
|
||||
}
|
||||
|
||||
return {
|
||||
deserialiseState: deserialiseState,
|
||||
serialiseState: serialiseState
|
||||
};
|
||||
});
|
Loading…
Reference in New Issue