| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | //jshint eqnull:truedefine(function () {    "use strict";    function inherits (child, parent) {        child.prototype = Object.create(parent.prototype, {            constructor: {                value: child,                enumerable: false, configurable: true, writable: true            }        });        return child;    }    function installMethodOfJsObject (obj, name, fn) {        Object.defineProperty(obj, name, {            value: fn,            enumerable: false, configurable: true, writable: true        });    }    function noop () {    }    function declareJsMethod (obj, name) {        if (obj[name] == null) installMethodOfJsObject(obj, name, noop);    }    var table = {        ':': '_',        '&': '_and',        '|': '_or',        '+': '_plus',        '-': '_minus',        '*': '_star',        '/': '_slash',        '\\': '_backslash',        '~': '_tild',        '%': '_percent',        '>': '_gt',        '<': '_lt',        '=': '_eq',        ',': '_comma',        '@': '_at'    };    /* Convert a Smalltalk selector into a JS selector */    function st2js (string) {        return '_' + string            .replace(/[:&|+\-*/\\~%><=,@]/g, function (ch) {                return table[ch];            });    };    function js2st (selector) {        if (selector.match(/^__/)) {            return binaryJsToSt(selector);        } else {            return keywordJsToSt(selector);        }    }    function keywordJsToSt (selector) {        return selector.replace(/^_/, '').replace(/_/g, ':');    }    function binaryJsToSt (selector) {        return selector            .replace(/^_/, '')            .replace(/_and/g, '&')            .replace(/_or/g, '|')            .replace(/_plus/g, '+')            .replace(/_minus/g, '-')            .replace(/_star/g, '*')            .replace(/_slash/g, '/')            .replace(/_backslash/g, '\\')            .replace(/_tild/g, '~')            .replace(/_percent/g, '%')            .replace(/_gt/g, '>')            .replace(/_lt/g, '<')            .replace(/_eq/g, '=')            .replace(/_comma/g, ',')            .replace(/_at/g, '@');    }    function addElement (array, el) {        if (typeof el === 'undefined') {            return;        }        if (array.indexOf(el) === -1) {            array.push(el);        }    }    function removeElement (array, el) {        var i = array.indexOf(el);        if (i !== -1) {            array.splice(i, 1);        }    }    function extend (target, source) {        Object.keys(source).forEach(function (key) {            target[key] = source[key];        });        return target;    }    function extendWithMethods (target, source) {        Object.keys(source).forEach(function (key) {            installMethodOfJsObject(target, key, source[key]);        });        return target;    }    function deleteKeysFrom (keys, obj) {        keys.forEach(function (each) {            delete obj[each];        });    }    return {        deleteKeysFrom: deleteKeysFrom,        extendWithMethods: extendWithMethods,        extend: extend,        removeElement: removeElement,        addElement: addElement,        js2st: js2st,        st2js: st2js,        declareJsMethod: declareJsMethod,        installMethodOfJsObject: installMethodOfJsObject,        inherits: inherits    }});
 |