~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/media/browser/editor.js

Fixed an oversight in the tutorial code which was printing <worksheet>
and <exercise> tags into the output

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
function disable_save()
 
1
function disable_save_if_safe()
2
2
{
3
 
    var savebutton = document.getElementById("save_button");
4
 
    savebutton.disabled = true;
5
 
    window.onbeforeunload = null;
 
3
    /* If this is defined, this engine supports change notification, so is able
 
4
     * to enable the button again. Disable it for them. */
 
5
    if(editbox.editor.addChangeHandler)
 
6
    {
 
7
        var savebutton = document.getElementById("save_button");
 
8
        savebutton.disabled = true;
 
9
        window.onbeforeunload = null;
 
10
    }
6
11
}
7
12
 
8
13
function save_file(filename)
9
14
{
10
 
    if (using_codemirror)
11
 
        data = codemirror.getCode();
12
 
    else
13
 
        data = document.getElementById("editbox").value;
14
 
 
15
 
    /* Convert newlines to a single LF (mainly for IE's CRLFs) */
16
 
    data = data.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
17
 
 
 
15
    data = editbox.getCode();
18
16
    /* Do NOT refresh the page contents (causes problems for editarea and is
19
17
     * unnecessary). */
20
18
    if (current_file.svnstatus != "revision" ||
24
22
    {
25
23
        do_action("putfile", filename,
26
24
                  {"path":".", "data":data, "overwrite":"true"},
27
 
                  "multipart/form-data");
28
 
        disable_save();
 
25
                  "multipart/form-data", true);
 
26
        disable_save_if_safe();
29
27
    }
30
28
}
31
29
 
58
56
    window.onbeforeunload = confirm_beforeunload;
59
57
}
60
58
 
 
59
/** Presents the "editor heading" inserting it into a given element at
 
60
 *  the front. Note that the save widget is handled by the Python.
 
61
 */
 
62
function present_editorhead(elem, path, handler_type)
 
63
{
 
64
    var div = document.getElementById("actions2");
 
65
 
 
66
    /* Print a warning message if this is not actually a text file.
 
67
     */
 
68
    if (handler_type != "text")
 
69
    {
 
70
        var warn = dom_make_text_elem("p",
 
71
            "Warning: You are editing a binary " +
 
72
            "file, which explains any strange characters you may see. If " +
 
73
            "you save this file, you could corrupt it.");
 
74
        div.appendChild(warn);
 
75
    }
 
76
}
 
77
 
61
78
function highlighting_changed(select)
62
79
{
63
 
    codemirror_language(select.value);
 
80
    editbox.edit(editbox.getCode(), select.value);
 
81
}
 
82
 
 
83
function initialise_codepress()
 
84
{
 
85
    editbox.addChangeHandler(edit_text);
 
86
    editbox.addSaveHandler(function() {document.getElementById("save_button").click()});
 
87
     
 
88
    /* We can only safely disable the save button on the first load.
 
89
     * Syntax highlighting changes will also get this function called.
 
90
     * We unfortunately need the change handler added each time.
 
91
     */
 
92
    if (!initialise_codepress.already)
 
93
    {
 
94
        disable_save_if_safe();
 
95
        initialise_codepress.already = true;
 
96
    }
64
97
}
65
98
 
66
99
/** Presents the text editor.
67
100
 */
68
 
function handle_text(path, content_type, url_args)
69
 
{
70
 
    /* Need to make a 2nd ajax call, this time get the actual file
71
 
     * contents */
72
 
    callback = function(response)
73
 
        {
74
 
            /* Read the response and set up the page accordingly */
75
 
            handle_text_response(path, content_type, response.responseText);
76
 
        }
77
 
    /* Call the server and request the listing. */
78
 
    if (url_args)
79
 
        args = shallow_clone_object(url_args);
80
 
    else
81
 
        args = {};
82
 
    /* This time, get the contents of the file, not its metadata */
83
 
    args['return'] = "contents";
84
 
    ajax_call(callback, service_app, path, args, "GET");
85
 
}
86
 
 
87
 
function handle_text_response(path, content_type, response_text)
 
101
function handle_text(path, text, handler_type)
88
102
{
89
103
    /* Create a textarea with the text in it
90
104
     * (The makings of a primitive editor).
91
105
     */
92
106
    var files = document.getElementById("filesbody");
 
107
    /* Put our UI at the top */
 
108
    present_editorhead(files, path, handler_type);
93
109
 
94
110
    var div = document.createElement("div");
95
111
    div.style.height = '100%';
96
112
    files.appendChild(div);
97
 
    var txt_elem = document.createElement("textarea");
98
 
    txt_elem.value = response_text.toString();
 
113
    var txt_elem = dom_make_text_elem("textarea",
 
114
        text.toString())
99
115
    div.appendChild(txt_elem);
100
116
    txt_elem.setAttribute("id", "editbox");
101
 
    language = language_from_mime(content_type);
 
117
    language = language_from_mime(current_file.type);
102
118
 
103
119
    // Assume plaintext if no type can be determined.
104
120
    language = language ? language : "text";
105
121
    document.getElementById("highlighting_select").value = language;
106
122
 
107
 
    $(txt_elem).change(edit_text);
108
 
 
109
 
    /* This isn't ideal, as Opera seems to fire it even for non-textual keys.
110
 
     * But IE and WebKit don't, so this will behave properly in most browsers.
111
 
     * This makes me sad.
112
 
     */
113
 
    $(txt_elem).keypress(edit_text);
114
 
 
115
 
    txt_elem.style.width = "100%";
116
 
    txt_elem.style.height = "100%";
117
 
    txt_elem.style.padding = "0";
 
123
    txt_elem.className = "codepress autocomplete-off " + language;
 
124
    txt_elem.setAttribute("onchange", "edit_text()");
 
125
    /* TODO: Make CSS height: 100% work */
 
126
    txt_elem.setAttribute("rows", "35");
 
127
    CodePress.run();
 
128
 
118
129
    window.onbeforeunload = confirm_beforeunload;
119
130
 
120
 
    /* Always use CodeMirror (unless we find a good reason not to!) */
121
 
    using_codemirror = true;
122
 
 
123
 
    if (using_codemirror)
124
 
    {
125
 
        /* CodeMirror */
126
 
        using_codemirror = true;
127
 
        codemirror = new CodeMirror.fromTextArea(txt_elem, {
128
 
            path: codemirrorpath,
129
 
            stylesheet: [
130
 
                    codemirrorpath + "/contrib/python/css/pythoncolors.css",
131
 
                    codemirrorpath + "/css/xmlcolors.css",
132
 
                    codemirrorpath + "/css/jscolors.css",
133
 
                    codemirrorpath + "/css/csscolors.css"
134
 
                    ],
135
 
            basefiles: ["js/util.js",
136
 
                    "js/stringstream.js",
137
 
                    "js/select.js",
138
 
                    "js/undo.js",
139
 
                    "js/editor.js",
140
 
                    "js/tokenize.js"
141
 
                    ],
142
 
            parserfile: ["contrib/python/js/parsepython.js",
143
 
                    "js/parsexml.js",
144
 
                    "js/parsecss.js",
145
 
                    "js/tokenizejavascript.js",
146
 
                    "js/parsejavascript.js",
147
 
                    "js/parsehtmlmixed.js",
148
 
                    "js/parsedummy.js"
149
 
                    ],
150
 
            onChange: edit_text,
151
 
            indentUnit: 4,
152
 
            width: "auto", // Fixes issue with > 100% width
153
 
            tabMode: "spaces",
154
 
            lineNumbers: true,
155
 
            initCallback: function() {codemirror_language(language);},
156
 
            saveFunction: function() {document.getElementById("save_button").click();}
157
 
        });
158
 
 
159
 
    }
160
 
 
161
 
    /* Not using CodePress, so we can already disable the Save button. */
162
 
    disable_save();
163
 
 
164
 
}
165
 
 
166
 
function codemirror_language(lang)
167
 
{
168
 
    if(lang == 'python') {
169
 
        codemirror.setParser("PythonParser")
170
 
    } else if(lang == 'html') {
171
 
        codemirror.setParser("HTMLMixedParser")
172
 
    } else if(lang == 'css') {
173
 
        codemirror.setParser("CSSParser")
174
 
    } else if(lang == 'javascript') {
175
 
        codemirror.setParser("JSParser")
176
 
    } else {
177
 
        codemirror.setParser("DummyParser")
178
 
    }
179
 
 
180
 
    // Show actions bar
181
 
    $("#actions2_file").show();
 
131
    /* And set a callback so we know that the editor iframe is loaded so we
 
132
     * can set a callback so we know when to enable the save button.
 
133
     * We also take this opportunity to disable the save button, if
 
134
     * the browser is likely to reenable it as needed. */
 
135
    editbox.onload = initialise_codepress
182
136
}
183
137
 
184
138
function language_from_mime(mime)
185
139
{
186
140
    return {'text/x-python': 'python',
187
 
            'application/x-javascript': 'javascript',
188
141
            'application/javascript': 'javascript',
189
142
            'text/css': 'css',
190
143
            'text/plain': 'text',