Ticket #9774: trac_9774-mathjax-flask-eval-script.patch

File trac_9774-mathjax-flask-eval-script.patch, 6.5 KB (added by jason, 9 years ago)

apply to sagenb repository; apply on top of previous patches

  • sagenb/data/sage/js/notebook_lib.js

    # HG changeset patch
    # User Jason Grout <jason.grout@drake.edu>
    # Date 1308215200 25200
    # Node ID ceb45b45901b1699f0f6a2ae08629086c6a40383
    # Parent  d463c377b1e5508fb38d8e6365c7f257cc6d708e
    Fix javascript so that mathjax script tags remain and are not evaluated.
    
    diff --git a/sagenb/data/sage/js/notebook_lib.js b/sagenb/data/sage/js/notebook_lib.js
    a b  
    33513351    // Check on the cell currently computing to see what's up.
    33523352    cell_id = active_cell_list[0];
    33533353
     3354    console.log('B');
    33543355    async_request(worksheet_command('cell_update'),
    33553356                  check_for_cell_update_callback, { id: cell_id });
    33563357
     
    34263427        return;
    34273428    }
    34283429
     3430    console.log('C');
    34293431    i = response_text.indexOf(' ');
    34303432    id = toint(response_text.substring(1, i));
    34313433    stat = response_text.substring(0, 1);
     
    34443446    interrupted = D[4];
    34453447    introspect_html = D[5];
    34463448
     3449    console.log('A');
    34473450    // Evaluate and update the cell's output.
    34483451    interact_hook = set_output_text(id, stat, output_text, output_text_wrapped,
    34493452                                    output_html, introspect_html, false);
    34503453
     3454    console.log('D');
    34513455    if (stat === 'd') {
    34523456        cell_set_done(id);
    34533457        active_cell_list.splice($.inArray(id, active_cell_list), 1);
     
    36003604        // should be ignored.
    36013605        return false;
    36023606    }
    3603 
     3607    console.log('E: output_text: '+output_text);
    36043608    // Evaluate javascript, but *only* after the entire cell output
    36053609    // has been loaded (hence the stat === 'd') below.
    36063610    if (stat === 'd' && !is_interacting_cell(id)) {
     3611        console.log('H');
    36073612        output_text_wrapped = eval_script_tags(output_text_wrapped);
     3613        console.log('I');
    36083614        output_html = eval_script_tags(output_html);
     3615        console.log('J');
    36093616    }
    36103617
    36113618    // Handle an interact update.
     
    36393646
    36403647        return false;
    36413648    }
    3642 
     3649    console.log('F');
    36433650    // Fill in output text got so far.
    36443651    cell_output = get_element('cell_output_' + id);
    36453652    if (!cell_output) {
     
    36513658        // with hard to kill C code, etc.).
    36523659        return false;
    36533660    }
     3661    console.log('G');
    36543662    cell_output_nowrap = get_element('cell_output_nowrap_' + id);
    36553663    cell_output_html = get_element('cell_output_html_' + id);
    36563664    cell_output.innerHTML = output_text_wrapped;
     
    36583666    cell_output_html.innerHTML = output_html;
    36593667
    36603668    // Call jsMath on the final output.
    3661     if (stat === 'd' && contains_jsmath(output_text)) {
     3669    console.log('checking mathjax'+stat+contains_jsmath(output_text)+' '+output_html+' '+output_text);
     3670    if (stat === 'd' && (contains_jsmath(output_text)||contains_jsmath(output_text_wrapped))) {
    36623671        try {
     3672            //console.log('mathjax queuing');
    36633673            MathJax.Hub.Queue(["Typeset",MathJax.Hub,cell_output]);
     3674            //console.log('mathjax queued');
    36643675        } catch (e) {
     3676            console.log('mathjax error');
    36653677            cell_output.innerHTML = jsmath_font_msg + cell_output.innerHTML;
    36663678            cell_output_nowrap.innerHTML = jsmath_font_msg +
    36673679                cell_output_nowrap.innerHTML;
     
    37493761    OUTPUT
    37503762        string with all script tags removed
    37513763    */
    3752     var code, i, j, k, left_tag, right_tag, s, script;
    3753 
    3754     left_tag = new RegExp(/<(\s)*script.*?>/i);
     3764
     3765    var i, j, k, left_tag, right_tag, s, script, new_text, script_end, left_match;
     3766
     3767    left_tag = new RegExp(/<(\s)*script(.*)?>/i);
    37553768    right_tag = new RegExp(/<(\s*)\/(\s*)script(\s)*>/i);
    37563769
    37573770    script = '';
     3771    new_text='';
    37583772    s = text;
    37593773    i = s.search(left_tag);
    37603774    while (i !== -1) {
     3775        left_match = s.match(left_tag);
    37613776        j = s.search(right_tag);
    3762         k = i + (s.match(left_tag)[0] + '').length;
     3777        k = i + (left_match[0] + '').length;
     3778        script_end=j + (s.match(right_tag)[0] + '').length;
    37633779        if (j === -1 || j < k) {
    37643780            break;
    37653781        }
    3766         code = s.slice(k, j);
    3767         try {
    3768             cell_writer = new CellWriter();
    3769             eval(code);
    3770         } catch (e) {
    3771             alert(e);
    3772         }
    3773         s = s.slice(0, i) + cell_writer.buffer +
    3774             s.slice(j + (s.match(right_tag)[0] + '').length);
     3782        // MathJax uses the script tag with a type='math/tex(display|inline)'
     3783        // to encode characters (as a sort of CDATA thing).  We *don't* want
     3784        // to execute these script tags since they need to appear inline.
     3785        if (left_match[2].indexOf('math/tex')===-1) {
     3786            code = s.slice(k, j);
     3787            try {
     3788                cell_writer = new CellWriter();
     3789                eval(code);
     3790            } catch (e) {
     3791                alert(e);
     3792            }
     3793            new_text += s.slice(0, i) + cell_writer.buffer;
     3794        } else {
     3795            new_text += s.slice(0, script_end);
     3796        }
     3797        s = s.slice(script_end);
    37753798        i = s.search(left_tag);
    37763799    }
    3777     return s;
     3800    new_text+=s;
     3801    console.log('eval_script_tags returns: '+new_text);
     3802    return new_text;
    37783803}
    37793804
    37803805
     
    37883813        text -- string
    37893814    OUTPUT
    37903815        list of two strings:
    3791             [text w/o script tags, content of script tags]
     3816            [text w/o script tags (but includes math/tex script tags), content of script tags]
    37923817    */
    3793     var i, j, k, left_tag, right_tag, s, script;
    3794 
    3795     left_tag = new RegExp(/<(\s)*script.*?>/i);
     3818    var i, j, k, left_tag, right_tag, s, script, new_text, script_end, left_match;
     3819
     3820    left_tag = new RegExp(/<(\s)*script(.*)?>/i);
    37963821    right_tag = new RegExp(/<(\s*)\/(\s*)script(\s)*>/i);
    37973822
    37983823    script = '';
     3824    new_text='';
    37993825    s = text;
    38003826    i = s.search(left_tag);
    38013827    while (i !== -1) {
     3828        left_match = s.match(left_tag);
    38023829        j = s.search(right_tag);
    3803         k = i + (s.match(left_tag)[0] + '').length;
     3830        k = i + (left_match[0] + '').length;
     3831        script_end=j + (s.match(right_tag)[0] + '').length;
    38043832        if (j === -1 || j < k) {
    38053833            break;
    38063834        }
    3807         script += s.slice(k, j);
    3808         s = s.slice(0, i) + s.slice(j + (s.match(right_tag)[0] + '').length);
     3835        // MathJax uses the script tag with a type='math/tex(display|inline)'
     3836        // to encode characters (as a sort of CDATA thing).  We *don't* want
     3837        // to extract these script tags since they need to appear inline.
     3838        if (left_match[2].indexOf('math/tex')===-1) {
     3839            script += s.slice(k, j);
     3840            new_text += s.slice(0, i);
     3841        } else {
     3842            new_text += s.slice(0, script_end);
     3843        }
     3844        s = s.slice(script_end);
    38093845        i = s.search(left_tag);
    38103846    }
    3811     return [s, script];
     3847    new_text+=s;
     3848    return [new_text, script];
    38123849}
    38133850
    38143851