t -m "editor cleanup, thanks Paolo"

Merge branch 'master' of github.com:web2py/web2py
This commit is contained in:
Massimo
2013-10-18 12:31:13 -05:00
7 changed files with 63 additions and 270 deletions

View File

@@ -568,19 +568,10 @@ def edit():
section='editor', default_values=editor_defaults)
preferences = config.read()
if not(request.ajax):
if not(request.ajax) and not(is_mobile):
# return the scaffolding, the rest will be through ajax requests
response.title = T('Editing %s') % app
editarea_preferences = {}
editarea_preferences['FONT_SIZE'] = '10'
editarea_preferences['FULL_SCREEN'] = 'false'
editarea_preferences['ALLOW_TOGGLE'] = 'true'
editarea_preferences['REPLACE_TAB_BY_SPACES'] = '4'
editarea_preferences['DISPLAY'] = 'onload'
for key in editarea_preferences:
if key in globals():
editarea_preferences[key] = globals()[key]
return response.render ('default/edit.html', dict(app=request.args[0], editor_settings=preferences, editarea_preferences=editarea_preferences))
return response.render ('default/edit.html', dict(app=request.args[0], editor_settings=preferences))
# show settings tab and save prefernces
if 'settings' in request.vars:
@@ -615,7 +606,7 @@ def edit():
elif filename[-4:] == '.css':
filetype = 'css'
elif filename[-3:] == '.js':
filetype = 'js'
filetype = 'javascript'
else:
filetype = 'html'
@@ -769,7 +760,10 @@ def edit():
force= True if (request.vars.restore or request.vars.revert) else False)
plain_html = response.render('default/edit_js.html', file_details)
file_details['plain_html'] = plain_html
return response.json(file_details)
if is_mobile:
return response.render('default.mobile/edit.html', file_details, editor_settings=preferences)
else:
return response.json(file_details)
def resolve():

View File

@@ -8,42 +8,6 @@ WEB2PY_VERSION_URL = WEB2PY_URL + '/examples/default/version'
# the user-interface feature that allows you to edit files in your web
# browser.
## Default editor (to change editor you need web2py.admin.editors.zip)
## old editors like 'ace' or 'edit_area' or 'amy' are no longer supported
TEXT_EDITOR = 'codemirror'
## Editor Color scheme (only for ace)
TEXT_EDITOR_THEME = (
"chrome", "clouds", "clouds_midnight", "cobalt", "crimson_editor", "dawn",
"dreamweaver", "eclipse", "idle_fingers", "kr_theme", "merbivore",
"merbivore_soft", "monokai", "mono_industrial", "pastel_on_dark",
"solarized_dark", "solarized_light", "textmate", "tomorrow",
"tomorrow_night", "tomorrow_night_blue", "tomorrow_night_bright",
"tomorrow_night_eighties", "twilight", "vibrant_ink")[0]
## Editor Keyboard bindings (only for ace and codemirror)
TEXT_EDITOR_KEYBINDING = '' # 'emacs' or 'vi'
### edit_area only
# The default font size, measured in 'points'. The value must be an integer > 0
FONT_SIZE = 10
# Displays the editor in full screen mode. The value must be 'true' or 'false'
FULL_SCREEN = 'false'
# Display a check box under the editor to allow the user to switch
# between the editor and a simple
# HTML text area. The value must be 'true' or 'false'
ALLOW_TOGGLE = 'true'
# Replaces tab characters with space characters.
# The value can be 'false' (meaning that tabs are not replaced),
# or an integer > 0 that specifies the number of spaces to replace a tab with.
REPLACE_TAB_BY_SPACES = 4
# Toggle on/off the code editor instead of textarea on startup
DISPLAY = "onload" or "later"
# if demo mode is True then admin works readonly and does not require login
DEMO_MODE = False

View File

@@ -1,77 +0,0 @@
<style>
.acw-chap pre, .acw-chap pre span, span.acw-char-check, .acw-chap .selection-area div
{
font:11px 'Courier', monospaced;
line-height:11px;
margin:0;
padding:0;
border:0;
}
.acw-chap .wrapped-row
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-wrapped-row.gif');
background-repeat:no-repeat;
background-position:25px 4px;
}
.acw-chap .sidebar
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-bg-sidebar.gif');
line-height:11px;
}
.acw-chap .sidebar .row-number
{
text-align:right;
font-size:9px;
font-family:'Lucida Grande', Verdana, Arial, Helvetica, sans-serif;
color:#999;
}
.acw-chap .folding-expand-inner
{
width:14px;
height:10px;
margin-left:2px;
display:inline;
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-folding-expand-inner.gif');
}
.acw-chap .folding-expand
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-folding-expand.gif');
}
.acw-chap .folding-start
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-folding-start.gif');
}
.acw-chap .folding-stop
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-folding-stop.gif');
}
.acw-chap .bookmark-default
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-bookmark-default.gif');
}
.acw-chap .void
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/void.gif');
}
</style>
<script src="{{=URL(r=request,c='static',f='eamy/eamy.js')}}" type="text/javascript"></script>
<script src="{{=URL(r=request,c='static',f='js/jquery.hotkeys.js')}}" type="text/javascript" charset="utf-8"></script>
{{if request.args[1]=="views":}}
<script src="{{=URL(r=request,c='static',f='eamy/bundle_markup.js')}}" type="text/javascript"></script>
{{else:}}
<script src="{{=URL(r=request,c='static',f='eamy/bundle_python.js')}}" type="text/javascript"></script>
{{pass}}
<script language="Javascript" type="text/javascript" src="/{{=request.application}}/static/js/ajax_editor.js"></script>
<script language="Javascript" type="text/javascript">
jQuery(document).ready(function(){
setTimeout("keepalive('{{=URL('keepalive')}}')",10000);
});
jQuery(document).bind('keydown', 'alt+f1',function (evt){
doClickSave();
});
</script>

View File

@@ -1,55 +1,41 @@
{{extend 'default.mobile/layout.html'}}
{{
def shortcut(combo, description):
return XML('<li><tt>%s</tt> %s</li>' % (combo, description))
}}
{{if TEXT_EDITOR == 'amy':}}
{{include 'default/amy_ajax.html'}}
<script>
var current_theme = "{{=editor_settings['theme']}}"; //Default theme
var current_editor = "{{=editor_settings['editor']}}"; //Default editor
{{if editor_settings['closetag'] == 'true':}}
var current_closetag = true; //Default closetag
{{else:}}
<script language="Javascript" type="text/javascript" src="{{=URL(r=request,c='static',f='edit_area/edit_area_full.js')}}"></script><script language="Javascript" type="text/javascript">
editAreaLoader.init({id: "body",start_highlight: true,allow_resize: "both",allow_toggle: {{=editarea_preferences['ALLOW_TOGGLE']}},language: "en",syntax: "{{=filetype}}",replace_tab_by_spaces: {{=editarea_preferences['REPLACE_TAB_BY_SPACES']}}, font_size: {{=editarea_preferences['FONT_SIZE']}}, fullscreen: {{=editarea_preferences['FULL_SCREEN']}}, display: "{{=editarea_preferences['DISPLAY']}}", show_line_colors: true, word_wrap: true, save_callback: "doClickSave" {{if filetype=='html':}},plugins: "zencoding"{{pass}} });
</script>
<script language="Javascript" type="text/javascript" src="{{=URL('static','js/ajax_editor.js')}}"></script>
<script language="Javascript" type="text/javascript">
jQuery(document).ready(function(){
setTimeout("keepalive('{{=URL('keepalive')}}')",10000);
});
</script>
var current_closetag = false; //Default closetag
{{pass}}
{{block sectionclass}}edit {{filename}}{{end}}
{{if functions:}}
<p>
<span style="text-align:left;" id="exposed">
{{=B(T('exposes:'))}}{{=XML(', '.join([A(f,_href=URL(a=app,c=controller,f=f)).xml() for f in functions]))}}
</span>
{{if editviewlinks:}}<br/>
{{=B(T('edit views:'))}}
{{=XML(', '.join([v.xml() for v in editviewlinks]))}}
{{pass}}
</p>
{{pass}}
<div id="editor_area">
<form action="{{=URL('edit',args=filename)}}" method="post" name="editform" id="editform">
<a value="save" name="save" onclick="return doClickSave();">
{{=IMG(_src=URL('static', 'images/save_icon.png'), _alt=T('Save'))}}
</a>
{{=T('Saved file hash:')}}
<input type="input" name="file_hash" value="{{=file_hash}}" readonly="readonly"/>
{{=T('Last saved on:')}} <input type="input" name="saved_on" value="{{=saved_on}}" readonly="readonly"/>
{{if TEXT_EDITOR=='amy':}}
<textarea style="width: auto; height:400px;direction:ltr;" rows="58" cols="100" -amy-enabled="true" id="body" name="data">{{=data}}</textarea>
{{else:}}
<textarea cols="80" rows="25" id="body" style="direction:ltr;" name="data">{{=data}}</textarea>
{{pass}}
<button onclick="window.location.reload(); return false">{{=T('restore')}}</button>
<button type="submit" name="revert">{{=T('revert')}}</button>
<br/>
</form>
</div>
var current_font_incr = 0; // Default font-size, 0 means don't set
</script>
{{cm=URL('static%s' % (response.static_version and '/_' + response.static_version or ''),'codemirror')}}
<link rel="stylesheet" href="{{=cm}}/lib/codemirror.css">
<link rel="stylesheet" href="{{='%s/theme/%s.css' % (cm, editor_settings['theme'])}}">
<script src="{{=cm}}/lib/codemirror.js"></script>
<script src="{{=cm}}/addon/edit/matchbrackets.js"></script>
<script src="{{=cm}}/addon/edit/closetag.js"></script>
{{if editor_settings['editor'] != 'default':}}<script src="{{='%s/keymap/%s.js' % (cm, editor_settings['editor'])}}"></script>{{pass}}
<script src="{{=cm}}/mode/python/python.js"></script>
<script src="{{=cm}}/mode/xml/xml.js"></script>
<script src="{{=cm}}/mode/css/css.js"></script>
<script src="{{=cm}}/mode/javascript/javascript.js"></script>
<script src="{{=cm}}/mode/htmlmixed/htmlmixed.js"></script>
<script src="{{=cm}}/addon/hint/show-hint.js"></script>
<script src="{{=cm}}/addon/hint/python-hint.js"></script>
<link rel="stylesheet" href="{{=cm}}/addon/hint/show-hint.css">
<script src="{{=cm}}/addon/search/search.js"></script>
<script src="{{=cm}}/addon/search/searchcursor.js"></script>
<script src="{{=cm}}/addon/dialog/dialog.js"></script>
<script src="{{=cm}}/addon/edit/trailingspace.js"></script>
<link rel="stylesheet" href="{{=cm}}/addon/dialog/dialog.css">
<script src="{{=cm}}/addon/selection/active-line.js"></script>
<script src="{{=cm}}/addon/display/fullscreen.js"></script>
<link rel="stylesheet" href="{{=cm}}/addon/display/fullscreen.css">
<script src="{{=cm}}/emmet.min.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','web2py-codemirror.css')}}">
<div id='edit_placeholder'><div id="{{=id}}" class="tab-pane active" >{{=XML(plain_html)}}</div></div>

View File

@@ -1,77 +0,0 @@
<style>
.acw-chap pre, .acw-chap pre span, span.acw-char-check, .acw-chap .selection-area div
{
font:11px 'Courier', monospaced;
line-height:11px;
margin:0;
padding:0;
border:0;
}
.acw-chap .wrapped-row
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-wrapped-row.gif');
background-repeat:no-repeat;
background-position:25px 4px;
}
.acw-chap .sidebar
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-bg-sidebar.gif');
line-height:11px;
}
.acw-chap .sidebar .row-number
{
text-align:right;
font-size:9px;
font-family:'Lucida Grande', Verdana, Arial, Helvetica, sans-serif;
color:#999;
}
.acw-chap .folding-expand-inner
{
width:14px;
height:10px;
margin-left:2px;
display:inline;
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-folding-expand-inner.gif');
}
.acw-chap .folding-expand
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-folding-expand.gif');
}
.acw-chap .folding-start
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-folding-start.gif');
}
.acw-chap .folding-stop
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-folding-stop.gif');
}
.acw-chap .bookmark-default
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/chap-bookmark-default.gif');
}
.acw-chap .void
{
background-image:url('{{=URL(r=request,c='static',f='eamy')}}/void.gif');
}
</style>
<script src="{{=URL(r=request,c='static',f='eamy/eamy.js')}}" type="text/javascript"></script>
<script src="{{=URL(r=request,c='static',f='js/jquery.hotkeys.js')}}" type="text/javascript" charset="utf-8"></script>
{{if request.args[1]=="views":}}
<script src="{{=URL(r=request,c='static',f='eamy/bundle_markup.js')}}" type="text/javascript"></script>
{{else:}}
<script src="{{=URL(r=request,c='static',f='eamy/bundle_python.js')}}" type="text/javascript"></script>
{{pass}}
<script language="Javascript" type="text/javascript" src="/{{=request.application}}/static/js/ajax_editor.js"></script>
<script language="Javascript" type="text/javascript">
jQuery(document).ready(function(){
setTimeout("keepalive('{{=URL('keepalive')}}')",10000);
});
jQuery(document).bind('keydown', 'alt+f1',function (evt){
doClickSave();
});
</script>

View File

@@ -78,7 +78,7 @@
return marker;
}
{{if filetype in ('html', 'js', 'css'):}}
{{if filetype in ('html', 'javascript', 'css'):}}
// must be here or break emmet/zencoding
CodeMirror.defaults.extraKeys["Ctrl-S"] =
function(instance) {
@@ -137,7 +137,7 @@
<div class="row-fluid">
<div class="help alert alert-block alert-info">
{{if TEXT_EDITOR == 'codemirror' and filetype=='html':}}
{{if filetype=='html':}}
<h3>{{=T('Key bindings for ZenCoding Plugin')}}</h3>
<ul class="keybindings unstyled">
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
@@ -150,15 +150,15 @@
{{=shortcut('Shift-Ctrl-R / Shift-Cmd-Option-F', T('Replace All'))}}
{{=shortcut('Tab', T('Expand Abbreviation'))}}
</ul>
{{elif TEXT_EDITOR == 'codemirror':}}
{{else:}}
<h3>{{=T("Key bindings")}}</h3>
<ul class="keybindings unstyled">
{{=shortcut('Ctrl+S', T('Save via Ajax'))}}
{{=shortcut('Ctrl+F11', T('Toggle Fullscreen'))}}
{{=shortcut('Shift+Esc', T('Exit Fullscreen'))}}
{{if filetype=='python':}}
{{=shortcut('Ctrl-Space', T('Autocomplete Python Code'))}}
{{pass}}
{{=shortcut('Ctrl-Space', T('Autocomplete Python Code'))}}
{{pass}}
{{=shortcut('Ctrl-F / Cmd-F', T('Start searching'))}}
{{=shortcut('Ctrl-G / Cmd-G', T('Find Next'))}}
{{=shortcut('Shift-Ctrl-G / Shift-Cmd-G', T('Find Previous'))}}

View File

@@ -9,18 +9,21 @@
{{editors = ['default', 'vim', 'emacs']}}
{{closetag = ['true', 'false']}}
<form id="editor_settings_form" class="form-horizontal">
<div class="control-group">
<label class="control-label" for="selectTheme">{{=T('Theme')}}</label>
<div class="controls">{{=SELECT(themes, value=editor_settings['theme'], _name="theme" )}}</div>
<label class="control-label" for="selectEditor">{{=T('Editor')}}</label>
<div class="controls">{{=SELECT(editors, value=editor_settings['editor'], _name="editor" )}}</div>
<label class="control-label" for="closeTag">{{=T('Enable Close-Tag')}}</label>
<div class="controls">{{=SELECT(closetag, value=editor_settings['closetag'], _name="closetag" )}}</div>
</div>
<div class="control-group">
<div class="controls"><button type="submit" class="disabled btn btn-primary">{{=T('Save')}}</button></div>
</div>
<div class="control-group">
<label class="control-label" for="selectTheme">{{=T('Theme')}}</label>
<div class="controls">{{=SELECT(themes, value=editor_settings['theme'], _name="theme" )}}</div>
</div>
<div class="control-group">
<label class="control-label" for="selectEditor">{{=T('Editor')}}</label>
<div class="controls">{{=SELECT(editors, value=editor_settings['editor'], _name="editor" )}}</div>
</div>
<div class="control-group">
<label class="control-label" for="closeTag">{{=T('Enable Close-Tag')}}</label>
<div class="controls">{{=SELECT(closetag, value=editor_settings['closetag'], _name="closetag" )}}</div>
</div>
<div class="control-group">
<div class="controls"><button type="submit" class="disabled btn btn-primary">{{=T('Save')}}</button></div>
</div>
</form>
<script>
web2py_trap_form("{{=URL('default', 'edit', args=request.args, vars={'settings':True})}}", "editor_settings");