Add sitemap. This fixes #3
This commit is contained in:
parent
5f93f3d744
commit
2cb80e2bac
8 changed files with 126 additions and 6 deletions
|
@ -170,21 +170,21 @@ footer {
|
||||||
"Droid Sans", "Helvetica Neue", sans-serif;
|
"Droid Sans", "Helvetica Neue", sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
footer ul {
|
ul.dense {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
footer li {
|
ul.dense>li {
|
||||||
display: inline;
|
display: inline;
|
||||||
}
|
}
|
||||||
|
|
||||||
footer li::after {
|
ul.dense>li::after {
|
||||||
content: "\00B7";
|
content: "\00B7";
|
||||||
margin: 0 12px;
|
margin: 0 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
footer li:last-child::after {
|
ul.dense>li:last-child::after {
|
||||||
content: "";
|
content: "";
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ mod new_article_resource;
|
||||||
mod rendering;
|
mod rendering;
|
||||||
mod schema;
|
mod schema;
|
||||||
mod site;
|
mod site;
|
||||||
|
mod sitemap_resource;
|
||||||
mod state;
|
mod state;
|
||||||
mod web;
|
mod web;
|
||||||
mod wiki_lookup;
|
mod wiki_lookup;
|
||||||
|
|
69
src/sitemap_resource.rs
Normal file
69
src/sitemap_resource.rs
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
use futures::{self, Future};
|
||||||
|
use hyper;
|
||||||
|
use hyper::header::ContentType;
|
||||||
|
use hyper::server::*;
|
||||||
|
|
||||||
|
use assets::StyleCss;
|
||||||
|
use mimes::*;
|
||||||
|
use site::Layout;
|
||||||
|
use state::State;
|
||||||
|
use web::{Resource, ResponseFuture};
|
||||||
|
|
||||||
|
pub struct SitemapResource {
|
||||||
|
state: State,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SitemapResource {
|
||||||
|
pub fn new(state: State) -> Self {
|
||||||
|
SitemapResource { state }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Resource for SitemapResource {
|
||||||
|
fn allow(&self) -> Vec<hyper::Method> {
|
||||||
|
use hyper::Method::*;
|
||||||
|
vec![Options, Head, Get]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn head(&self) -> ResponseFuture {
|
||||||
|
Box::new(futures::finished(Response::new()
|
||||||
|
.with_status(hyper::StatusCode::Ok)
|
||||||
|
.with_header(ContentType(TEXT_HTML.clone()))
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(self: Box<Self>) -> ResponseFuture {
|
||||||
|
#[derive(BartDisplay)]
|
||||||
|
#[template="templates/sitemap.html"]
|
||||||
|
struct Template<'a> {
|
||||||
|
articles: &'a [ArticleReference],
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ArticleReference {
|
||||||
|
link: String,
|
||||||
|
title: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
let data = self.state.get_latest_article_revision_stubs();
|
||||||
|
let head = self.head();
|
||||||
|
|
||||||
|
Box::new(data.join(head)
|
||||||
|
.and_then(move |(articles, head)| {
|
||||||
|
use std::iter::Iterator;
|
||||||
|
|
||||||
|
let articles = &articles.into_iter().map(|x| {
|
||||||
|
ArticleReference {
|
||||||
|
link: if x.slug.is_empty() { ".".to_owned() } else { x.slug },
|
||||||
|
title: x.title,
|
||||||
|
}
|
||||||
|
}).collect::<Vec<_>>();
|
||||||
|
|
||||||
|
Ok(head
|
||||||
|
.with_body(Layout {
|
||||||
|
title: "Sitemap",
|
||||||
|
body: &Template { articles },
|
||||||
|
style_css_checksum: StyleCss::checksum(),
|
||||||
|
}.to_string()))
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
22
src/state.rs
22
src/state.rs
|
@ -129,6 +129,28 @@ impl State {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_latest_article_revision_stubs(&self) -> CpuFuture<Vec<models::ArticleRevisionStub>, Error> {
|
||||||
|
let connection_pool = self.connection_pool.clone();
|
||||||
|
|
||||||
|
self.cpu_pool.spawn_fn(move || {
|
||||||
|
use schema::article_revisions;
|
||||||
|
|
||||||
|
Ok(article_revisions::table
|
||||||
|
.filter(article_revisions::latest.eq(true))
|
||||||
|
.order(article_revisions::title.asc())
|
||||||
|
.select((
|
||||||
|
article_revisions::sequence_number,
|
||||||
|
article_revisions::article_id,
|
||||||
|
article_revisions::revision,
|
||||||
|
article_revisions::created,
|
||||||
|
article_revisions::slug,
|
||||||
|
article_revisions::title,
|
||||||
|
article_revisions::latest,
|
||||||
|
))
|
||||||
|
.load(&*connection_pool.get()?)?)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pub fn lookup_slug(&self, slug: String) -> CpuFuture<SlugLookup, Error> {
|
pub fn lookup_slug(&self, slug: String) -> CpuFuture<SlugLookup, Error> {
|
||||||
#[derive(Queryable)]
|
#[derive(Queryable)]
|
||||||
struct ArticleRevisionStub {
|
struct ArticleRevisionStub {
|
||||||
|
|
|
@ -7,6 +7,7 @@ use article_redirect_resource::ArticleRedirectResource;
|
||||||
use article_resource::ArticleResource;
|
use article_resource::ArticleResource;
|
||||||
use assets::*;
|
use assets::*;
|
||||||
use new_article_resource::NewArticleResource;
|
use new_article_resource::NewArticleResource;
|
||||||
|
use sitemap_resource::SitemapResource;
|
||||||
use state::State;
|
use state::State;
|
||||||
use web::{Lookup, Resource};
|
use web::{Lookup, Resource};
|
||||||
|
|
||||||
|
@ -27,6 +28,13 @@ lazy_static! {
|
||||||
) as ResourceFn
|
) as ResourceFn
|
||||||
);
|
);
|
||||||
|
|
||||||
|
lookup_map.insert(
|
||||||
|
"/_sitemap".to_string(),
|
||||||
|
Box::new(|state: &State|
|
||||||
|
Box::new(SitemapResource::new(state.clone())) as BoxResource
|
||||||
|
) as ResourceFn
|
||||||
|
);
|
||||||
|
|
||||||
lookup_map.insert(
|
lookup_map.insert(
|
||||||
"/_new".to_string(),
|
"/_new".to_string(),
|
||||||
Box::new(|state: &State|
|
Box::new(|state: &State|
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<ul>
|
<ul class="dense">
|
||||||
<li><a href="_new">Create article</a></li>
|
<li><a href="_new">Create article</a></li>
|
||||||
<li><a id="openEditor" href="?edit">Edit</a></li>
|
<li><a id="openEditor" href="?edit">Edit</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<ul>
|
<ul class="dense">
|
||||||
<li><a href="_new">Create article</a></li>
|
<li><a href="_new">Create article</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Powered by <a href="https://github.com/maghoff/sausagewiki">Sausagewiki</a></p>
|
<p>Powered by <a href="https://github.com/maghoff/sausagewiki">Sausagewiki</a></p>
|
||||||
|
|
20
templates/sitemap.html
Normal file
20
templates/sitemap.html
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<div class="container">
|
||||||
|
<header>
|
||||||
|
<h1>Sitemap</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<article>
|
||||||
|
<ul class="dense">
|
||||||
|
{{#articles}}
|
||||||
|
<li><a href="{{.link}}">{{.title}}</a></li>
|
||||||
|
{{/articles}}
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<ul class="dense">
|
||||||
|
<li><a href="_new">Create article</a></li>
|
||||||
|
</ul>
|
||||||
|
<p>Powered by <a href="https://github.com/maghoff/sausagewiki">Sausagewiki</a></p>
|
||||||
|
</footer>
|
Loading…
Reference in a new issue