diff --git a/applications/admin/controllers/default.py b/applications/admin/controllers/default.py index aa95bb88..0999df33 100644 --- a/applications/admin/controllers/default.py +++ b/applications/admin/controllers/default.py @@ -750,6 +750,7 @@ def edit(): return response.json({'file_hash': file_hash, 'saved_on': saved_on, 'functions': functions, 'controller': controller, 'application': request.args[0], 'highlight': highlight}) else: file_details = dict(app=request.args[0], + lineno=request.vars.lineno or 1, editor_settings=preferences, filename=filename, realfilename=realfilename, @@ -784,7 +785,7 @@ def todolist(): files = [x.replace(os.path.sep, '/') for x in files if not x.endswith('.bak')] return files - pattern = '#(todo)+\s+(.*)' + pattern = '#\s*(todo)+\s+(.*)' regex = re.compile(pattern, re.IGNORECASE) output = [] @@ -792,7 +793,6 @@ def todolist(): for f in listfiles(app, d): matches = [] filename= apath(os.path.join(app, d, f), r=request) - with open(filename, 'r') as f_s: src = f_s.read() for m in regex.finditer(src): @@ -804,7 +804,6 @@ def todolist(): return {'todo':output, 'app': app} - def resolve(): """ """ diff --git a/applications/admin/static/css/web2py-codemirror.css b/applications/admin/static/css/web2py-codemirror.css index f5f80211..39b5311b 100644 --- a/applications/admin/static/css/web2py-codemirror.css +++ b/applications/admin/static/css/web2py-codemirror.css @@ -3,6 +3,11 @@ .CodeMirror-fullscreen { z-index: 1030; } +.CodeMirror { + border-top: 1px solid #ddd; + /*border-left: 1px solid #ddd;*/ + border-bottom: 1px solid #ddd; +} /* BREAKPOINTS */ diff --git a/applications/admin/static/js/ajax_editor.js b/applications/admin/static/js/ajax_editor.js index 2b355fe4..8a7916a4 100644 --- a/applications/admin/static/js/ajax_editor.js +++ b/applications/admin/static/js/ajax_editor.js @@ -248,7 +248,7 @@ function keepalive(url) { }); } -function load_file(url) { +function load_file(url, lineno) { $.ajax({ type: "GET", contentType: 'application/json', @@ -263,13 +263,13 @@ function load_file(url) { var tab_header = '
  • ' + json['realfilename'] + '
  • '; var tab_body = '
    ' + json['plain_html'] + '
    '; if(json['force'] === false) { - $('#filesTab').append($(tab_header)); - $('#myTabContent').append($(tab_body)); + $('#myTabContent').append($(tab_body)); // First load the body + $('#filesTab').append($(tab_header)); // Then load the header which trigger the shown event } else { $('#' + json['id']).html($(tab_body)); } } - $("a[href='#" + json['id'] + "']").click(); + $("a[href='#" + json['id'] + "']").trigger('click', lineno); } }, error: function (x) { diff --git a/applications/admin/views/default/edit.html b/applications/admin/views/default/edit.html index 15ab9317..4e8d0427 100644 --- a/applications/admin/views/default/edit.html +++ b/applications/admin/views/default/edit.html @@ -52,12 +52,17 @@ diff --git a/applications/admin/views/default/edit_js.html b/applications/admin/views/default/edit_js.html index 62e6fb54..51bd27ef 100644 --- a/applications/admin/views/default/edit_js.html +++ b/applications/admin/views/default/edit_js.html @@ -74,15 +74,15 @@ request.env['wsgi_url_scheme'], request.env['http_host'], URL(c='debug', f='toggle_breakpoint')))}}, sel); }); - function makeMarker() { - var marker = document.createElement("div"); - marker.style.color = "#822"; - marker.innerHTML = "●"; - marker.className = "breakpoint"; - return marker; - } + function makeMarker() { + var marker = document.createElement("div"); + marker.style.color = "#822"; + marker.innerHTML = "●"; + marker.className = "breakpoint"; + return marker; + } - {{if filetype in ('html', 'javascript', 'css'):}} + {{if filetype in ('html', 'javascript', 'css'):}} // must be here or break emmet/zencoding CodeMirror.defaults.extraKeys["Ctrl-S"] = function(instance) { @@ -94,26 +94,26 @@ CodeMirror.defaults.extraKeys["Shift-Esc"] = function(cm) { if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false); } - {{pass}} - {{if filetype=='python':}} - // must be here or break emmet/zencoding for python - CodeMirror.defaults.extraKeys["Ctrl-S"] = - function(instance) { - doClickSave();}; - CodeMirror.defaults.extraKeys["Ctrl-Space"] = "autocomplete"; - CodeMirror.defaults.extraKeys["Tab"] = "indentMore"; - CodeMirror.defaults.extraKeys["Shift-Tab"] = "indentLess"; - CodeMirror.defaults.extraKeys["Ctrl-F11"] = function(cm) { - cm.setOption("fullScreen", !cm.getOption("fullScreen")); - }, - CodeMirror.defaults.extraKeys["Shift-Esc"] = function(cm) { - if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false); - } - //for autocomplete - CodeMirror.commands.autocomplete = function(cm) { - CodeMirror.showHint(cm, CodeMirror.pythonHint); - } - {{pass}} + {{pass}} + {{if filetype=='python':}} + // must be here or break emmet/zencoding for python + CodeMirror.defaults.extraKeys["Ctrl-S"] = + function(instance) { + doClickSave();}; + CodeMirror.defaults.extraKeys["Ctrl-Space"] = "autocomplete"; + CodeMirror.defaults.extraKeys["Tab"] = "indentMore"; + CodeMirror.defaults.extraKeys["Shift-Tab"] = "indentLess"; + CodeMirror.defaults.extraKeys["Ctrl-F11"] = function(cm) { + cm.setOption("fullScreen", !cm.getOption("fullScreen")); + }, + CodeMirror.defaults.extraKeys["Shift-Esc"] = function(cm) { + if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false); + } + //for autocomplete + CodeMirror.commands.autocomplete = function(cm) { + CodeMirror.showHint(cm, CodeMirror.pythonHint); + } + {{pass}} store_changes_function = function(instance, changeObj) { jQuery(instance).data('saved', false); instance.off("change", store_changes_function); @@ -128,6 +128,19 @@ request.env['wsgi_url_scheme'], request.env['http_host'], URL(c='debug', f='list_breakpoints')))}}, editor); + // TODO move it in a separated file + CodeMirror.defineExtension("centerOnCursor", function(limit) { + var coords = this.cursorCoords(null, "local"); + if (this.getScrollerElement().clientHeight === 0 && limit !== 10) { + if (limit === undefined) limit = 1; + else limit += 1; + editor = this; + setTimeout(function() {editor.centerOnCursor()}, 100); + return; + } + clientHeight = (this.getScrollerElement().clientHeight / 2) + this.scrollTo(null, (coords.top + coords.bottom)/2 - 10); + });
    diff --git a/applications/admin/views/default/todolist.load b/applications/admin/views/default/todolist.load index 6d5bf494..00aceb92 100644 --- a/applications/admin/views/default/todolist.load +++ b/applications/admin/views/default/todolist.load @@ -7,7 +7,7 @@
  • {{=file['filename']}} ({{=len(file['matches'])}} TODO)
  • {{pass}}