Browse Source

use hashes for posts rather than increments

pull/1/head
wes 8 years ago
parent
commit
e81e568d7c
  1. 36
      src/posts.py
  2. 8
      src/scripts/app.tag
  3. 62
      src/scripts/post.tag
  4. 4
      src/scripts/postcontrols.tag
  5. 22
      src/scripts/projects.tag
  6. 24
      src/styles/riotblog.scss
  7. 2
      src/templates/index.html
  8. 28
      src/website.py

36
src/posts.py

@ -33,9 +33,36 @@ class Posts:
print("post was saved %s" % doc) print("post was saved %s" % doc)
return jsonify(self.db.save(doc)) return jsonify(self.db.save(doc))
def getposts(self, limit, start): def getpost(self, _id):
result = self.db.iterview("blogPosts/blog-posts", 10, include_docs=True, limit=limit, skip=start) results = self.db.iterview("blogPosts/blog-posts", 1, include_docs=True, key=_id)
return jsonify(list(result)) return jsonify([result.doc for result in results][0])
def iterpost(self, endkey=False, startkey=False):
if startkey and not endkey:
results = self.db.iterview("blogPosts/blog-posts", 2, include_docs=True, startkey=startkey)
elif endkey and not startkey:
results = self.db.iterview("blogPosts/blog-posts", 1, include_docs=True, endkey=endkey)
else:
results = self.db.iterview("blogPosts/blog-posts", 2, include_docs=True)
doc_ids = [result.doc for result in results]
if not doc_ids:
return jsonify(False)
if endkey and not startkey:
if len(doc_ids) < 2 or doc_ids[0] == endkey:
return jsonify(False)
return jsonify(doc_ids[-2])
if len(doc_ids) == 1:
return jsonify(doc_ids[0])
if doc_ids:
# if no startkey or endkey were specified, return the 0th post
return jsonify(doc_ids[1 if startkey else 0])
return jsonify(False)
def allposts(self): def allposts(self):
result = self.db.iterview("blogPosts/blog-posts", 10, include_docs=True) result = self.db.iterview("blogPosts/blog-posts", 10, include_docs=True)
@ -50,9 +77,6 @@ class Posts:
return jsonify(posts) return jsonify(posts)
def getpost(self, _id):
return jsonify(self.db[_id])
def delete(self, _id): def delete(self, _id):
doc = self.db[_id] doc = self.db[_id]
try: try:

8
src/scripts/app.tag

@ -54,7 +54,7 @@ this.route = route;
this.riot = riot; this.riot = riot;
this.state = { this.state = {
"pid" : 1, "_id" : false,
"projects" : Z.empty, "projects" : Z.empty,
"loaded" : false "loaded" : false
}; };
@ -80,9 +80,9 @@ var projects = activate("projects");
var about = activate("about"); var about = activate("about");
var links = activate("links"); var links = activate("links");
function posts(pid) { function posts(_id) {
console.log(self.state); console.log(self.state);
self.state.pid = parseInt(pid, 10); self.state._id = _id;
activate("posts")(); activate("posts")();
self.update(); self.update();
} }
@ -100,7 +100,7 @@ to(name) {
this.route("/", self.to("posts")); this.route("/", self.to("posts"));
this.route("posts/*", posts); this.route("posts/*", posts);
this.route("posts", (() => {posts(self.state.pid)})); this.route("posts", (() => {posts(self.state._id)}));
this.route("projects", projects); this.route("projects", projects);
this.route("about", about); this.route("about", about);
this.route("links", links); this.route("links", links);

62
src/scripts/post.tag

@ -14,7 +14,6 @@
</div> </div>
<div <div
data-is="postcontrols" data-is="postcontrols"
state={this.opts.state}
prevloading={this.prevloading} prevloading={this.prevloading}
prev={this.prev} prev={this.prev}
nomore={this.nomore} nomore={this.nomore}
@ -38,6 +37,7 @@ var self = this;
self.route = route; self.route = route;
self._id = "";
self.author = ""; self.author = "";
self.title = ""; self.title = "";
self.content = ""; self.content = "";
@ -47,7 +47,7 @@ self.transition = "";
self.nomore = false; self.nomore = false;
self.content = ""; self.content = "";
self.swipe = false; self.swipe = false;
self.loading = !self.opts.state.loaded; self.loading = self.opts.state.loaded;
prev(ev) { prev(ev) {
ev.preventDefault(); ev.preventDefault();
@ -55,13 +55,8 @@ prev(ev) {
return; return;
} }
self.prevloading = " loader-branded"; self.prevloading = " loader-branded";
if (self.opts.state.pid > 1) {
self.opts.state.pid--;
self.update();
}
self.update({"swipe" : !self.swipe}); self.update({"swipe" : !self.swipe});
self.setPost(self.opts.state.pid, "fadeIn"); self.prevPost(self._id, "fadeIn");
} }
next(ev) { next(ev) {
@ -71,19 +66,13 @@ next(ev) {
} }
self.nextloading = " loader-branded"; self.nextloading = " loader-branded";
if (!self.nomore) { if (!self.nomore) {
self.opts.state.pid++;
self.update(); self.update();
} }
self.update({"swipe" : !self.swipe}); self.update({"swipe" : !self.swipe});
self.setPost(self.opts.state.pid, "fadeIn"); self.nextPost(self._id, "fadeIn");
} }
setPost(pid, transition) { updatePost(body, transition) {
self.update({"loading" : self.opts.state.loaded});
fetch(`/blog/switchpost/${pid-1}`)
.then((resp) => resp.text())
.then(
(body) => {
if (body === "false") { if (body === "false") {
self.nomore = true; self.nomore = true;
self.prevloading = ""; self.prevloading = "";
@ -94,21 +83,20 @@ setPost(pid, transition) {
} }
else { else {
var postcontent = JSON.parse(body); var postcontent = JSON.parse(body);
if (postcontent.length == 0) { if (!postcontent) {
self.prevloading = ""; self.prevloading = "";
self.nextloading = ""; self.nextloading = "";
self.nomore = true; self.nomore = true;
self.swipe = !self.swipe; self.swipe = !self.swipe;
self.transition = ""; self.transition = "";
self.opts.state.pid--;
self.loading = false; self.loading = false;
self.update(); self.update();
return; return;
} }
self.opts.state.pid = pid; self._id = postcontent._id.slice(-8);
self.author = postcontent[0].doc.author; self.author = postcontent.author;
self.content = postcontent[0].doc.content; self.content = postcontent.content;
self.title = postcontent[0].doc.title; self.title = postcontent.title;
self.transition = transition; self.transition = transition;
self.swipe = !self.swipe; self.swipe = !self.swipe;
self.nomore = false; self.nomore = false;
@ -118,12 +106,36 @@ setPost(pid, transition) {
self.prevloading = ""; self.prevloading = "";
self.nextloading = ""; self.nextloading = "";
self.route(`/posts/${self.opts.state.pid}`); self.route(`/posts/${self._id}`);
self.update(); self.update();
});
} }
this.setPost(this.opts.state.pid); nextPost(_id, transition) {
fetch(`/blog/switchpost/${_id.slice(-8)}`)
.then((resp) => resp.text())
.then((resp) => { self.updatePost(resp, transition) })
}
prevPost(_id, transition) {
fetch(`/blog/prevpost/${_id.slice(-8)}`)
.then((resp) => resp.text())
.then((resp) => { self.updatePost(resp, transition) })
}
getPost(_id, transition) {
var url;
if (_id !== undefined && _id) {
url = `/blog/getpost/${_id.slice(-8)}`;
}
else {
url = "/blog/switchpost/";
}
fetch(url)
.then((resp) => resp.text())
.then((resp) => {self.updatePost(resp, transition) })
}
this.getPost(this.opts.state._id, "fadeIn");
</script> </script>
</post> </post>

4
src/scripts/postcontrols.tag

@ -2,7 +2,7 @@
<div class="controls container"> <div class="controls container">
<div class="columns"> <div class="columns">
<div class="column col-6"> <div class="column col-6">
<button class={"btn btn-lg nav-button float-right " + (this.opts.state.pid <= 1 ? "disabled" : " ") + this.opts.prevloading} <button class={"btn btn-lg nav-button float-right " + (false ? "disabled" : " ") + this.opts.prevloading}
onclick={this.opts.prev} onclick={this.opts.prev}
> >
@ -10,7 +10,7 @@
</button> </button>
</div> </div>
<div class="column col-6"> <div class="column col-6">
<button class={"btn btn-lg nav-button float-left " + (this.opts.nomore ? "disabled" : " ") + this.opts.nextloading} <button class={"btn btn-lg nav-button float-left " + (false ? "disabled" : " ") + this.opts.nextloading}
onclick={this.opts.next} onclick={this.opts.next}
> >
<i class="fa fa-arrow-right" aria-hidden="true"></i> <i class="fa fa-arrow-right" aria-hidden="true"></i>

22
src/scripts/projects.tag

@ -17,20 +17,22 @@
<div class="text-break"> <div class="text-break">
<div if={this.swipe} class={`card animated ${this.transition}`}> <div if={this.swipe} class={`card animated ${this.transition}`}>
<div class="card-header"> <div class="card-header">
<h4 class="card-title post-title">{ this.project().name }</h4> <h3 class="card-title project-title">{ this.project().name }</h3>
<h6 class="post-author">{ this.project().description }</h6> <h5 class="project-description">{ this.project().description }</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="tile">
<div class="tile-content">
<p class="tile-title">Written primarily in { this.project().language} </p>
<p class="tile-subtitle">Started on {moment(this.project().created_at).format("MMMM Do YYYY") }</p>
</div>
<div class="tile-action">
<a <a
target="_blank" target="_blank"
href={this.project().html_url}> href={this.project().html_url}>
<button class="btn btn-small"> <button class="btn btn-primary">See on github</button>
See on github
</button>
</a> </a>
<div class="project-content"> </div>
<p>Written primarily in { this.project().language }</p>
<p>Started on { moment(this.project().created_at).format("MMMM Do YYYY") }</p>
</div> </div>
</div> </div>
</div> </div>
@ -63,11 +65,9 @@ import moment from 'moment';
var cycle_timeout = 12; var cycle_timeout = 12;
this.username = "Wes";
this.avatar_url = "";
var self = this; var self = this;
self.avatar_url = "";
self.transition = ""; self.transition = "";
self.swipe = true; self.swipe = true;
self.moment = moment; self.moment = moment;

24
src/styles/riotblog.scss

@ -77,6 +77,20 @@ p, h6, h4 {
color: #3A4145; color: #3A4145;
} }
.project-title {
font-family: 'Open Sans',sans-serif !important;
font-size: 1.9em !important;
line-height: 1.6em !important;
color: #3A4145 !important;
}
.project-description {
font-family: 'Open Sans',sans-serif !important;
font-size: 1.2em !important;
line-height: 1.2em !important;
color: #3A4145 !important;
}
.navigate { .navigate {
width: 20% !important; width: 20% !important;
margin-bottom: 25px !important; margin-bottom: 25px !important;
@ -133,7 +147,7 @@ p, h6, h4 {
} }
} }
img, code { p > img, code {
margin: auto; margin: auto;
max-width: 85%; max-width: 85%;
@media (max-width: 1000px) { @media (max-width: 1000px) {
@ -150,11 +164,17 @@ pre {
white-space: -pre-wrap; /* Opera 4-6 */ white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */ white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */ word-wrap: break-word; /* Internet Explorer 5.5+ */
margin: auto;
}
code {
text-indent: 0mm;
margin: auto;
} }
.projects-content { .projects-content {
margin: auto; margin: auto;
max-width: 30%; max-width: 22%;
@media (max-width: 1000px) { @media (max-width: 1000px) {
max-width: 60%; max-width: 60%;
} }

2
src/templates/index.html

@ -8,7 +8,7 @@
<html> <html>
<body> <body>
<section class="text-center nav navbar centered page-top navbar-section"> <section class="text-center nav navbar centered page-top navbar-section">
<h1 class="blog-title">Wesley Kerfoot</h1> <h1 class="blog-title">Wes Kerfoot</h1>
</section> </section>
<app csrf_token="{{ csrf_token() }}"></app> <app csrf_token="{{ csrf_token() }}"></app>
<footer class="footer"> <footer class="footer">

28
src/website.py

@ -85,22 +85,32 @@ def NeverWhere(configfile=None):
def send_style(filename): def send_style(filename):
return send_from_directory("/srv/http/riotblog/styles", filename) return send_from_directory("/srv/http/riotblog/styles", filename)
# get the next post
@app.route("/blog/switchpost/<pid>") @app.route("/blog/switchpost/<pid>")
def getposts(pid): def getpostid(pid):
try: return posts.iterpost(startkey=pid)
index = int(pid)
except ValueError:
index = 0
return posts.getposts(index+1, index)
@app.route("/blog/allposts") # get the first post
def allposts(): @app.route("/blog/switchpost/")
return posts.allposts() def nextpost():
return posts.iterpost()
# get the post previous to this one
@app.route("/blog/prevpost/<pid>")
def prevpost(pid):
return posts.iterpost(endkey=pid)
# get the contents of any post
@app.route("/blog/getpost/<_id>") @app.route("/blog/getpost/<_id>")
def getpost(_id): def getpost(_id):
return posts.getpost(_id) return posts.getpost(_id)
# get the id of every post
@app.route("/blog/allposts")
def allposts():
return posts.allposts()
# remove a post
@app.route("/blog/deletepost/<_id>") @app.route("/blog/deletepost/<_id>")
@login_required @login_required
def delete(_id): def delete(_id):

Loading…
Cancel
Save