Interpreter - JavaScript Interactive Interpreter : InterpreterManager « Mochkit « JavaScript DHTML

JavaScript DHTML
1. Ajax Layer
2. Data Type
3. Date Time
4. Development
5. Document
6. Dojo toolkit
7. Event
8. Event onMethod
9. Ext JS
10. Form Control
11. GUI Components
12. HTML
13. Javascript Collections
14. Javascript Objects
15. Javascript Properties
16. jQuery
17. Language Basics
18. Mochkit
19. Mootools
20. Node Operation
21. Object Oriented
22. Page Components
23. Rico
24. Scriptaculous
25. Security
26. SmartClient
27. Style Layout
28. Table
29. Utilities
30. Window Browser
31. YUI Library
Java
Java Tutorial
Java Source Code / Java Documentation
Java Open Source
Jar File Download
Java Articles
Java Products
Java by API
Photoshop Tutorials
Maya Tutorials
Flash Tutorials
3ds-Max Tutorials
Illustrator Tutorials
GIMP Tutorials
C# / C Sharp
C# / CSharp Tutorial
C# / CSharp Open Source
ASP.Net
ASP.NET Tutorial
JavaScript Tutorial
JavaScript Reference
HTML / CSS
HTML CSS Reference
C / ANSI-C
C Tutorial
C++
C++ Tutorial
Ruby
PHP
Python
Python Tutorial
Python Open Source
SQL Server / T-SQL
SQL Server / T-SQL Tutorial
Oracle PL / SQL
Oracle PL/SQL Tutorial
PostgreSQL
SQL / MySQL
MySQL Tutorial
VB.Net
VB.Net Tutorial
Flash / Flex / ActionScript
VBA / Excel / Access / Word
XML
XML Tutorial
Microsoft Office PowerPoint 2007 Tutorial
Microsoft Office Excel 2007 Tutorial
Microsoft Office Word 2007 Tutorial
JavaScript DHTML » Mochkit » InterpreterManager 
Interpreter - JavaScript Interactive Interpreter
  
<!--
MochiKit is dual-licensed software.  It is available under the terms of the
MIT License, or the Academic Free License version 2.1.  The full text of
each license is included below.
-->

<!-- Code revised from MochiKit demo code -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <title>Interpreter - JavaScript Interactive Interpreter</title>
        <style type="text/css">
h1 {
    font-size: 2em;
    color: #4B4545;
    text-align: center;
}

textarea.textbox {
    font-family: Monaco, "lucida console", Courier;
    border: 1px solid #CCCCCC;
    font-size: .60em; 
    padding: 2px 4px;
    margin-top: .3em;
}

input.textbox {
    font-family: Monaco, "lucida console", Courier;
    border: 1px solid #CCCCCC;
    font-size: .60em; 
    padding: 2px 4px;
    margin-top: .3em;
}

#interpreter_area {
    display: block;
    border: 1px solid #CCCCCC;
    padding: 2px 4px;
    margin-top: .3em;
    width: 600px;
    height: 300px;
    overflow: auto;
}

#interpreter_output {
    display: inline;
    font-family: Monaco, "lucida console", Courier;
    font-size: .60em;
}

#interpreter_output span {
    white-space: -moz-pre-wrap; /* Mozilla */
    white-space: -o-pre-wrap; /* Opera 7 */
    white-space: pre-wrap; /* CSS 2.1 */
    white-space: pre-line; /* CSS 3 (and 2.1 as well, actually) */
    word-wrap: break-word; /* IE */
    wrap-option: emergency; /* CSS 3 */
}

input.textbox:focus background-color: #FFFEE3; }

.code color: blue; }
.data color: black; }
.error color: red; }
.banner color: green; }
.invisible display: none; }
        
        </style>
        <script type="text/javascript" src="MochiKit-1.4.2/lib/MochiKit/MochiKit.js"></script>
        <script type="text/javascript">
/*

    Interpreter: JavaScript Interactive Interpreter

*/
InterpreterManager = function () {
    bindMethods(this);
};

InterpreterManager.prototype.initialize = function () {
    connect("interpreter_text""onkeyup"this.keyUp);
    connect("interpreter_textarea""onkeydown"this.areaKeyDown);
    connect("interpreter_form""onsubmit"this.submit);
    getElement("interpreter_text").focus();

    this.banner();
    this.lines = [];
    this.history = [];
    this.currentHistory = "";
    this.historyPos = -1;
    this.blockingOn = null;
    if (typeof(this.doEval== "undefined") {
        // detect broken eval, warn at some point if a namespace ever gets used
        this.doEval = function () {
            return eval(arguments[0]);
        }
    }
    window.help = this.help;
    this.help.NAME = 'type help(funcfor help on a MochiKit function';
};

InterpreterManager.prototype.banner = function () {
    var _ua = window.navigator.userAgent;
    var ua = _ua.replace(/^Mozilla\/.*?\(.*?\)\s*/, "");
    if (ua == "") {
        // MSIE
        ua = _ua.replace(/^Mozilla\/4\.0 \(compatible; MS(IE .*?);.*$/, "$1");
    }
    appendChildNodes("interpreter_output",
        SPAN({"class""banner"},
            "MochiKit v" + MochiKit.Base.VERSION + " [" + ua + "]",
            BR(),
            "Type your expression in the input box below and press return, or see the notes below for more information.",
            BR()
        ),
        BR()
    );
};

InterpreterManager.prototype.submit = function (event) {
    if (this.blockingOn) {
        try {
            this.blockingOn.cancel();
        catch (e) {
            this.showError(e);
        }
        this.blockingOn = null;
    }
    this.doSubmit();
    this.doScroll();
    event.stop();
};

InterpreterManager.prototype.help = function (fn) {
    if (fn && fn.NAME) {
        fn = fn.NAME;
    }
    if (typeof(fn!= "string" || fn.length == 0) {
        writeln("help(func) on any MochiKit function for help");
        return;
    }
    var comps = fn.split('.');
    var base = comps.splice(02);
    var shortfn = comps.join('.');
    var url = '../../doc/html/' + base.join('/''.html';
    var d = doXHR(url, {mimeType: 'text/xml'});
    d.addCallback(function (req) {
        var els = getElementsByTagAndClassName(
            'a''mochidef', req.responseXML);
        var match = '#fn-' + shortfn.toLowerCase();
        for (var i = 0; i < els.length; i++) {
            var elem = els[i];
            var href = elem.href;
            var idx = href.indexOf('#');
            if (idx != -&& href.substring(idx== match) {
                writeln(A({href: url + match, target: '_blank'},
                    scrapeText(elem)));
                return;
            }
        }
        writeln('documentation for ' + fn + ' not found');
    });
    blockOn(d);
};


InterpreterManager.prototype.doScroll = function () {
    var p = getElement("interpreter_output").lastChild;
    if (typeof(p== "undefined" || p == null) {
        return;
    }
    var area = getElement("interpreter_area");
    if (area.offsetHeight > area.scrollHeight) {
        area.scrollTop = 0;
    else {
        area.scrollTop = area.scrollHeight;
    }
};

InterpreterManager.prototype.moveHistory = function (dir) {
    // totally bogus value
    if (dir == || this.history.length == 0) {
        return;
    }
    var elem = getElement("interpreter_text");
    if (this.historyPos == -1) {
        this.currentHistory = elem.value;
        if (dir > 0) {
            return;
        }
        this.historyPos = this.history.length - 1;
        elem.value = this.history[this.historyPos];
        return;
    }
    if (this.historyPos == && dir < 0) {
        return;
    }
    if (this.historyPos == this.history.length - && dir > 0) {
        this.historyPos = -1;
        elem.value = this.currentHistory;
        return;
    
    this.historyPos += dir;
    elem.value = this.history[this.historyPos];
}

InterpreterManager.prototype.runMultipleLines = function (text) {
    var lines = rstrip(text).replace("\r\n""\n").split(/\n/);
    appendChildNodes("interpreter_output",
        SPAN({"class""code"}">>> ", izip(lines, imap(BR, cycle([null]))))
    );
    this.runCode(text);
}

InterpreterManager.prototype.areaKeyDown = function (e) {
    var mod = e.modifier();
    var hasMod = mod.alt || mod.ctrl || mod.meta;
    if (e.key().string == 'KEY_ENTER' && hasMod) {
        var elem = getElement("interpreter_textarea");
        var text = elem.value;
        elem.value = "";
        this.runMultipleLines(text);
        e.stop();
    }
};

InterpreterManager.prototype.keyUp = function (e) {
    var key = e.key();
    // if any meta key is pressed, don't handle the signal
    if (e.modifier().any) {
        return;
    }
    switch (key.string) {
        case 'KEY_ARROW_UP': this.moveHistory(-1)break;
        case 'KEY_ARROW_DOWN': this.moveHistory(1)break;
        defaultreturn;
    }
    e.stop();
};

InterpreterManager.prototype.blockOn = function (d) {
    var node = SPAN({"class""banner"}"blocking on " + repr(d"...");
    this.blockingOn = d;
    appendChildNodes("interpreter_output", node);
    this.doScroll();
    d.addBoth(function (res) {
        swapDOM(node);
        this.blockingOn = null;
        if (res instanceof CancelledError) {
            window.writeln(SPAN({"class""error"}, repr(d" cancelled!"));
            return undefined;
        }
        return res;
    });
    d.addCallbacks(this.showResult, this.showError);
};

InterpreterManager.prototype.showError = function (e) {
    if (typeof(e!= "object") {
        e = new Error(e);
    }
    appendChildNodes("interpreter_output",
        SPAN({"class""error"}"Error:"),
        TABLE({"class""error"},
            THEAD({"class""invisible"}, TD({"colspan"2})),
            TFOOT({"class""invisible"}, TD({"colspan"2})),
            TBODY(null,
                map(function (kv) {
                    var v = kv[1];
                    if (typeof(v== "function") {
                        return;
                    }
                    if (typeof(v== "object") {
                        v = repr(v);
                    }
                    return TR(null,
                        TD({"class""error"}, kv[0]),
                        TD({"class""data"}, v)
                    );
                }, sorted(items(e)))
            )
        )
    );
    window.last_exc = e;
    this.doScroll();
};

EvalFunctions = {
    evalWith: function () {
        with (arguments[1|| window) { return eval(arguments[0])};
    },
    evalCall: function () {
        return eval.call(arguments[1|| window, arguments[0]);
    },
    choose: function () {
        var ns = {__test__: this};
        var e;
        try {
            if (this.evalWith("return __test__", ns=== this) { 
                return this.evalWith;
            }
        catch (e) {
            // pass
        }
        try {
            if (this.evalCall("return __test__", ns=== this) { 
                return this.evalCall;
            }
        catch (e) {
            // pass
        }
        return undefined;
    }
};
        
InterpreterManager.prototype.doEval = EvalFunctions.choose();

InterpreterManager.prototype.doSubmit = function () {
    var elem = getElement("interpreter_text");
    var code = elem.value;
    elem.value = "";
    var isContinuation = false;
    if (code.length >= && code.lastIndexOf("//"== code.length - 2) {
        isContinuation = true;
        code = code.substr(0, code.length - 2);
    }
    appendChildNodes("interpreter_output",
        SPAN({"class""code"}">>> ", code),
        BR()
    );
    this.lines.push(code);
    this.history.push(code);
    this.historyPos = -1;
    this.currentHistory = "";
    if (isContinuation) {
        return;
    }
    var allCode = this.lines.join("\n");
    this.lines = [];
    this.runCode(allCode);
    return;
};

InterpreterManager.prototype.runCode = function (allCode) {
    var res;
    try {
        res = this.doEval(allCode);
    catch (e) {
        // mozilla shows some keys more than once!
        this.showError(e);
        return;
    }
    this.showResult(res);
};

InterpreterManager.prototype.showResult = function (res) {
    if (typeof(res!= "undefined") {
        window._ = res;
    }
    if (typeof(res!= "undefined") {
        appendChildNodes("interpreter_output",
            SPAN({"class""data"}, repr(res)),
            BR()
        );
        this.doScroll();
    }
};

window.writeln = function () {
    appendChildNodes("interpreter_output",
        SPAN({"class""data"}, arguments),
        BR()
    );
    interpreterManager.doScroll();
};

window.clear = function () {
    replaceChildNodes("interpreter_output");
    getElement("interpreter_area").scrollTop = 0;
};

window.blockOn = function (d) {
    if (!(instanceof Deferred)) {
        throw new TypeError(repr(d" is not a Deferred!");
    }
    interpreterManager.blockOn(d);
};

window.dir = function (o) {
    // Python muscle memory!
    return sorted(keys(o));
};

window.inspect = function (o) {
    window._ = o;
    if ((typeof(o!= "function" && typeof(o!= "object"|| o == null) {
        window.writeln(repr(o));
        return;
    }
    var pairs = items(o);
    if (pairs.length == 0) {
        window.writeln(repr(o));
        return;
    }
    window.writeln(TABLE({"border""1"},
        THEAD({"class""invisible"}, TR(null, TD(), TD())),
        TFOOT({"class""invisible"}, TR(null, TD(), TD())),
        TBODY(null,
            map(
                function (kv) {
                    var click = function () {
                        try {
                            window.inspect(kv[1]);
                        catch (e) {
                            interpreterManager.showError(e);
                        }
                        return false;
                    }
                    return TR(null,
                        TD(null, A({href: "#", onclick: click}, kv[0])),
                        TD(null, repr(kv[1]))
                    );
                },
                pairs
            )
        )
    ));
};
    
interpreterManager = new InterpreterManager();
addLoadEvent(interpreterManager.initialize);

// rewrite the view-source links
addLoadEvent(function () {
    var elems = getElementsByTagAndClassName("A""view-source");
    var page = "interpreter/";
    for (var i = 0; i < elems.length; i++) {
        var elem = elems[i];
        var href = elem.href.split(/\//).pop();
        elem.target = "_blank";
        elem.href = "../view-source/view-source.html#" + page + href;
    }
});
        
        </script>
    </head>
    <body>
        <h1>
            Interpreter - JavaScript Interactive Interpreter
        </h1>
        <div>
            <p>
                This demo is a JavaScript interpreter.  Type some code into
                the text input and press enter to see the results.  It uses
                <a href="http://mochikit.com">MochiKit</a>'s
                <a href="../../doc/html/lib/MochiKit/DOM.html">MochiKit.DOM</a>
                to manipulate the display.  It also supports waiting for
                <a href="../../doc/html/lib/MochiKit/Async.html">MochiKit.Async</a>
                 Deferreds via <tt>blockOn(aDeferred)</tt>.
            </p>
        </div>

        <div>
            View Source: [
            <a href="index.html" class="view-source">index.html</a> |
            <a href="interpreter.js" class="view-source">interpreter.js</a>
            ]
        </div>
        <form id="interpreter_form" autocomplete="off">
            <div id="interpreter_area">
                <div id="interpreter_output"></div>
            </div>
            <div id="oneline">
                <input id="interpreter_text" name="input_text" type="text" class="textbox" size="100" />
            </div>
            <div id="multiline">
                <textarea id="interpreter_textarea" name="input_textarea" type="text" class="textbox" cols="97" rows="10"></textarea>
                <br />
            </div>
        </form>
        <div>
            Notes:
            <ul>
                <li>
                    To show the signature of a MochiKit function and link
                    to its documentation, type help(fnon any MochiKit
                    function.
                </li>
                <li>
                    To write multi-line code snippets, use the lower text area
                    and press ctrl-enter or cmd-enter to submit.
                </li>
                <li>
                    <tt>function name() {}</tt> syntax might not end up in
                    window scope, so use <tt>name = function () {}</tt>
                    syntax instead
                </li>
                <li>
                    If you want to stuff something into the output window
                    other than the <tt>repr(...)</tt> of the expression
                    result, use the <tt>writeln(...)</tt> function.
                    It accepts anything that MochiKit.DOM does, so you can
                    even put styled stuff in there!
                </li>
                <li>
                    Use <tt>clear()</tt> to clear the interpreter window.
                </li>
                <li>
                    You can use <tt>blockOn(aDeferred)</tt> to wait on a
                    Deferred.  This expression must be used by itself, so
                    the value must be obtained from <tt>_</tt> or
                    <tt>last_exc</tt>.  Typing any expression will
                    cancel the Deferred.
                </li>
                <li>
                    Up and down arrow keys work as a rudimentary history
                </li>
                <li>
                    <tt>_</tt> is the value of the last expression
                    that was not <tt>undefined</tt>, <tt>last_exc</tt> is
                    the value of the last unhandled exception.
                </li>
            </ul>
        </div>
    </body>
</html>

   
    
  
Related examples in the same category
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.