many things have occured

This commit is contained in:
Matthew Scragg 2013-12-03 16:28:16 -06:00
parent db70df22a2
commit a9158f3d30
11 changed files with 36 additions and 142 deletions

View file

@ -148,7 +148,7 @@ manager = Manager(app)
# Flask extension objects # Flask extension objects
login_manager = LoginManager() login_manager = LoginManager()
login_manager.init_app(app) login_manager.init_app(app)
login_manager.login_view = 'login' login_manager.login_view = 'auth.login'
@login_manager.user_loader @login_manager.user_loader

View file

@ -98,7 +98,7 @@ class User(Base):
@classmethod @classmethod
def login(cls, id): def login(cls, id):
login_user(CurrentUser(id), True) login_user(CurrentUser(id), remember=True)
@classmethod @classmethod
def logout(cls): def logout(cls):

View file

@ -8,9 +8,9 @@ from realms.models import Site
blueprint = Blueprint('wiki', __name__) blueprint = Blueprint('wiki', __name__)
@blueprint.route("/wiki/_new/", methods=['GET', 'POST']) @blueprint.route("/wiki/new/", methods=['GET', 'POST'])
@login_required @login_required
def new_wiki(): def new():
if request.method == 'POST': if request.method == 'POST':
wiki_name = to_canonical(request.form['name']) wiki_name = to_canonical(request.form['name'])
@ -26,7 +26,7 @@ def new_wiki():
@blueprint.route("/wiki/_commit/<sha>/<name>") @blueprint.route("/wiki/_commit/<sha>/<name>")
def commit_sha(name, sha): def commit(name, sha):
cname = to_canonical(name) cname = to_canonical(name)
data = g.current_wiki.get_page(cname, sha=sha) data = g.current_wiki.get_page(cname, sha=sha)
@ -55,7 +55,7 @@ def revert():
@blueprint.route("/wiki/_history/<name>") @blueprint.route("/wiki/_history/<name>")
def history(name): def history(name):
history = g.current_wiki.get_history(name) history = g.current_wiki.get_history(name)
return render_template('wiki/history.html', name=name, history=history) return render_template('wiki/history.html', name=name, history=history, wiki_home=url_for('wiki.page'))
@blueprint.route("/wiki/_edit/<name>", methods=['GET', 'POST']) @blueprint.route("/wiki/_edit/<name>", methods=['GET', 'POST'])

View file

@ -1,6 +1,7 @@
$(function(){ $(function(){
// Cache some shit var url_prefix = "/wiki";
var $theme = $('#theme-list') var $theme = $('#theme-list')
, $preview = $('#preview') , $preview = $('#preview')
, $autosave = $('#autosave') , $autosave = $('#autosave')
@ -261,22 +262,11 @@ $(function(){
} }
/**
* Initialize theme and other options of Ace editor.
*
* @return {Void}
*/
function initAce(){ function initAce(){
editor = ace.edit("editor"); editor = ace.edit("editor");
editor.focus();
} }
/**
* Initialize various UI elements based on userprofile data.
*
* @return {Void}
*/
function initUi(){ function initUi(){
// Set proper theme value in theme dropdown // Set proper theme value in theme dropdown
fetchTheme(profile.theme, function(){ fetchTheme(profile.theme, function(){
@ -288,8 +278,6 @@ $(function(){
editor.getSession().setMode('ace/mode/markdown'); editor.getSession().setMode('ace/mode/markdown');
editor.getSession().setValue( profile.currentMd || editor.getSession().getValue()); editor.getSession().setValue( profile.currentMd || editor.getSession().getValue());
// Immediately populate the preview <div>
previewMd(); previewMd();
}); });
@ -309,26 +297,11 @@ $(function(){
} }
/// HANDLERS =================
/**
* Clear the markdown and text and the subsequent HTML preview.
*
* @return {Void}
*/
function clearSelection(){ function clearSelection(){
editor.getSession().setValue(""); editor.getSession().setValue("");
previewMd(); previewMd();
} }
// TODO: WEBSOCKET MESSAGE?
/**
* Save the markdown via localStorage - isManual is from a click or key event.
*
* @param {Boolean}
* @return {Void}
*/
function saveFile(isManual){ function saveFile(isManual){
updateUserProfile({currentMd: editor.getSession().getValue()}); updateUserProfile({currentMd: editor.getSession().getValue()});
@ -341,17 +314,12 @@ $(function(){
content: editor.getSession().getValue() content: editor.getSession().getValue()
}; };
$.post(window.location, data, function(){ $.post(window.location, data, function(){
location.href = "/" + data['name']; location.href = url_prefix + '/' + data['name'];
}); });
} }
} }
/**
* Enable autosave for a specific interval.
*
* @return {Void}
*/
function autoSave(){ function autoSave(){
if(profile.autosave.enabled) { if(profile.autosave.enabled) {
@ -371,11 +339,6 @@ $(function(){
}); });
/**
* Clear out user profile data in localStorage.
*
* @return {Void}
*/
function resetProfile(){ function resetProfile(){
// For some reason, clear() is not working in Chrome. // For some reason, clear() is not working in Chrome.
localStorage.clear(); localStorage.clear();
@ -387,11 +350,6 @@ $(function(){
window.location.reload(); window.location.reload();
} }
/**
* Dropbown nav handler to update the current theme.
*
* @return {Void}
*/
function changeTheme(e){ function changeTheme(e){
// check for same theme // check for same theme
var $target = $(e.target); var $target = $(e.target);
@ -409,14 +367,6 @@ $(function(){
} }
} }
// TODO: Maybe we just load them all once and stash in appcache?
/**
* Dynamically appends a script tag with the proper theme and then applies that theme.
*
* @param {String} The theme name
* @param {Function} Optional callback
* @return {Void}
*/
function fetchTheme(th, cb){ function fetchTheme(th, cb){
var name = th.split('/').pop(); var name = th.split('/').pop();
asyncLoad("/static/js/ace/theme-"+ name +".js", function() { asyncLoad("/static/js/ace/theme-"+ name +".js", function() {
@ -428,21 +378,10 @@ $(function(){
} }
/**
* Change the body background color based on theme.
*
* @param {String} The theme name
* @return {Void}
*/
function updateBg(name){ function updateBg(name){
// document.body.style.backgroundColor = bgColors[name] // document.body.style.backgroundColor = bgColors[name]
} }
/**
* Clientside update showing rendered HTML of Markdown.
*
* @return {Void}
*/
function previewMd(){ function previewMd(){
var unmd = editor.getSession().getValue() var unmd = editor.getSession().getValue()
@ -455,12 +394,6 @@ $(function(){
//refreshWordCount(); //refreshWordCount();
} }
/**
* Stash current file name in the user's profile.
*
* @param {String} Optional string to force the value
* @return {Void}
*/
function updateFilename(str){ function updateFilename(str){
// Check for string because it may be keyup event object // Check for string because it may be keyup event object
var f; var f;
@ -503,43 +436,23 @@ $(function(){
} }
/**
* Show a sad panda because they are using a shitty browser.
*
* @return {Void}
*/
function sadPanda(){ function sadPanda(){
// TODO: ACTUALLY SHOW A SAD PANDA. // TODO: ACTUALLY SHOW A SAD PANDA.
alert('Sad Panda - No localStorage for you!') alert('Sad Panda - No localStorage for you!')
} }
/**
* Toggles the autosave feature.
*
* @return {Void}
*/
function toggleAutoSave(){ function toggleAutoSave(){
$autosave.html( profile.autosave.enabled ? '<i class="icon-remove"></i>&nbsp;Disable Autosave' : '<i class="icon-ok"></i>&nbsp;Enable Autosave' ); $autosave.html( profile.autosave.enabled ? '<i class="icon-remove"></i>&nbsp;Disable Autosave' : '<i class="icon-ok"></i>&nbsp;Enable Autosave' );
updateUserProfile({autosave: {enabled: !profile.autosave.enabled }}); updateUserProfile({autosave: {enabled: !profile.autosave.enabled }});
autoSave(); autoSave();
} }
/**
* Bind keyup handler to the editor.
*
* @return {Void}
*/
function bindPreview(){ function bindPreview(){
editor.getSession().on('change', function(e) { editor.getSession().on('change', function(e) {
previewMd(); previewMd();
}); });
} }
/**
* Bind navigation elements.
*
* @return {Void}
*/
function bindNav(){ function bindNav(){
$theme $theme
@ -575,11 +488,7 @@ $(function(){
} // end bindNav() } // end bindNav()
/**
* Bind special keyboard handlers.
*
* @return {Void}
*/
function bindKeyboard(){ function bindKeyboard(){
// CMD+s TO SAVE DOC // CMD+s TO SAVE DOC
key('command+s, ctrl+s', function(e){ key('command+s, ctrl+s', function(e){
@ -605,14 +514,6 @@ $(function(){
}); });
/**
* Get scrollHeight of preview div
* (code adapted from https://github.com/anru/rsted/blob/master/static/scripts/editor.js)
*
* @param {Object} The jQuery object for the preview div
* @return {Int} The scrollHeight of the preview area (in pixels)
*/
function getScrollHeight($prevFrame) { function getScrollHeight($prevFrame) {
// Different browsers attach the scrollHeight of a document to different // Different browsers attach the scrollHeight of a document to different
// elements, so handle that here. // elements, so handle that here.
@ -626,12 +527,6 @@ function getScrollHeight($prevFrame) {
} }
} }
/**
* Scroll preview to match cursor position in editor session
* (code adapted from https://github.com/anru/rsted/blob/master/static/scripts/editor.js)
*
* @return {Void}
*/
function syncPreview() { function syncPreview() {
var $ed = window.ace.edit('editor'); var $ed = window.ace.edit('editor');

View file

@ -8,10 +8,10 @@
<title>Realms</title> <title>Realms</title>
<link rel="shortcut icon" href="{{ url_for('static', filename='img/favicon.ico') }}"> <link rel="shortcut icon" href="{{ url_for('static', filename='img/favicon.ico') }}">
<link href="/static/css/bootstrap/spacelab.css" rel="stylesheet"> <link href="{{ url_for('static', filename='css/bootstrap/spacelab.css') }}" rel="stylesheet">
<link href="/static/css/font-awesome.min.css" rel="stylesheet"> <link href="{{ url_for('static', filename='css/font-awesome.min.css') }}" rel="stylesheet">
<link href="/static/vendor/highlightjs/styles/github.css" rel="stylesheet"> <link href="{{ url_for('static', filename='vendor/highlightjs/styles/github.css') }}" rel="stylesheet">
<link href="/static/css/style.css" rel="stylesheet"> <link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet">
{% block css %}{% endblock %} {% block css %}{% endblock %}
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
@ -43,14 +43,14 @@
<i class="icon-caret-down"></i></a> <i class="icon-caret-down"></i></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li class="dropdown-header">Page Options</li> <li class="dropdown-header">Page Options</li>
<li><a href="/_create/">Create Page</a></li> <li><a href="{{ url_for('wiki.create') }}">Create Page</a></li>
{% if name %} {% if name %}
<li><a href="/_edit/{{ name }}">Edit Page</a></li> <li><a href="{{ url_for('wiki.edit', name=name) }}">Edit Page</a></li>
<li><a href="/_history/{{ name }}">History</a></li> <li><a href="{{ url_for('wiki.history', name=name) }}">History</a></li>
{% endif %} {% endif %}
<li class="divider"></li> <li class="divider"></li>
<li class="dropdown-header">Site Options</li> <li class="dropdown-header">Site Options</li>
<li><a href="/_new/">Create New Wiki</a></li> <li><a href="{{ url_for('wiki.new') }}">Create New Site</a></li>
</ul> </ul>
</li> </li>
@ -63,13 +63,13 @@
</span> </span>
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="/account">Account</a></li> <li><a href="{{ url_for('account') }}">Account</a></li>
<li><a href="/logout">Logout</a></li> <li><a href="{{ url_for('auth.logout') }}">Logout</a></li>
</ul> </ul>
</li> </li>
{% else %} {% else %}
<li><a href="/login"><i class="icon-user"></i> Login</a></li> <li><a href="{{ url_for('auth.login') }}"><i class="icon-user"></i> Login</a></li>
<li><a href="/register"><i class="icon-pencil"></i> Register</a></li> <li><a href="{{ url_for('auth.register') }}"><i class="icon-pencil"></i> Register</a></li>
{% endif %} {% endif %}
</ul> </ul>
</div><!--/.nav-collapse --> </div><!--/.nav-collapse -->

View file

@ -1,7 +1,7 @@
{% macro recaptcha(config) -%} {% macro recaptcha(config) -%}
<script> <script>
var RecaptchaOptions = { var RecaptchaOptions = {
theme : '{{ config.RECAPTCHA_OPTIONS['theme'] }}' theme : "{{ config.RECAPTCHA_OPTIONS['theme'] }}"
}; };
</script> </script>
<script src="http://www.google.com/recaptcha/api/challenge?k={{ config.RECAPTCHA_PUBLIC_KEY }}"> <script src="http://www.google.com/recaptcha/api/challenge?k={{ config.RECAPTCHA_PUBLIC_KEY }}">

View file

@ -3,18 +3,17 @@
<h2>History for <strong>{{ name }}</strong></h2> <h2>History for <strong>{{ name }}</strong></h2>
<div class="pull-right"> <div class="pull-right">
<a href="/_commit/{{ old }}/{{ name }}" class="btn btn-default btn-sm">View Old</a> <a href="{{ url_for('wiki.commit', name=name, sha=old) }}" class="btn btn-default btn-sm">View Old</a>
<a href="/_commit/{{ new }}/{{ name }}" class="btn btn-info btn-sm">View New</a> <a href="{{ url_for('wiki.commit', name=name, sha=new) }}" class="btn btn-info btn-sm">View New</a>
</div> </div>
<p> <p>
<a class="btn btn-default btn-sm" href="/_history/{{ name }}">Back to History</a> <a class="btn btn-default btn-sm" href="{{ url_for('wiki.history', name=name) }}">Back to History</a>
</p> </p>
{{ diff|safe }} {{ diff|safe }}
<p></p>
<p> <p>
<a class="btn btn-default btn-sm" href="/_history/{{ name }}">Back to History</a> <a class="btn btn-default btn-sm" href="{{ url_for('wiki.history', name=name) }}">Back to History</a>
</p> </p>
{% endblock %} {% endblock %}

View file

@ -4,7 +4,7 @@
<form role="form" method="post"> <form role="form" method="post">
<div class="form-group"> <div class="form-group">
<label for="name"></label> <label for="name"></label>
<input type="text" class="form-control" id="page" name="name" placeholder="Name" value="{{- name -}}" /> <input id="name" type="text" class="form-control" id="page" name="name" placeholder="Name" value="{{- name -}}" />
</div> </div>
<div class="form-group"> <div class="form-group">

View file

@ -55,7 +55,7 @@
<div id="app-controls" class="row"> <div id="app-controls" class="row">
<div class="col-xs-3"> <div class="col-xs-3">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon btn-info input-sm">realms.io/</span> <span class="input-group-addon btn-info input-sm">realms.io/wiki/</span>
<input id="page-name" type="text" class="form-control input-sm" name="name" placeholder="Name" value="{{- name -}}" /> <input id="page-name" type="text" class="form-control input-sm" name="name" placeholder="Name" value="{{- name -}}" />
</div> </div>
</div> </div>

View file

@ -21,7 +21,7 @@
<input type="checkbox" name="versions[]" value="{{ h.sha }}" /> <input type="checkbox" name="versions[]" value="{{ h.sha }}" />
</td> </td>
<td>{{ h.author }}</td> <td>{{ h.author }}</td>
<td><a href="/_commit/{{ h.sha }}/{{ name }}" class='label label-primary'>View</a> {{ h.message }} </td> <td><a href="{{ url_for('wiki.commit', name=name, sha=h.sha) }}" class='label label-primary'>View</a> {{ h.message }} </td>
<td>{{ h.time|datetime }}</td> <td>{{ h.time|datetime }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
@ -52,7 +52,7 @@ $(function(){
}); });
revs.reverse(); revs.reverse();
revs = revs.join(".."); revs = revs.join("..");
location.href = "/_compare/{{ name }}/" + revs; location.href = "{{ url_for('wiki.page') }}_compare/{{ name }}/" + revs;
}); });
}); });
</script> </script>

View file

@ -1,15 +1,15 @@
{% extends 'layout.html' %} {% extends 'layout.html' %}
{% block page_menu %} {% block page_menu %}
<div class="controls pull-right"> <div class="controls pull-right">
<a class="btn btn-default btn-sm" href="/_edit/{{ name }}">Edit</a> <a class="btn btn-default btn-sm" href="{{ url_for('wiki.edit', name=name) }}">Edit</a>
<a class="btn btn-default btn-sm" href="/_history/{{ name }}">History</a> <a class="btn btn-default btn-sm" href="{{ url_for('wiki.history', name=name) }}">History</a>
</div> </div>
{% endblock %} {% endblock %}
{% block body %} {% block body %}
{% if commit %} {% if commit %}
<div id="page-action-bar"> <div id="page-action-bar">
<form method="POST" action="/_revert"> <form method="POST" action="{{ url_for('wiki.revert') }}">
<input type="hidden" value="{{ name }}" name="name" /> <input type="hidden" value="{{ name }}" name="name" />
<input type="hidden" value="{{ commit }}" name="commit" /> <input type="hidden" value="{{ commit }}" name="commit" />
<input type="submit" class="btn btn-danger btn-sm" title="Revert back to this revision" value="Revert" /> <input type="submit" class="btn btn-danger btn-sm" title="Revert back to this revision" value="Revert" />