Parser con schemas

by J. Jones

HTML

<script src="http://cdnjs.cloudflare.com/ajax/libs/mathjs/1.6.0/math.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-debug.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js"></script>
<script src="https://raw.githubusercontent.com/broofa/node-uuid/master/uuid.js"></script>
<div id='output'></div>

JavaScript

var log = function (msg) {
    $("#output").append(msg + "<br/>");

}


/* Función que inicializa el parser con el scope del pojo actual */
var setParser = function (parser, pojo) {
    for (var x in pojo) {
        parser.set(x, pojo[x]);
    }
}

/* función que traer una instancia nueva del nodo actual */
var getParser = function (node) {
    var parser = math.parser();

    parser.set('get', function (prop) {
        // Arrreglar esto para los nodos
        var retValue = prop;
        if (_.isFunction(retValue)) {
            retValue = retValue();
        }

        return retValue;
    });



    parser.set('avg', function (prop) {
        var l = prop.length;
        return math.sum(prop) / l;
    });




    parser.set('getValueFromParent', function (parent, prop) {

        if (_.isFunction(parent)) {
            parent = parent();
        }

        // Arrreglar esto para los nodos
        if (_.isFunction(parent[prop])) {
            return parent[prop]();
        }

        return parent[prop];
    });


    parser.set('map', function (items, proyeccion, filter) {

        if (_.isFunction(items)) {
            //para kockout
            items = items();
        }

        if (filter != undefined && filter != '') {
            log("filtrando");
            items = _.filter(items, function (ci) {

                return math.eval(filter, ci);
            }, this);
            log("array filtrado " + items.length);
        };
        log("proyectando");
        items = _.map(items, function (ci) {
            var item = math.eval(proyeccion, ci);
            if (_.isFunction(item)) {
                item = item();
            }
            return item;
        }, this);

        log("regresando array");
        return items;
    });



    parser.set('desvest', function (prop) {
        var avgfunction = parser.get("avg");
        var avg = avgfunction(prop);
        
        var items= _.map(prop, function(ci){
            return math.pow((ci-avg),2);
...