in src/state.ts [170:239]
static deserializeState(): State {
let map: {[key: string]: string} = {};
for (let keyvalue of window.location.hash.slice(1).split("&")) {
let [name, value] = keyvalue.split("=");
map[name] = value;
}
let state = new State();
function hasKey(name: string): boolean {
return name in map && map[name] != null && map[name].trim() !== "";
}
function parseArray(value: string): string[] {
return value.trim() === "" ? [] : value.split(",");
}
// Deserialize regular properties.
State.PROPS.forEach(({name, type, keyMap}) => {
switch (type) {
case Type.OBJECT:
if (keyMap == null) {
throw Error("A key-value map must be provided for state " +
"variables of type Object");
}
if (hasKey(name) && map[name] in keyMap) {
state[name] = keyMap[map[name]];
}
break;
case Type.NUMBER:
if (hasKey(name)) {
// The + operator is for converting a string to a number.
state[name] = +map[name];
}
break;
case Type.STRING:
if (hasKey(name)) {
state[name] = map[name];
}
break;
case Type.BOOLEAN:
if (hasKey(name)) {
state[name] = (map[name] === "false" ? false : true);
}
break;
case Type.ARRAY_NUMBER:
if (name in map) {
state[name] = parseArray(map[name]).map(Number);
}
break;
case Type.ARRAY_STRING:
if (name in map) {
state[name] = parseArray(map[name]);
}
break;
default:
throw Error("Encountered an unknown type for a state variable");
}
});
// Deserialize state properties that correspond to hiding UI controls.
getHideProps(map).forEach(prop => {
state[prop] = (map[prop] === "true") ? true : false;
});
state.numHiddenLayers = state.networkShape.length;
if (state.seed == null) {
state.seed = Math.random().toFixed(5);
}
Math.seedrandom(state.seed);
return state;
}