From 054811fa835865485713f3a88b4eadca64d8bb93 Mon Sep 17 00:00:00 2001 From: Juergen Hasch Date: Thu, 6 Aug 2015 21:13:57 +0200 Subject: [PATCH 1/2] Search-replace for IPython 3.x --- usability/search-replace/icon.png | Bin 0 -> 17613 bytes usability/search-replace/main.css | 26 +++ usability/search-replace/main.js | 219 +++++++++++++++++++ usability/search-replace/search-replace.yaml | 7 + 4 files changed, 252 insertions(+) create mode 100644 usability/search-replace/icon.png create mode 100644 usability/search-replace/main.css create mode 100755 usability/search-replace/main.js create mode 100644 usability/search-replace/search-replace.yaml diff --git a/usability/search-replace/icon.png b/usability/search-replace/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe66aa132093ae6aa13fb61d37577fb0a0caec2 GIT binary patch literal 17613 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 c34L=w{MLY+pPS;s(Vg__rR=USisAI26LrT_o{ literal 0 HcmV?d00001 diff --git a/usability/search-replace/main.css b/usability/search-replace/main.css new file mode 100644 index 0000000..b285266 --- /dev/null +++ b/usability/search-replace/main.css @@ -0,0 +1,26 @@ + + +#searchbar-wrapper { + position: absolute; + background-color: #ffffff; + border-style: solid; + border-radius: 5px; + border-color: #aaaaaa; + padding-left: 10px; + width:430px; + top: 100px; + right: 5px; + float: right; + opacity: 1; + z-index: 100; + font-size: 12px; + font-weight: bold; +} + +.searchbar_buttons { + height: 30px; +} + +.searchbar_input { + width: 200px; +} \ No newline at end of file diff --git a/usability/search-replace/main.js b/usability/search-replace/main.js new file mode 100755 index 0000000..ebd5f09 --- /dev/null +++ b/usability/search-replace/main.js @@ -0,0 +1,219 @@ +// Simple search&replace extension based on a codemirror addon. +// Adds a search box to the notebook toolbar and selects search word if found. + +define([ + 'base/js/namespace', + 'jquery', + 'require', + 'codemirror/addon/search/search', + 'codemirror/addon/search/searchcursor' +], function(IPython, $, require) { + "use strict"; + + /** + * Search for a string within the complete notebook, starting at current cell or + * CodeMirror selection + * @param hotkey + * @returns {boolean} + */ + var search = function(hotkey) { + /* execute search operation only after pressing return key or button click */ + if (hotkey != 0 && hotkey != 13) { + return false; + } + + var cell = IPython.notebook.get_selected_cell(); + if (cell.rendered == true && cell.cell_type == "markdown" ) cell.unrender(); + var findString = $('#searchbar_search_text').val(); + var cur = cell.code_mirror.getCursor(); + + var case_sensitive = !$('#searchbar_case_sensitive').hasClass('active'); + var find = cell.code_mirror.getSearchCursor(findString,cur, case_sensitive); + if (find.find() == true) { + cell.code_mirror.setSelection(find.pos.from,find.pos.to); + cell.code_mirror.focus(); + } else { + var ncells = IPython.notebook.ncells(); + if ( IPython.notebook.get_selected_index()+1 == ncells) { + cell.code_mirror.setCursor({line:0, ch:0}); + cell.code_mirror.focus(); + } else { + IPython.notebook.select_next(); + IPython.notebook.edit_mode(); + cell.code_mirror.setCursor({line:0, ch:0}); + return search(hotkey); + } + } + }; + + /** + * Replace a string within the complete notebook, starting at current cell or + * CodeMirror selection + * @param hotkey + * @returns {boolean} + */ + var replace = function(hotkey) { + /* execute replace operation only after pressing return key or button click */ + if (hotkey != 0 && hotkey != 13) { + return false; + } + + var cell = IPython.notebook.get_selected_cell(); + if (cell.rendered == true && cell.cell_type == "markdown" ) cell.unrender(); + + var findString = $('#searchbar_search_text').val(); + var replaceString = $('#searchbar_replace_text').val(); + var cur = cell.code_mirror.getCursor(); + + var case_sensitive = !$('#searchbar_case_sensitive').hasClass('active'); + var find = cell.code_mirror.getSearchCursor(findString,cur, case_sensitive); + if (find.find() == true) { + cell.code_mirror.setSelection(find.pos.from,find.pos.to); + cell.code_mirror.replaceSelection(replaceString); + cell.code_mirror.focus(); + } else { + var ncells = IPython.notebook.ncells(); + if ( IPython.notebook.get_selected_index()+1 == ncells) { + cell.code_mirror.setCursor({line:0, ch:0}); + cell.code_mirror.focus(); + } else { + IPython.notebook.select_next(); + IPython.notebook.edit_mode(); + cell.code_mirror.setCursor({line:0, ch:0}); + return replace(hotkey); + } + } + }; + + /** + * Create floating toolbar + * + */ + var create_searchbar_div = function () { + var btn = '
\ +
\ + \ + \ + \ + \ +
\ +
\ + \ + \ + \ +
\ +
'; + + var searchbar_wrapper = $('
') + .text("Searchbar") + .append(btn) + .draggable() + .append("
"); + + $("#header").append(searchbar_wrapper); + $("#searchbar-wrapper").css({'position' : 'absolute'}); + + $('#searchbar_search').on('click', function() { search(0); this.blur(); }) + .tooltip({ title : 'Search text' , delay: {show: 500, hide: 100}}); + $('#searchbar_case_sensitive').on('click', function() { this.blur(); }) + .tooltip({ title : 'Case sensitive' , delay: {show: 500, hide: 100}}); + $('#searchbar_replace').on('click', function() { replace(0); this.blur(); }) + .tooltip({ title : 'Replace text' , delay: {show: 500, hide: 100}}); + $('#searchbar_search_text').on('keyup', function(event) { search(event.keyCode);}); + $('#searchbar_replace_text').on('keyup', function(event) { replace(event.keyCode);}); + IPython.notebook.keyboard_manager.register_events($('#searchbar_search_text')); + IPython.notebook.keyboard_manager.register_events($('#searchbar_replace_text')); + }; + + /** + * Show/hide toolbar + * + */ + var toggle_toolbar = function() { + var dom = $("#searchbar-wrapper"); + + if (dom.is(':visible')) { + $('#toggle_searchbar').removeClass('active').blur(); + dom.hide(); + } else { + $('#toggle_searchbar').addClass('active'); + dom.show(); + } + + if (dom.length === 0) { + create_searchbar_div() + } + + }; + + IPython.toolbar.add_buttons_group([ + { + id : 'toggle_searchbar', + label : 'Toggle Search Toolbar', + icon : 'fa-search', + callback : function () { + toggle_toolbar(); + $('#searchbar_search_text') + } + } + ]); + + $("#toggle_searchbar").css({'outline' : 'none'}); + + /** + * Add CSS file + * + * @param name filename + */ + var load_css = function (name) { + var link = document.createElement("link"); + link.type = "text/css"; + link.rel = "stylesheet"; + link.href = require.toUrl(name); + document.getElementsByTagName("head")[0].appendChild(link); + }; + + /** + * Initialize extension + */ + var load_ipython_extension = function() { + load_css('./main.css'); + + /* Add keyboard shortcuts for search and replace. + * Hardcoded for now, should be configurable + */ + var add_shortcuts = { + 'alt-f' : { + help : 'search', + help_index : 'se', + handler : function() { + if (!$('#toggle_searchbar').hasClass('active')) { + toggle_toolbar(); + } + $('#searchbar_search_text').focus(); + return false; + } + }, + 'alt-r' : { + help : 'search', + help_index : 'se', + handler : function() { + if (!$('#toggle_searchbar').hasClass('active')) { + toggle_toolbar(); + } + $('#searchbar_replace_text').focus(); + return false; + } + } + }; + + IPython.keyboard_manager.command_shortcuts.add_shortcuts(add_shortcuts); + IPython.keyboard_manager.edit_shortcuts.add_shortcuts(add_shortcuts); + + }; + + var extension = { + load_ipython_extension : load_ipython_extension + }; + return extension; +}); diff --git a/usability/search-replace/search-replace.yaml b/usability/search-replace/search-replace.yaml new file mode 100644 index 0000000..3ee8054 --- /dev/null +++ b/usability/search-replace/search-replace.yaml @@ -0,0 +1,7 @@ +Type: IPython Notebook Extension +Name: Search and Replace +Description: Search and replace +Link: https://github.com/ipython-contrib/IPython-notebook-extensions/wiki +Icon: icon.png +Main: main.js +Compatibility: 3.x From f26189d48bc519f3b2b9c1e16d453365bac72754 Mon Sep 17 00:00:00 2001 From: Juergen Hasch Date: Thu, 6 Aug 2015 21:18:57 +0200 Subject: [PATCH 2/2] Hotkeys for command mode only --- usability/search-replace/main.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/usability/search-replace/main.js b/usability/search-replace/main.js index ebd5f09..7f665e0 100755 --- a/usability/search-replace/main.js +++ b/usability/search-replace/main.js @@ -183,7 +183,7 @@ define([ * Hardcoded for now, should be configurable */ var add_shortcuts = { - 'alt-f' : { + 'f' : { help : 'search', help_index : 'se', handler : function() { @@ -194,9 +194,9 @@ define([ return false; } }, - 'alt-r' : { - help : 'search', - help_index : 'se', + 'r' : { + help : 'replace', + help_index : 're', handler : function() { if (!$('#toggle_searchbar').hasClass('active')) { toggle_toolbar(); @@ -208,8 +208,6 @@ define([ }; IPython.keyboard_manager.command_shortcuts.add_shortcuts(add_shortcuts); - IPython.keyboard_manager.edit_shortcuts.add_shortcuts(add_shortcuts); - }; var extension = {