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}}