User:Mike Dillon/Scripts/easydom-console.js

From Wikipedia, the free encyclopedia

// Requires: User:Mike Dillon/Scripts/easydom.js // Optionally requires: User:Mike Dillon/Scripts/easydom-ext.js

//

addOnloadHook(function () {
    var consoleContainer = document.getElementById('easyDomConsole');
    if (consoleContainer == null) return;

    var createSection = function (title, id) {
        with (easydom) {
            consoleContainer.appendChild(h2(title));
            return consoleContainer.appendChild(div({ "id": id }));
        }
    };

    var removeAllChildren = function (node) {
        while (node && node.hasChildNodes()) {
            node.removeChild(node.firstChild);
        }
    };

    // Create sections
    var commandWindow = createSection('Command Window', 'easyDomCommandWindow');
    var samples = createSection('Samples', 'easyDomSamples');
    var commandHistory = createSection('Command History', 'easyDomCommandHistory');
    var playground = createSection('Playground', 'easyDomPlayground');

    // Command Window
    var createSubmitHandler = function (data, clear) {
        return function () {
            // Skip blanks
            if (!(data.value && data.value.match('\\S'))) {
                // Clear
                if (clear) data.value = '';
                return false;
            }

            try {
                eval('with (easyDom) { ' + data.value + ' }');
                // Store history
                storeHistoryItem(data.value);
                // Clear
                if (clear) data.value = '';
            } catch (e) {
                alert('Error: ' + e);
            }
            return false;
        };
    };

    with (easyDom) {
        var pane = div({ "style": "background: #aaa; border: solid black 1px;" });

        pane.appendChild(p('Standard variables:', ul(
            li(strong('easydom'), ': The Easy DOM HTML namespace (implicitly available)'),
            li(strong('playground'), ': The playground element')
        )));

        if (easydomMath) {
            pane.appendChild(p('Extended variables (available with easydom-ext.js):', ul(
                li(strong('easydomMath'), ': The Easy DOM MathML namespace'),
                li(strong('easydomSvg'), ': The Easy DOM SVG namespace')
            )));
        }

        var consoleTextArea = textarea({ name: "code", rows: 10, style: "width: 100%"});
        var consoleForm = form({ onsubmit: createSubmitHandler(consoleTextArea, true) });
        consoleForm.appendChild(div(consoleTextArea));
        var buttons = div(input({ type: "submit", value: "Evaluate" }),
            ' ', input({ type: "reset", value: "Clear" }));
        consoleForm.appendChild(buttons);
        pane.appendChild(consoleForm);

        commandWindow.appendChild(pane);
    }

    var createCommandWindowPopulator = function (data) {
        return function () {
            consoleTextArea.value = data;
            consoleTextArea.focus();
            return false;
        };
    };

    // Samples
    var sampleList = samples.appendChild(easyDom.ul());
    if (samples.style.overflowY != null) {
        samples.style.overflowY = "auto";
        samples.style.maxHeight = "15em";
    } else {
        samples.style.overflow = "scroll";
        samples.style.height = "15em";
    }

    var createSampleItem = function (description, sampleCode) {
        with (easydom) {
            var editLink = a({ "href": "#", "title": "Edit sample code in Command Window" }, '(edit)');
            editLink.onclick = createCommandWindowPopulator(sampleCode);

            var execLink = a({ "href": "#", "title": "Execute sample code directly" }, '(exec)');
            execLink.onclick = createSubmitHandler({ "value": sampleCode });

            return li(description, ' ', editLink, ' ', execLink);
        }
    };

    // Say Hello
    sampleList.appendChild(createSampleItem(
        'Add "Say Hello!" link to playground that says "Hello!"',
        'playground.appendChild(p(a({ "href": "#", "onclick": function () {\n' +
        '    alert("Hello!");\n' +
        '    return false;\n' +
        '} }, "Say Hello!")));'
    ));

    if (easydomMath) {
        // Simple matrix
        sampleList.appendChild(createSampleItem(
            'Create a simple matrix equation using MathML (Presentation)',
            'with (easydomMath) {\n' +
            '    playground.appendChild(easydom.p(math(mrow(mi("a"), mo("="),\n' +
            '        mfenced({ "open": "[", "close": "]" },\n' +
            '            mtable(\n' +
            '                mtr(mtd(mi("x")), mtd(mi("y"))),\n' +
            '                mtr(mtd(mi("z")), mtd(mi("w")))\n' +
            '            ))))))\n' +
            '}'
        ));
    }

    if (easydomSvg) {
        // SVG Star
        sampleList.appendChild(createSampleItem(
            'Create a star using SVG',
            'var starSize = 100;\n' +
            'var createStar = function (size) {\n' +
            '    var scale = size / 11;\n' +
            '\n' +
            '    with (easydomSvg) {\n' +
            '        var star = path({\n' +
            '            "d": "M 100,50 L 65.371323,61.16792 L 65.45085,97.552826 " +\n' +
            '                 "L 44.128677,68.070074 L 9.5491503,79.389263 L 31,50 " +\n' +
            '                 "L 9.5491503,20.610737 L 44.128677,31.929926 L 65.45085,2.4471742 " +\n' +
            '                 "L 65.371323,38.83208 L 100,50 z",\n' +
            '            "transform": "matrix(0,-9.678482e-2,9.678482e-2,0,0.660759,10.80135)",\n' +
            '            "style": "fill: #fdff00; fill-opacity: 1; fill-rule: nonzero; " +\n' +
            '                     "stroke: #605a00; stroke-width: 7.74914932; stroke-linejoin: miter; " +\n' +
            '                     "stroke-miterlimit: 40; stroke-dashoffset: 0; stroke-opacity: 1"\n' +
            '        });\n' +
            '\n' +
            '        return svg({ "width": size, "height": size },\n' +
            '            g({ "transform": "scale(" + scale + ")" }, star));\n' +
            '    }\n' +
            '};\n' +
            '\n' +
            'playground.appendChild(div(createStar(starSize)));'
        ));
    }

    // Command History
    var commandCounter = 0;

    var commandHistoryList = commandHistory.appendChild(
        easyDom.ul({ "style": "list-style: none; padding: 0" }));
    if (commandHistory.style.overflowY != null) {
        commandHistory.style.overflowY = "auto";
        commandHistory.style.maxHeight = "15em";
    } else {
        commandHistory.style.overflow = "scroll";
        commandHistory.style.height = "15em";
    }

    var historyLimit = 30;
    var storeHistoryItem = function (data) {
        var historyLink = easyDom.a({
            "href": "#",
            "title": "Edit previously exited code in Command Window",
            "onclick": createCommandWindowPopulator(data)
        }, ++commandCounter);

        var historyItem = easyDom.li(easyDom.pre(
            { "style": "border: 1px solid rgb(80,60,60); margin: 0" },
            historyLink, ": ", data));
        if (!commandHistoryList.hasChildNodes) {
            commandHistoryList.appendChild(historyItem);
            return;
        }

        if (commandHistoryList.childNodes.length > historyLimit) {
            commandHistoryList.removeChild(commandHistoryList.childNodes[historyLimit]);
        }

        commandHistoryList.insertBefore(
            historyItem, commandHistoryList.firstChild);
    };

    // Playground
    var setupPlayground = function () {
        // Clear playground
        removeAllChildren(playground);

        // Add boilerplate
        var playgroundMessageAttr = { style: "background: red; border: 1px solid grey;" };
        var playgroundMessage =
            "This <div> is here to play with. It has a DOM id of \"" + playground.id + "\". " +
            "It can also be referenced using the \"playground\" Javascript variable.";
        playground.appendChild(easydom.p(playgroundMessageAttr, playgroundMessage));
    };
    setupPlayground();

    // Add clear buttons to Command Window button panel
    with (easydom) {
        var clearHistory = input({ "type": "button", "value": "Clear History",
            "onclick": function () { removeAllChildren(commandHistoryList) } });
        var resetPlayground = input({ "type": "button", "value": "Reset Playground",
            "onclick": function () { setupPlayground() } });
        // Insert float as first child
        buttons.insertBefore(
            div({ "style": "float: right" }, clearHistory, ' ', resetPlayground),
            buttons.firstChild);
        // Clear
        buttons.appendChild(div({ "style": "clear: both" }));
    }
});
//