From 835269e6f447452f07280e42029c9ecc1c959fe7 2014-11-15 00:52:07
From: Thomas Kluyver <takowl@gmail.com>
Date: 2014-11-15 00:52:07
Subject: [PATCH] Merge pull request #6801 from minrk/runMode

use CodeMirror.runMode to highlight in markdown
---

diff --git a/IPython/html/static/components b/IPython/html/static/components
index ba94581..563c9e7 160000
--- a/IPython/html/static/components
+++ b/IPython/html/static/components
@@ -1 +1 @@
-Subproject commit ba94581b824a62ee630dd0b92a5aea8678248a24
+Subproject commit 563c9e74b153e9509d94fd448353eeda13f0819c
diff --git a/IPython/html/static/notebook/js/notebook.js b/IPython/html/static/notebook/js/notebook.js
index 643818d..5bd4315 100644
--- a/IPython/html/static/notebook/js/notebook.js
+++ b/IPython/html/static/notebook/js/notebook.js
@@ -11,7 +11,8 @@ define([
     'services/sessions/session',
     'notebook/js/celltoolbar',
     'components/marked/lib/marked',
-    'highlight',
+    'codemirror/lib/codemirror',
+    'codemirror/addon/runmode/runmode',
     'notebook/js/mathjaxutils',
     'base/js/keyboard',
     'notebook/js/tooltip',
@@ -29,7 +30,8 @@ define([
     session, 
     celltoolbar, 
     marked,
-    hljs,
+    CodeMirror,
+    runMode,
     mathjaxutils,
     keyboard,
     tooltip,
@@ -83,19 +85,37 @@ define([
             marked.setOptions({
                 gfm : true,
                 tables: true,
-                langPrefix: "language-",
-                highlight: function(code, lang) {
+                // FIXME: probably want central config for CodeMirror theme when we have js config
+                langPrefix: "cm-s-ipython language-",
+                highlight: function(code, lang, callback) {
                     if (!lang) {
                         // no language, no highlight
-                        return code;
-                    }
-                    var highlighted;
-                    try {
-                        highlighted = hljs.highlight(lang, code, false);
-                    } catch(err) {
-                        highlighted = hljs.highlightAuto(code);
+                        if (callback) {
+                            callback(null, code);
+                            return;
+                        } else {
+                            return code;
+                        }
                     }
-                    return highlighted.value;
+                    utils.requireCodeMirrorMode(lang, function () {
+                        var el = document.createElement("div");
+                        mode = CodeMirror.getMode({}, lang);
+                        if (!mode) {
+                            console.log("No CodeMirror mode: " + lang);
+                            callback(null, code);
+                            return;
+                        }
+                        try {
+                            CodeMirror.runMode(code, mode, el);
+                            callback(null, el.innerHTML);
+                        } catch (err) {
+                            console.log("Failed to highlight " + lang + " code", error);
+                            callback(err, code);
+                        }
+                    }, function (err) {
+                        console.log("No CodeMirror mode: " + lang);
+                        callback(err, code);
+                    });
                 }
             });
         }
diff --git a/IPython/html/static/notebook/js/outputarea.js b/IPython/html/static/notebook/js/outputarea.js
index 5df95bc..ae56b94 100644
--- a/IPython/html/static/notebook/js/outputarea.js
+++ b/IPython/html/static/notebook/js/outputarea.js
@@ -552,9 +552,10 @@ define([
         var text_and_math = mathjaxutils.remove_math(markdown);
         var text = text_and_math[0];
         var math = text_and_math[1];
-        var html = marked.parser(marked.lexer(text));
-        html = mathjaxutils.replace_math(html, math);
-        toinsert.append(html);
+        marked(text, function (err, html) {
+            html = mathjaxutils.replace_math(html, math);
+            toinsert.append(html);
+        });
         element.append(toinsert);
         return toinsert;
     };
diff --git a/IPython/html/static/notebook/js/textcell.js b/IPython/html/static/notebook/js/textcell.js
index 183db40..24bd1e4 100644
--- a/IPython/html/static/notebook/js/textcell.js
+++ b/IPython/html/static/notebook/js/textcell.js
@@ -241,34 +241,35 @@ define([
     MarkdownCell.prototype.render = function () {
         var cont = TextCell.prototype.render.apply(this);
         if (cont) {
+            var that = this;
             var text = this.get_text();
             var math = null;
             if (text === "") { text = this.placeholder; }
             var text_and_math = mathjaxutils.remove_math(text);
             text = text_and_math[0];
             math = text_and_math[1];
-            var html = marked.parser(marked.lexer(text));
-            html = mathjaxutils.replace_math(html, math);
-            html = security.sanitize_html(html);
-            html = $($.parseHTML(html));
-            // add anchors to headings
-            // console.log(html);
-            html.find(":header").addBack(":header").each(function (i, h) {
-                h = $(h);
-                var hash = h.text().replace(/ /g, '-');
-                h.attr('id', hash);
-                h.append(
-                    $('<a/>')
-                        .addClass('anchor-link')
-                        .attr('href', '#' + hash)
-                        .text('¶')
-                );
-            })
-            // links in markdown cells should open in new tabs
-            html.find("a[href]").not('[href^="#"]').attr("target", "_blank");
-            this.set_rendered(html);
-            this.typeset();
-            this.events.trigger("rendered.MarkdownCell", {cell: this})
+            marked(text, function (err, html) {
+                html = mathjaxutils.replace_math(html, math);
+                html = security.sanitize_html(html);
+                html = $($.parseHTML(html));
+                // add anchors to headings
+                html.find(":header").addBack(":header").each(function (i, h) {
+                    h = $(h);
+                    var hash = h.text().replace(/ /g, '-');
+                    h.attr('id', hash);
+                    h.append(
+                        $('<a/>')
+                            .addClass('anchor-link')
+                            .attr('href', '#' + hash)
+                            .text('¶')
+                    );
+                });
+                // links in markdown cells should open in new tabs
+                html.find("a[href]").not('[href^="#"]').attr("target", "_blank");
+                that.set_rendered(html);
+                that.typeset();
+                that.events.trigger("rendered.MarkdownCell", {cell: that});
+            });
         }
         return cont;
     };
diff --git a/IPython/html/templates/page.html b/IPython/html/templates/page.html
index 404c6b5..93ba4b5 100644
--- a/IPython/html/templates/page.html
+++ b/IPython/html/templates/page.html
@@ -27,7 +27,6 @@
             bootstrap: 'components/bootstrap/js/bootstrap.min',
             bootstraptour: 'components/bootstrap-tour/build/js/bootstrap-tour.min',
             jqueryui: 'components/jquery-ui/ui/minified/jquery-ui.min',
-            highlight: 'components/highlight.js/build/highlight.pack',
             moment: "components/moment/moment",
             codemirror: 'components/codemirror',
             termjs: "components/term.js/src/term",
@@ -52,10 +51,7 @@
             jqueryui: {
               deps: ["jquery"],
               exports: "$"
-            },
-            highlight: {
-              exports: "hljs"
-            },
+            }
           }
       });
     </script>
diff --git a/setupbase.py b/setupbase.py
index a604c16..3dbc6b5 100644
--- a/setupbase.py
+++ b/setupbase.py
@@ -153,7 +153,6 @@ def find_package_data():
         pjoin(components, "es6-promise", "*.js"),
         pjoin(components, "font-awesome", "fonts", "*.*"),
         pjoin(components, "google-caja", "html-css-sanitizer-minified.js"),
-        pjoin(components, "highlight.js", "build", "highlight.pack.js"),
         pjoin(components, "jquery", "jquery.min.js"),
         pjoin(components, "jquery-ui", "ui", "minified", "jquery-ui.min.js"),
         pjoin(components, "jquery-ui", "themes", "smoothness", "jquery-ui.min.css"),