code folding in editor settings

This commit is contained in:
ilvalle
2013-10-19 12:22:24 +02:00
parent e9c884d674
commit b5f17b1acb
5 changed files with 47 additions and 18 deletions
+2 -2
View File
@@ -563,7 +563,7 @@ def edit():
# Load json only if it is ajax edited... # Load json only if it is ajax edited...
app = get_app(request.vars.app) app = get_app(request.vars.app)
app_path = apath(app, r=request) app_path = apath(app, r=request)
editor_defaults={'theme':'web2py', 'editor': 'default', 'closetag': 'true'} editor_defaults={'theme':'web2py', 'editor': 'default', 'closetag': 'true', 'codefolding': 'false'}
config = Config(os.path.join(request.folder, 'settings.cfg'), config = Config(os.path.join(request.folder, 'settings.cfg'),
section='editor', default_values=editor_defaults) section='editor', default_values=editor_defaults)
preferences = config.read() preferences = config.read()
@@ -580,7 +580,7 @@ def edit():
response.headers["web2py-component-flash"] = T('Preferences saved correctly') response.headers["web2py-component-flash"] = T('Preferences saved correctly')
else: else:
response.headers["web2py-component-flash"] = T('Preferences saved on session only') response.headers["web2py-component-flash"] = T('Preferences saved on session only')
response.headers["web2py-component-command"] = "update_editor('%s', '%s', '%s');jQuery('a[href=#editor_settings] button.close').click();" % (config.read()['theme'], config.read()['editor'], config.read()['closetag']) response.headers["web2py-component-command"] = "update_editor('%(theme)s', '%(editor)s', %(closetag)s, %(codefolding)s);jQuery('a[href=#editor_settings] button.close').click();" % (config.read())
return return
else: else:
details = {'filename':'settings', 'id':'editor_settings', 'force': False} details = {'filename':'settings', 'id':'editor_settings', 'force': False}
@@ -1,12 +1,26 @@
CodeMirror.registerHelper("fold", "indent", function(cm, start) { CodeMirror.registerHelper("fold", "indent", function(cm, start) {
var tabSize = cm.getOption("tabSize"), firstLine = cm.getLine(start.line); var lastLine = cm.lastLine(),
var myIndent = CodeMirror.countColumn(firstLine, null, tabSize); tabSize = cm.getOption("tabSize"),
for (var i = start.line + 1, end = cm.lineCount(); i < end; ++i) { firstLine = cm.getLine(start.line),
var curLine = cm.getLine(i); myIndent = CodeMirror.countColumn(firstLine, null, tabSize);
if (CodeMirror.countColumn(curLine, null, tabSize) < myIndent &&
CodeMirror.countColumn(cm.getLine(i-1), null, tabSize) > myIndent) function foldEnded(curColumn, prevColumn) {
return curColumn < myIndent ||
(curColumn == myIndent && prevColumn >= myIndent) ||
(curColumn > myIndent && i == lastLine);
}
for (var i = start.line + 1; i <= lastLine; i++) {
var curColumn = CodeMirror.countColumn(cm.getLine(i), null, tabSize);
var prevColumn = CodeMirror.countColumn(cm.getLine(i-1), null, tabSize);
if (foldEnded(curColumn, prevColumn)) {
var lastFoldLineNumber = curColumn > myIndent && i == lastLine ? i : i-1;
var lastFoldLine = cm.getLine(lastFoldLineNumber);
return {from: CodeMirror.Pos(start.line, firstLine.length), return {from: CodeMirror.Pos(start.line, firstLine.length),
to: CodeMirror.Pos(i, curLine.length)}; to: CodeMirror.Pos(lastFoldLineNumber, lastFoldLine.length)};
}
} }
}); });
CodeMirror.indentRangeFinder = CodeMirror.fold.indent; // deprecated CodeMirror.indentRangeFinder = CodeMirror.fold.indent; // deprecated
+12 -5
View File
@@ -37,6 +37,13 @@
<script src="{{=cm}}/addon/selection/active-line.js"></script> <script src="{{=cm}}/addon/selection/active-line.js"></script>
<script src="{{=cm}}/addon/display/fullscreen.js"></script> <script src="{{=cm}}/addon/display/fullscreen.js"></script>
<link rel="stylesheet" href="{{=cm}}/addon/display/fullscreen.css"> <link rel="stylesheet" href="{{=cm}}/addon/display/fullscreen.css">
<script src="{{=cm}}/addon/fold/brace-fold.js"></script>
<script src="{{=cm}}/addon/fold/comment-fold.js"></script>
<script src="{{=cm}}/addon/fold/foldcode.js"></script>
<script src="{{=cm}}/addon/fold/foldgutter.js"></script>
<script src="{{=cm}}/addon/fold/indent-fold.js"></script>
<script src="{{=cm}}/addon/fold/xml-fold.js"></script>
<link rel="stylesheet" href="{{=cm}}/addon/fold/foldgutter.css">
<script src="{{=cm}}/emmet.min.js"></script> <script src="{{=cm}}/emmet.min.js"></script>
<script src="{{=URL('static','js/ajax_editor.js')}}"></script> <script src="{{=URL('static','js/ajax_editor.js')}}"></script>
<link rel="stylesheet" href="{{=URL('static/css','typeahead.js-bootstrap.css')}}"> <link rel="stylesheet" href="{{=URL('static/css','typeahead.js-bootstrap.css')}}">
@@ -49,6 +56,7 @@ var current_editor = "{{=editor_settings['editor']}}"; //Default editor
{{else:}} {{else:}}
var current_closetag = false; //Default closetag var current_closetag = false; //Default closetag
{{pass}} {{pass}}
var current_codefolding = {{=editor_settings['codefolding']}}; //Default codefolding
var current_font_incr = 0; // Default font-size, 0 means don't set var current_font_incr = 0; // Default font-size, 0 means don't set
jQuery(document).on('shown click', 'a[data-toggle="tab"]', function (e) { jQuery(document).on('shown click', 'a[data-toggle="tab"]', function (e) {
@@ -102,7 +110,7 @@ jQuery(document).on('click', 'a.editor_filelink, a#editor_settingslink', functio
load_file(url); load_file(url);
}); });
function update_editor(editor_theme, editor_name, editor_closetag) { function update_editor(editor_theme, editor_name, editor_closetag, editor_codefolding) {
var href = "{{="%s/theme/" % cm}}" + editor_theme + ".css"; var href = "{{="%s/theme/" % cm}}" + editor_theme + ".css";
var link = jQuery("<link>"); var link = jQuery("<link>");
link.attr({ link.attr({
@@ -122,15 +130,14 @@ function update_editor(editor_theme, editor_name, editor_closetag) {
} }
current_theme = editor_theme; current_theme = editor_theme;
current_editor = editor_name; current_editor = editor_name;
switch (editor_closetag){ current_codefolding = editor_codefolding;
case 'true': current_closetag = true; break; current_closetag = editor_closetag;
case 'false': current_closetag = false;
}
jQuery('textarea[name="data"]') .each(function(id, ta) { jQuery('textarea[name="data"]') .each(function(id, ta) {
editor = jQuery(ta).data('editor'); editor = jQuery(ta).data('editor');
editor.setOption("theme", current_theme); editor.setOption("theme", current_theme);
editor.setOption("keyMap", current_editor); editor.setOption("keyMap", current_editor);
editor.setOption("autoCloseTags", current_closetag); editor.setOption("autoCloseTags", current_closetag);
editor.setOption("foldGutter", current_codefolding);
}); });
} }
@@ -54,15 +54,18 @@
theme: current_theme, theme: current_theme,
tabMode: "shift", tabMode: "shift",
lineWrapping: true, lineWrapping: true,
gutters: ["CodeMirror-linenumbers", "breakpoints"], foldGutter: current_codefolding,
gutters: ["CodeMirror-linenumbers", "breakpoints", "CodeMirror-foldgutter"],
keyMap: current_editor, keyMap: current_editor,
matchBrackets: true, matchBrackets: true,
autofocus: false, autofocus: false,
height: "350px", height: "350px",
showTrailingSpace: true showTrailingSpace: true
}); });
editor.foldCode(CodeMirror.Pos(8, 0));
editor.on("gutterClick", function(cm, n) { editor.on("gutterClick", function(cm, n, gutter) {
if (gutter !== "breakpoints" ) return;
var info = cm.lineInfo(n); var info = cm.lineInfo(n);
cm.setGutterMarker(n, "breakpoints", info.gutterMarkers ? null : makeMarker()); cm.setGutterMarker(n, "breakpoints", info.gutterMarkers ? null : makeMarker());
sel = {start: n, end: n, data: ''}; sel = {start: n, end: n, data: ''};
@@ -7,7 +7,8 @@
}} }}
{{themes = [f[:-4] for f in listfiles('admin', "static/codemirror/theme", regexp='.*\.css$' )]}} {{themes = [f[:-4] for f in listfiles('admin', "static/codemirror/theme", regexp='.*\.css$' )]}}
{{editors = ['default', 'vim', 'emacs']}} {{editors = ['default', 'vim', 'emacs']}}
{{closetag = ['true', 'false']}} {{booleanOptions = ['true', 'false']}}
<form id="editor_settings_form" class="form-horizontal"> <form id="editor_settings_form" class="form-horizontal">
<div class="control-group"> <div class="control-group">
<label class="control-label" for="selectTheme">{{=T('Theme')}}</label> <label class="control-label" for="selectTheme">{{=T('Theme')}}</label>
@@ -19,7 +20,11 @@
</div> </div>
<div class="control-group"> <div class="control-group">
<label class="control-label" for="closeTag">{{=T('Enable Close-Tag')}}</label> <label class="control-label" for="closeTag">{{=T('Enable Close-Tag')}}</label>
<div class="controls">{{=SELECT(closetag, value=editor_settings['closetag'], _name="closetag" )}}</div> <div class="controls">{{=SELECT(booleanOptions, value=editor_settings['closetag'], _name="closetag" )}}</div>
</div>
<div class="control-group">
<label class="control-label" for="codefolding">{{=T('Enable Code Folding')}}</label>
<div class="controls">{{=SELECT(booleanOptions, value=editor_settings['codefolding'], _name="codefolding" )}}</div>
</div> </div>
<div class="control-group"> <div class="control-group">
<div class="controls"><button type="submit" class="disabled btn btn-primary">{{=T('Save')}}</button></div> <div class="controls"><button type="submit" class="disabled btn btn-primary">{{=T('Save')}}</button></div>