|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
define([ |
|
'base/js/namespace', |
|
'jquery', |
|
'require', |
|
'notebook/js/cell', |
|
'base/js/security', |
|
'components/marked/lib/marked', |
|
'base/js/events', |
|
'notebook/js/textcell' |
|
], function(IPython, $, requirejs, cell, security, marked, events, textcell) { |
|
"use strict"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var execute_python = function(cell,text) { |
|
|
|
if (IPython.notebook.trusted === false ) { |
|
return undefined |
|
} |
|
|
|
if (IPython.notebook.dirty === true ) delete cell.metadata.variables; |
|
|
|
var found = false; |
|
var newtext = text.replace(/{{(.*?)}}/g, function(match,tag,cha) { |
|
found = true; |
|
if (tag === "") return undefined; |
|
var code = tag; |
|
var id = 'python_'+cell.cell_id+'_'+cha; |
|
var thiscell = cell; |
|
var thismatch = tag; |
|
|
|
|
|
|
|
|
|
|
|
if (typeof cell.metadata.variables === "undefined") { |
|
cell.metadata.variables = {} |
|
} |
|
var val = cell.metadata.variables[thismatch]; |
|
if (IPython.notebook.dirty === true || val === undefined || jQuery.isEmptyObject(val)) { |
|
cell.metadata.variables[thismatch] = {}; |
|
var execute_callback = function (out_data) |
|
{ |
|
var html; |
|
if (out_data.msg_type === "error") { |
|
var text = "**" + out_data.content.ename + "**: " + out_data.content.evalue; |
|
html = marked(text); |
|
} else if (out_data.msg_type === "stream") { |
|
html = marked(out_data.content.text); |
|
var t = html.match(/^\s*<p>([\s\S]*?)<\/p>\s*$/); |
|
html = t !== null ? t[1] : html; |
|
var q = html.match(/^'([\s\S]*?)'$/); |
|
if (q !== null) html = q[1] |
|
} else if (out_data.msg_type === "execute_result" | out_data.msg_type === "display_data" ) { |
|
var ul = out_data.content.data; |
|
if (ul != undefined) { |
|
if (ul['text/latex'] != undefined) { |
|
html = ul['text/latex']; |
|
} else if (ul['image/svg+xml'] != undefined) { |
|
var svg = ul['image/svg+xml']; |
|
|
|
svg = btoa(svg); |
|
html = '<img src="data:image/svg+xml;base64,' + svg + '"/>'; |
|
} else if (ul['image/jpeg'] != undefined) { |
|
var jpeg = ul['image/jpeg']; |
|
html = '<img src="data:image/jpeg;base64,' + jpeg + '"/>'; |
|
} else if (ul['image/png'] != undefined) { |
|
var png = ul['image/png']; |
|
html = '<img src="data:image/png;base64,' + png + '"/>'; |
|
} else if (ul['text/markdown'] != undefined) { |
|
html = marked(ul['text/markdown']); |
|
} else if (ul['text/html'] != undefined) { |
|
html = ul['text/html']; |
|
} else { |
|
html = marked(ul['text/plain']); |
|
|
|
var t = html.match(/^\s*<p>([\s\S]*?)<\/p>\s*$/); |
|
html = t !== null ? t[1] : html; |
|
var q = html.match(/^'([\s\S]*?)'$/); |
|
if (q !== null) html = q[1] |
|
} |
|
} |
|
} else { |
|
return; |
|
} |
|
thiscell.metadata.variables[thismatch] = html; |
|
var el = document.getElementById(id); |
|
el.innerHTML = el.innerHTML + html; |
|
}; |
|
var callbacks = { iopub : { output: execute_callback } }; |
|
if (cell.notebook.kernel != null) { |
|
cell.notebook.kernel.execute(code, callbacks, {silent: false, store_history : false, stop_on_error: false }); |
|
return "<span id='"+id+"'></span>"; |
|
} |
|
return undefined; |
|
} else { |
|
|
|
val = cell.metadata.variables[tag]; |
|
return "<span id='"+id+"'>"+val+"</span>" |
|
} |
|
}); |
|
if (found == true) return newtext; |
|
return undefined |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var render_cell = function(cell) { |
|
var element = cell.element.find('div.text_cell_render'); |
|
var text = execute_python(cell, element[0].innerHTML); |
|
if (text !== undefined) { |
|
element[0].innerHTML = text; |
|
MathJax.Hub.Queue(["Typeset",MathJax.Hub,element[0]]); |
|
} |
|
}; |
|
|
|
|
|
var original_render = textcell.MarkdownCell.prototype.render; |
|
textcell.MarkdownCell.prototype.render = function() { |
|
if (IPython.notebook.dirty === true) { |
|
this.rendered = false |
|
} |
|
return original_render.apply(this) |
|
}; |
|
|
|
var set_trusted_indicator = function() { |
|
var ind = $('.notebook-trusted'); |
|
if (IPython.notebook.trusted === true) { |
|
ind.attr('title','Notebook is trusted'); |
|
ind.removeClass('fa-question'); |
|
ind.addClass('fa-check'); |
|
} else { |
|
ind.attr('title','Notebook is not trusted'); |
|
ind.removeClass('fa-check'); |
|
ind.addClass('fa-question'); |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var load_css = function (name) { |
|
var link = document.createElement("link"); |
|
link.type = "text/css"; |
|
link.rel = "stylesheet"; |
|
link.href = requirejs.toUrl(name); |
|
document.getElementsByTagName("head")[0].appendChild(link); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
var update_md_cells = function () { |
|
var ncells = IPython.notebook.ncells(); |
|
var cells = IPython.notebook.get_cells(); |
|
for (var i = 0; i < ncells; i++) { |
|
var cell = cells[i]; |
|
if (cell.metadata.hasOwnProperty('variables')) { |
|
render_cell(cell) |
|
} |
|
} |
|
}; |
|
|
|
var load_ipython_extension = function() { |
|
load_css('./main.css'); |
|
events.on("rendered.MarkdownCell", function (event, data) { |
|
render_cell(data.cell); |
|
}); |
|
events.on("trust_changed.Notebook", set_trusted_indicator); |
|
|
|
$('#save_widget').append('<i id="notebook-trusted-indicator" class="fa fa-question notebook-trusted" />'); |
|
set_trusted_indicator(); |
|
|
|
|
|
events.on("kernel_ready.Kernel", function () { |
|
if (Jupyter.notebook !== undefined && Jupyter.notebook._fully_loaded) { |
|
update_md_cells() |
|
} else { |
|
events.on("notebook_loaded.Notebook", function () { |
|
update_md_cells() |
|
}) |
|
} |
|
}); |
|
}; |
|
|
|
return { |
|
load_ipython_extension : load_ipython_extension |
|
}; |
|
}); |
|
|