// Copyright (c) Jupyter-Contrib Team. // Distributed under the terms of the Modified BSD License. // Author: Jean-François Bercher //var config_toolbar_present = false; var listOfLangsInNotebook = []; var log_prefix = '[nbTranslate] '; var nbTranslate_toolbarNotYetDisplayed = true; var langs = { 'auto': 'Automatic', 'af': 'Afrikaans', 'sq': 'Albanian', 'ar': 'Arabic', 'hy': 'Armenian', 'az': 'Azerbaijani', 'eu': 'Basque', 'be': 'Belarusian', 'bn': 'Bengali', 'bs': 'Bosnian', 'bg': 'Bulgarian', 'ca': 'Catalan', 'ceb': 'Cebuano', 'ny': 'Chichewa', 'zh-cn': 'Chinese Simplified', 'zh-tw': 'Chinese Traditional', 'co': 'Corsican', 'hr': 'Croatian', 'cs': 'Czech', 'da': 'Danish', 'nl': 'Dutch', 'en': 'English', 'eo': 'Esperanto', 'et': 'Estonian', 'tl': 'Filipino', 'fi': 'Finnish', 'fr': 'French', 'fy': 'Frisian', 'gl': 'Galician', 'ka': 'Georgian', 'de': 'German', 'el': 'Greek', 'gu': 'Gujarati', 'ht': 'Haitian Creole', 'ha': 'Hausa', 'haw': 'Hawaiian', 'iw': 'Hebrew', 'hi': 'Hindi', 'hmn': 'Hmong', 'hu': 'Hungarian', 'is': 'Icelandic', 'ig': 'Igbo', 'id': 'Indonesian', 'ga': 'Irish', 'it': 'Italian', 'ja': 'Japanese', 'jw': 'Javanese', 'kn': 'Kannada', 'kk': 'Kazakh', 'km': 'Khmer', 'ko': 'Korean', 'ku': 'Kurdish (Kurmanji)', 'ky': 'Kyrgyz', 'lo': 'Lao', 'la': 'Latin', 'lv': 'Latvian', 'lt': 'Lithuanian', 'lb': 'Luxembourgish', 'mk': 'Macedonian', 'mg': 'Malagasy', 'ms': 'Malay', 'ml': 'Malayalam', 'mt': 'Maltese', 'mi': 'Maori', 'mr': 'Marathi', 'mn': 'Mongolian', 'my': 'Myanmar (Burmese)', 'ne': 'Nepali', 'no': 'Norwegian', 'ps': 'Pashto', 'fa': 'Persian', 'pl': 'Polish', 'pt': 'Portuguese', 'ma': 'Punjabi', 'ro': 'Romanian', 'ru': 'Russian', 'sm': 'Samoan', 'gd': 'Scots Gaelic', 'sr': 'Serbian', 'st': 'Sesotho', 'sn': 'Shona', 'sd': 'Sindhi', 'si': 'Sinhala', 'sk': 'Slovak', 'sl': 'Slovenian', 'so': 'Somali', 'es': 'Spanish', 'su': 'Sudanese', 'sw': 'Swahili', 'sv': 'Swedish', 'tg': 'Tajik', 'ta': 'Tamil', 'te': 'Telugu', 'th': 'Thai', 'tr': 'Turkish', 'uk': 'Ukrainian', 'ur': 'Urdu', 'uz': 'Uzbek', 'vi': 'Vietnamese', 'cy': 'Welsh', 'xh': 'Xhosa', 'yi': 'Yiddish', 'yo': 'Yoruba', 'zu': 'Zulu' }; // test if array contains an element function inArray(array, element){ return array.indexOf(element) > -1; // is not supported by old IE but doesn't really matter }; /*Extend array prototype to include a contains method Array.prototype.contains = function(element){ return this.indexOf(element) > -1; // is not supported by old IE but doesn't really matter }; Array.prototype.addIfNotAlreadyIn = function(element){ if (this.indexOf(element) == -1){ // is not supported by old IE but doesn't really matter this.push(element)} }; */ console.log(log_prefix, " Overriding run-range javascript function"); requirejs("notebook/js/notebook").Notebook.prototype.execute_cell_range = function(start, end) { this.command_mode(); for (var i = start; i < end; i++) { this.select(i); var c = this.get_selected_cell(); if (c.element.is(':visible')) { this.execute_cell(); } else { //console.log("do nothing for cell",i); } } }; function translateCurrentCell() { //alert(log_prefix+" run on action") conf = Jupyter.notebook.metadata.nbTranslate var cell = Jupyter.notebook.get_selected_cell(); var cellText = cell.get_text(); var maths_and_text = removeMaths(cellText) var html_and_text = removeHtml(maths_and_text[1]) var sourceText = html_and_text[1]; var mdReplacements = {'*': '<*>', '**': '<**>', '_': '<_>', '__': '<__>'} // **, *, _, and __ in markdown are "protected" with <.> // which seems to survive the google translation -- not always, actually sourceText = sourceText.replace(/([\*|_]{1,2})([\s\S]*?)\1/g, function(m0,m1,m2){return mdReplacements[m1]+m2+mdReplacements[m1]}) cell.metadata.lang = conf.sourceLang; var translated_text = ""; if (conf.useGoogleTranslate) { var url = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=" + conf.sourceLang + "&tl=" + conf.targetLang + "&dt=t&q=" + encodeURIComponent(sourceText); var result = $.get(url) .done(function(data, text, obj) { if (obj.status == 200) { var translated_text = processGoogleTranslateResponse(obj.responseJSON); } else { var translated_text = sourceText; } translated_text = restoreHtml([html_and_text[0], translated_text]) translated_text = restoreMaths([maths_and_text[0], translated_text]) translated_text = translated_text.replace(/\\label{([\s\S]*?)}/g, function(m0,m1){return "\\label{"+m1+"-"+conf.targetLang+"}"}) .replace(/\\ref{([\s\S]*?)}/g, function(m0,m1){return "\\ref{"+m1+"-"+conf.targetLang+"}"}) insertTranslatedCell(translated_text, cell.rendered) }) } else { insertTranslatedCell(cellText, cell.rendered) } } function processGoogleTranslateResponse(responseJSON) { var translated_text = ""; var list_paragraphs = responseJSON[0] //var list_paragraphs = data.responseText.match(/\[\"([\S\s]*?)\",/g) list_paragraphs.forEach( function(elt) { translated_text += elt[0] //.substring(2, elt.length - 2) }) translated_text = translated_text.replace(/([^\\])\\n/g, "$1\n").replace(/([^\\])\\n/g, "$1\n") .replace(/\\\\/g, "\\") // unescape .replace(/\\"/g, '"') // replace double quotes .replace(/\\u003c([\*|_|@]{1,2})\\u003e\s*([\s\S]*?)\s*\\u003c\1\\u003e/g, function(m0,m1,m2){return m1+m2+m1}) .replace(/<([\*|_|@]{1,2})>\s*([\s\S]*?)\s*<\1>/g, function(m0,m1,m2){return m1+m2+m1}) /*for (item in mdReplacements) { var pattern = new RegExp(mdReplacements[item], 'gmi'); translated_text = translated_text.replace(pattern, item); }*/ // Remove spurious md remaining translated_text = translated_text.replace(/\\u003c([\*|_|@]{1,2})\\u003e/g, "") // Remove extra spaces in markdown translated_text = translated_text.replace(/([\*|_|@]{1,2})\s*([\s\S]*?)\s*\1/g, function(m0,m1,m2){return m1+m2+m1}) return translated_text; } function insertTranslatedCell(translated_text, render) { conf = Jupyter.notebook.metadata.nbTranslate Jupyter.notebook.insert_cell_below("markdown"); Jupyter.notebook.select_next(); var new_cell = Jupyter.notebook.get_selected_cell(); new_cell.set_text(translated_text); new_cell.metadata.lang = conf.targetLang; if (render) new_cell.render(); } function show_mdcells(displayLangs) { // only show cells with lang or nothing var ncells = Jupyter.notebook.ncells(); var cells = Jupyter.notebook.get_cells(); var MarkdownCell = requirejs('notebook/js/textcell').MarkdownCell; var lastmd_cell; for (var i = 0; i < ncells; i++) { var cell = cells[i]; if (cell instanceof MarkdownCell) { if (typeof cell.metadata.lang != "undefined") { if (!inArray(listOfLangsInNotebook, cell.metadata.lang)){ listOfLangsInNotebook.push(cell.metadata.lang) } } if (typeof cell.metadata.lang == "undefined" || inArray(displayLangs, cell.metadata.lang) || inArray(displayLangs, '*')) { if (!cell.rendered) cell.render(); cell.element.show(); lastmd_cell = cell; } else { cell.set_rendered(""); cell.rendered = false ; cell.element.hide(); } } } // this is to update toc contents. if(typeof lastmd_cell !== "undefined") { lastmd_cell.rendered = false; lastmd_cell.render(); // re-render last md cell and issue rendered.MarkdownCell event } else { //not a single markdown cell has been rendered // add one, render it and delete it. if (Jupyter.notebook.ncells()>1){ var c = Jupyter.notebook.insert_cell_at_bottom('markdown'); c.render(); Jupyter.notebook.delete_cell(Jupyter.notebook.ncells()-1); } } } function translateToolbarToggle(){ if (nbTranslate_toolbarNotYetDisplayed){ buildTranslateToolbar(); //rebuild it nbTranslate_toolbarNotYetDisplayed = false; $("#nbTranslate_toolbar").show(); } else $("#nbTranslate_toolbar").toggle(); } function buildTranslateToolbar(callback) { conf = Jupyter.notebook.metadata.nbTranslate var config_toolbar_present = $("#nbTranslate_toolbar").length >0; if (config_toolbar_present) { $("#nbTranslate_toolbar").remove(); if ($('#LangSelectionMenu').length > 0) $('#LangSelectionMenu').remove(); $(site).height($(window).height() - $('#header').height() - $('#footer').height()); } sourceLang = conf.sourceLang; targetLang = conf.targetLang; //local to this function // Defining the toolbar -------------------------------------------------------------- var nbTranslate_toolbar = $('