JSFiddle - React, Tailwind, and code Playground

by vjeux

JavaScript

console.log(Parse('i:1'));
console.log(Parse('s:5:"vjeux"'));
console.log(Parse('a:1:{i:1;s:5:"vjeux";}'));
console.log(Parse('a:1:{i:0;a:6:{s:4:"type";s:29:"application/x-shockwave-flash";s:3:"src";s:68:"http://www.youtube.com/v/TnCFj3H8QBM?version=3&autohide=1&autoplay=1";s:5:"width";s:3:"480";s:6:"height";s:3:"360";s:1:"v";s:1:"0";s:4:"safe";s:1:"1";}}'));

function Parse(str) {

var i = 0;

function parseint() {
    var res = 0;
    for (; '0123456789'.indexOf(str[i]) !== -1; ++i) {
        res = res * 10 + parseInt(str[i], 10);
    }
    return res;
}

function assert(chr) {
    if (str[i] !== chr) {
        throw new Error('Invalid char `' + str[i] + '`, expected `' + chr + '`');
    }
    i++;
}

function parse() {
    // Integer
    if (str[i] === 'i') {
        assert('i');
        assert(':');
        return parseint();
        
    // String
    } else if (str[i] === 's') {
        assert('s');
        assert(':');
        var size = parseint();
        assert(':');
        assert('"');
        var res = str.substr(i, size);
        i += size;
        assert('"');
        return res;
    
    // Associative Array
    } else if (str[i] === 'a') {
        assert('a');
        assert(':');
        var size = parseint();
        assert(':');
        assert('{');
        var res = {};
        for (var j = 0; j < size; ++j) {
            var key = parse();
            assert(';');
            var value = parse();
            res[key] = value;
            if (str[i] === ';') {
                ++i;
            }
        }
        assert('}');
        return res;
    } else {
        throw new Error('Invalid char `' + str[i] + '`, expected `a`, `i` or `s`');
    }
}

return parse();
}