Fixed #19 with the addition of some new modules to parse the image EXIF
data. Made a lot of progress on #1 with additional work on the rendering templates.
This commit is contained in:
parent
f952d44841
commit
dc8639c5ef
18 changed files with 202 additions and 104 deletions
1
app.js
1
app.js
|
@ -5,7 +5,6 @@ var passport = require('passport');
|
||||||
var Strategy = require('passport-local').Strategy;
|
var Strategy = require('passport-local').Strategy;
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var markdown = require( "markdown" ).markdown;
|
|
||||||
var moment = require("moment");
|
var moment = require("moment");
|
||||||
|
|
||||||
// Make ourselves a nice little express app.
|
// Make ourselves a nice little express app.
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
function changeImg(e) {
|
function changeImg(e) {
|
||||||
if (e.getAttribute('load') == 'lazy') {
|
if (e.getAttribute('load') == 'lazy') {
|
||||||
path = '/photos/'+e.getAttribute('slug');
|
path = e.getAttribute('slug');
|
||||||
if (window.devicePixelRatio && window.devicePixelRatio > 1) {
|
if (window.devicePixelRatio && window.devicePixelRatio > 1) {
|
||||||
console.log('Loading retina version of '+e.getAttribute('slug'));
|
console.log('Loading retina version of '+e.getAttribute('slug'));
|
||||||
e.setAttribute('load', 'loaded');
|
e.setAttribute('load', 'loaded');
|
||||||
e.src = path+'/'+e.getAttribute('size')+'2x.'+e.getAttribute('ext');
|
e.src = path+e.getAttribute('size')+'2x.'+e.getAttribute('ext');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
console.log('Loading non-retina version of '+e.getAttribute('slug'));
|
console.log('Loading non-retina version of '+e.getAttribute('slug'));
|
||||||
e.setAttribute('load', 'loaded');
|
e.setAttribute('load', 'loaded');
|
||||||
e.src = path+'/'+e.getAttribute('size')+'.'+e.getAttribute('ext');
|
e.src = path+e.getAttribute('size')+'.'+e.getAttribute('ext');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,4 @@
|
||||||
@media (min-width: 768px) {
|
article {
|
||||||
div.nav-title-block {
|
border-bottom: 1px rgb(119, 119, 119) solid;
|
||||||
height:240px;
|
padding-bottom: 20px;
|
||||||
bottom:20px;
|
|
||||||
position:fixed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
|
||||||
div.nav-title-block img.img-responsive {
|
|
||||||
max-width: 200px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,13 +9,13 @@
|
||||||
"connect-redis": "^3.0.2",
|
"connect-redis": "^3.0.2",
|
||||||
"cookie-parser": "^1.3.5",
|
"cookie-parser": "^1.3.5",
|
||||||
"debug": "^2.2.0",
|
"debug": "^2.2.0",
|
||||||
|
"exif": "^0.5.1",
|
||||||
"express": "^4.13.1",
|
"express": "^4.13.1",
|
||||||
"express-flash": "^0.0.2",
|
"express-flash": "^0.0.2",
|
||||||
"express-session": "^1.13.0",
|
"express-session": "^1.13.0",
|
||||||
"gm": "^1.21.1",
|
|
||||||
"jade": "^1.11.0",
|
"jade": "^1.11.0",
|
||||||
"lodash": "^4.0.0",
|
"lodash": "^4.0.0",
|
||||||
"markdown": "^0.5.0",
|
"marked": "^0.3.5",
|
||||||
"moment": "^2.11.1",
|
"moment": "^2.11.1",
|
||||||
"mongodb": "^2.1.4",
|
"mongodb": "^2.1.4",
|
||||||
"morgan": "^1.6.1",
|
"morgan": "^1.6.1",
|
||||||
|
@ -25,6 +25,7 @@
|
||||||
"passport": "^0.3.0",
|
"passport": "^0.3.0",
|
||||||
"passport-local": "^1.0.0",
|
"passport-local": "^1.0.0",
|
||||||
"redis": "^2.4.2",
|
"redis": "^2.4.2",
|
||||||
"serve-favicon": "^2.3.0"
|
"serve-favicon": "^2.3.0",
|
||||||
|
"sharp": "^0.12.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
40
photo.js
40
photo.js
|
@ -3,11 +3,11 @@ var _ = require("lodash");
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var mkdirp = require('mkdirp');
|
var mkdirp = require('mkdirp');
|
||||||
var jade = require('jade');
|
var jade = require('jade');
|
||||||
var markdown = require( "markdown" ).markdown;
|
var marked = require('marked');
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var schemas = require('./schemas.js');
|
var schemas = require('./schemas.js');
|
||||||
var gm = require('gm');
|
|
||||||
var config = require("./config.js").config;
|
var config = require("./config.js").config;
|
||||||
|
var sharp = require('sharp');
|
||||||
|
|
||||||
var Photo = function(data) {
|
var Photo = function(data) {
|
||||||
this.data = this.sanitize(data);
|
this.data = this.sanitize(data);
|
||||||
|
@ -97,14 +97,14 @@ Photo.prototype.getShortDate = function () {
|
||||||
// Arguments: None
|
// Arguments: None
|
||||||
// Returns: Content as String
|
// Returns: Content as String
|
||||||
Photo.prototype.renderMarkdown = function () {
|
Photo.prototype.renderMarkdown = function () {
|
||||||
return markdown.toHTML(this.get("markdown"));
|
return marked(this.get("markdown"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function to get the relative url of a photo, this sets the permalink structure
|
// Function to get the relative url of a photo, this sets the permalink structure
|
||||||
// Arguments: None
|
// Arguments: None
|
||||||
// Returns: URL as String
|
// Returns: URL as String
|
||||||
Photo.prototype.getURL = function () {
|
Photo.prototype.getURL = function () {
|
||||||
var url = "/photo/";
|
var url = "/photos/";
|
||||||
url += moment(this.get("photoDate")).format("YYYY/MM/");
|
url += moment(this.get("photoDate")).format("YYYY/MM/");
|
||||||
url += this.get("slug") + '/';
|
url += this.get("slug") + '/';
|
||||||
return url;
|
return url;
|
||||||
|
@ -153,13 +153,11 @@ Photo.prototype.makeSlug = function () {
|
||||||
// Arguments: Callback function
|
// Arguments: Callback function
|
||||||
// Returns: err
|
// Returns: err
|
||||||
Photo.prototype.build = function (callback) {
|
Photo.prototype.build = function (callback) {
|
||||||
var options = {
|
console.log('Rendering photo: '+this.get("title"));
|
||||||
|
var jadeOut = jade.renderFile('views/render-photo.jade', {
|
||||||
pretty: true,
|
pretty: true,
|
||||||
photo: this
|
photo: this
|
||||||
};
|
});
|
||||||
|
|
||||||
console.log('Rendering photo: '+this.get("title"));
|
|
||||||
var jadeOut = jade.renderFile('views/render-photo.jade', options);
|
|
||||||
|
|
||||||
console.log('Creating directory: '+ this.getDirectory());
|
console.log('Creating directory: '+ this.getDirectory());
|
||||||
|
|
||||||
|
@ -169,20 +167,20 @@ Photo.prototype.build = function (callback) {
|
||||||
if (err) console.log(err);
|
if (err) console.log(err);
|
||||||
for (var size in config.imageSizes) {
|
for (var size in config.imageSizes) {
|
||||||
console.log('Generating '+size+' for '+self.get("slug"));
|
console.log('Generating '+size+' for '+self.get("slug"));
|
||||||
(function(size){
|
(function (size) {
|
||||||
gm(self.get('masterPath'))
|
var outFile = path.join(self.getDirectory(),size+'.'+self.get("extension"));
|
||||||
.autoOrient()
|
sharp(self.get('masterPath'))
|
||||||
.resize(config.imageSizes[size], config.imageSizes[size])
|
.resize(config.imageSizes[size], config.imageSizes[size])
|
||||||
.write(path.join(self.getDirectory(),size+'.'+self.get("extension")),
|
.max()
|
||||||
function(err) {
|
.quality(95)
|
||||||
if (err) {
|
.withoutEnlargement()
|
||||||
|
.toFile(outFile, function(err) {
|
||||||
|
if (!err) {
|
||||||
|
console.log(self.get("slug")+' '+size+' generated.');
|
||||||
|
} else {
|
||||||
console.log(self.get("slug")+' resize failed.');
|
console.log(self.get("slug")+' resize failed.');
|
||||||
}
|
}
|
||||||
else {
|
});
|
||||||
console.log(self.get("slug")+' '+size+' generated.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
})(size);
|
})(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
66
post.js
66
post.js
|
@ -3,7 +3,7 @@ var _ = require("lodash");
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var mkdirp = require('mkdirp');
|
var mkdirp = require('mkdirp');
|
||||||
var jade = require('jade');
|
var jade = require('jade');
|
||||||
var markdown = require( "markdown" ).markdown;
|
var marked = require('marked');
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var schemas = require('./schemas.js');
|
var schemas = require('./schemas.js');
|
||||||
var config = require("./config.js").config;
|
var config = require("./config.js").config;
|
||||||
|
@ -101,7 +101,7 @@ Post.prototype.getShortDate = function () {
|
||||||
// Arguments: None
|
// Arguments: None
|
||||||
// Returns: Content as String
|
// Returns: Content as String
|
||||||
Post.prototype.renderMarkdown = function () {
|
Post.prototype.renderMarkdown = function () {
|
||||||
return markdown.toHTML(this.get("markdown"));
|
return marked(this.get("markdown"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function to get the relative url of a post, this sets the permalink structure
|
// Function to get the relative url of a post, this sets the permalink structure
|
||||||
|
@ -168,6 +168,7 @@ Post.prototype.build = function (callback) {
|
||||||
Post.buildMonthIndex(year, month, function (err) {
|
Post.buildMonthIndex(year, month, function (err) {
|
||||||
if (err) console.log(err);
|
if (err) console.log(err);
|
||||||
});
|
});
|
||||||
|
Post.buildIndex();
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
pretty: true,
|
pretty: true,
|
||||||
|
@ -348,6 +349,7 @@ Post.buildMonthIndex = function (year, month, callback) {
|
||||||
var jadeOut = jade.renderFile('views/render-post-index.jade', {
|
var jadeOut = jade.renderFile('views/render-post-index.jade', {
|
||||||
pretty: true,
|
pretty: true,
|
||||||
posts: posts,
|
posts: posts,
|
||||||
|
pageTitle: 'Posts from '+year+'/'+month,
|
||||||
title: 'Posts from '+year+'/'+month
|
title: 'Posts from '+year+'/'+month
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -397,6 +399,7 @@ Post.buildYearIndex = function (year, callback) {
|
||||||
var jadeOut = jade.renderFile('views/render-post-index.jade', {
|
var jadeOut = jade.renderFile('views/render-post-index.jade', {
|
||||||
pretty: true,
|
pretty: true,
|
||||||
posts: posts,
|
posts: posts,
|
||||||
|
pageTitle: 'Posts from '+year,
|
||||||
title: 'Posts from '+year
|
title: 'Posts from '+year
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -416,5 +419,64 @@ Post.buildYearIndex = function (year, callback) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function to build the main index
|
||||||
|
// Inputs: none
|
||||||
|
// Returns: none
|
||||||
|
Post.buildIndex = function () {
|
||||||
|
console.log("Building home index");
|
||||||
|
Post.getPosts(null, null, function (err, posts) {
|
||||||
|
pages = posts.length / 10;
|
||||||
|
for ( p = 0; p < pages ; p++) {
|
||||||
|
(function (p) {
|
||||||
|
console.log("Building page "+p+" of index.");
|
||||||
|
var start = p*10;
|
||||||
|
var end = (p+1)*10-1;
|
||||||
|
if ( p > 0 ) {
|
||||||
|
var title = 'Page 2';
|
||||||
|
var pageTitle = 'Page 2';
|
||||||
|
}
|
||||||
|
if ( p === 0 ) {
|
||||||
|
var prev = -1;
|
||||||
|
} else {
|
||||||
|
var prev = p-1;
|
||||||
|
}
|
||||||
|
if ( p + 1 < pages ) {
|
||||||
|
var next = p+2;
|
||||||
|
} else {
|
||||||
|
var next = false;
|
||||||
|
}
|
||||||
|
var jadeOut = jade.renderFile('views/render-post-index.jade', {
|
||||||
|
pretty: true,
|
||||||
|
title: title,
|
||||||
|
pageTitle: pageTitle,
|
||||||
|
next: next,
|
||||||
|
prev: prev,
|
||||||
|
posts: posts.slice(start, end)
|
||||||
|
});
|
||||||
|
|
||||||
|
if (p === 0) {
|
||||||
|
var directory = path.join(config.buildDir, 'blog');
|
||||||
|
var file = path.join(directory, 'index.html');
|
||||||
|
} else {
|
||||||
|
var directory = path.join(config.buildDir, 'blog', (p+1).toString());
|
||||||
|
var file = path.join(directory, 'index.html');
|
||||||
|
}
|
||||||
|
mkdirp(directory, function (err) {
|
||||||
|
console.log('Made directory: '+directory);
|
||||||
|
if (!err) {
|
||||||
|
fs.writeFile(file, jadeOut, 'utf-8', function (err) {
|
||||||
|
console.log('Wrote out: '+file);
|
||||||
|
if (err) console.log(err);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log('Failed to build '+file, err)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})(p);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Export the Post object for external use.
|
// Export the Post object for external use.
|
||||||
module.exports = Post;
|
module.exports = Post;
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
// Routes for photo administration.
|
// Routes for photo administration.
|
||||||
var config = require('./config.js').config;
|
var config = require('./config.js').config;
|
||||||
var multer = require('multer');
|
var multer = require('multer');
|
||||||
|
var ExifImage = require('exif').ExifImage;
|
||||||
|
var jade = require('jade');
|
||||||
var upload = multer({ dest: config.uploadDir });
|
var upload = multer({ dest: config.uploadDir });
|
||||||
|
var uuid = require('node-uuid');
|
||||||
|
|
||||||
module.exports = function(app) {
|
module.exports = function(app) {
|
||||||
|
|
||||||
|
@ -29,10 +32,15 @@ module.exports = function(app) {
|
||||||
function (req, res, next) {
|
function (req, res, next) {
|
||||||
if (req.params.uuid) {
|
if (req.params.uuid) {
|
||||||
Photo.getByUUID(req.params.uuid, function(err, photo) {
|
Photo.getByUUID(req.params.uuid, function(err, photo) {
|
||||||
|
var jadeOut = jade.renderFile('views/partial-photo.jade', {
|
||||||
|
pretty: true,
|
||||||
|
photo: photo
|
||||||
|
});
|
||||||
res.render('admin-photo-view', {
|
res.render('admin-photo-view', {
|
||||||
successNotice: req.flash('successNotice'),
|
successNotice: req.flash('successNotice'),
|
||||||
failureNotice: req.flash('failureNotice'),
|
failureNotice: req.flash('failureNotice'),
|
||||||
photo,
|
photo,
|
||||||
|
htmlSnippet: jadeOut,
|
||||||
user: req.user
|
user: req.user
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -56,8 +64,7 @@ module.exports = function(app) {
|
||||||
app.post('/admin/photo/new',
|
app.post('/admin/photo/new',
|
||||||
upload.single('photo'),
|
upload.single('photo'),
|
||||||
function(req, res, next) {
|
function(req, res, next) {
|
||||||
console.log(req.file);
|
var photo = new Photo({'uuid': uuid.v1()});
|
||||||
photo = new Photo();
|
|
||||||
if (req.body.title != '') {
|
if (req.body.title != '') {
|
||||||
photo.set('title', req.body.title);
|
photo.set('title', req.body.title);
|
||||||
} else {
|
} else {
|
||||||
|
@ -85,18 +92,27 @@ module.exports = function(app) {
|
||||||
photo.set("published", false);
|
photo.set("published", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
photo.save(null, function (err) {
|
ExifImage({image: photo.get('masterPath')}, function (err, exifData) {
|
||||||
if (!err) {
|
if (!err) {
|
||||||
req.flash('successNotice', 'Photo created.');
|
photo.set('exif', exifData.exif || {});
|
||||||
res.redirect('/admin/photo/view/'+photo.get('uuid'));
|
photo.set('gps', exifData.gps || {});
|
||||||
|
photo.save(null, function (err) {
|
||||||
|
if (!err) {
|
||||||
|
req.flash('successNotice', 'Photo created.');
|
||||||
|
res.redirect('/admin/photo/view/'+photo.get('uuid'));
|
||||||
|
} else {
|
||||||
|
console.log(err);
|
||||||
|
req.flash('failureNotice', 'Photo failed to be created');
|
||||||
|
res.redirect(req.header('Referer') || '/admin');
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
req.flash('failureNotice', 'Photo failed to be created');
|
req.flash('failureNotice', 'Photo failed to be created');
|
||||||
res.redirect('/admin/photo/new');
|
res.redirect(req.header('Referer') || '/admin');
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
app.get('/admin/photo/edit/:uuid',
|
app.get('/admin/photo/edit/:uuid',
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
var config = require('./config.js').config;
|
var config = require('./config.js').config;
|
||||||
|
var uuid = require('node-uuid');
|
||||||
|
|
||||||
// Post management routing
|
// Post management routing
|
||||||
|
|
||||||
|
@ -55,7 +56,7 @@ module.exports = function(app) {
|
||||||
// POST /admin/post/new
|
// POST /admin/post/new
|
||||||
app.post('/admin/post/new',
|
app.post('/admin/post/new',
|
||||||
function(req, res, next) {
|
function(req, res, next) {
|
||||||
var post = new Post();
|
var post = new Post({'uuid': uuid.v1()});
|
||||||
post.set("title", req.body.title);
|
post.set("title", req.body.title);
|
||||||
if (req.body.slug != "") {
|
if (req.body.slug != "") {
|
||||||
post.set("slug", req.body.slug);
|
post.set("slug", req.body.slug);
|
||||||
|
|
|
@ -9,27 +9,29 @@ module.exports = function (app) {
|
||||||
function(req, res, next) {
|
function(req, res, next) {
|
||||||
if (req.params[0] != '') {
|
if (req.params[0] != '') {
|
||||||
var path = __dirname + '/' + config.buildDir + '/blog/' + req.params[0];
|
var path = __dirname + '/' + config.buildDir + '/blog/' + req.params[0];
|
||||||
console.log('Trying to serve: ' + path);
|
} else {
|
||||||
fs.exists(path, function(exists) {
|
var path = __dirname + '/' + config.buildDir + '/blog/';
|
||||||
if (exists) {
|
|
||||||
console.log(path + ' exists serving...');
|
|
||||||
res.sendFile(path);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.log(path + ' does not exist...');
|
|
||||||
if (path.slice(-1) != '/') path += '/';
|
|
||||||
path += 'index.html'
|
|
||||||
console.log('Trying to serve: ' + path);
|
|
||||||
fs.exists(path, function(exists) {
|
|
||||||
if (exists) {
|
|
||||||
console.log(path + ' exists serving...');
|
|
||||||
res.sendFile(path);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
console.log('Trying to serve: ' + path);
|
||||||
|
fs.exists(path, function(exists) {
|
||||||
|
if (exists) {
|
||||||
|
console.log(path + ' exists serving...');
|
||||||
|
res.sendFile(path);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.log(path + ' does not exist...');
|
||||||
|
if (path.slice(-1) != '/') path += '/';
|
||||||
|
path += 'index.html'
|
||||||
|
console.log('Trying to serve: ' + path);
|
||||||
|
fs.exists(path, function(exists) {
|
||||||
|
if (exists) {
|
||||||
|
console.log(path + ' exists serving...');
|
||||||
|
res.sendFile(path);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
app.get('/photos/*',
|
app.get('/photos/*',
|
||||||
|
|
|
@ -44,7 +44,9 @@ schemas = {
|
||||||
updatedDate: new Date(),
|
updatedDate: new Date(),
|
||||||
deleted: false,
|
deleted: false,
|
||||||
published: false,
|
published: false,
|
||||||
|
aspect: null,
|
||||||
tags: [],
|
tags: [],
|
||||||
|
gps: {},
|
||||||
exif: {},
|
exif: {},
|
||||||
lastBuildDate: new Date("Mon Jan 1 1900 00:00:00 GMT-0500"),
|
lastBuildDate: new Date("Mon Jan 1 1900 00:00:00 GMT-0500"),
|
||||||
lastUploadDate: new Date("Mon Jan 1 1900 00:00:00 GMT-0500")
|
lastUploadDate: new Date("Mon Jan 1 1900 00:00:00 GMT-0500")
|
||||||
|
|
|
@ -9,7 +9,7 @@ block content
|
||||||
include ./admin-messages.jade
|
include ./admin-messages.jade
|
||||||
|
|
||||||
div(class='page-header row')
|
div(class='page-header row')
|
||||||
div(class="col-sm-6 col-sm-offset-3")
|
div(class="col-sm-10 col-sm-offset-1")
|
||||||
img(class="img-responsive", src="/#{photo.get('masterPath')}")
|
img(class="img-responsive", src="/#{photo.get('masterPath')}")
|
||||||
|
|
||||||
div(class='row')
|
div(class='row')
|
||||||
|
@ -23,3 +23,8 @@ block content
|
||||||
|
|
||||||
div(class='row')
|
div(class='row')
|
||||||
p #{photo.get('markdown')}
|
p #{photo.get('markdown')}
|
||||||
|
|
||||||
|
div(class="row")
|
||||||
|
h4 Snippet for Use in Posts
|
||||||
|
div #{htmlSnippet}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ block content
|
||||||
h3 #{post.get('title')}
|
h3 #{post.get('title')}
|
||||||
|
|
||||||
div(class='row')
|
div(class='row')
|
||||||
| #{post.getShortDate()} --
|
| #{post.getShortDate()} --
|
||||||
a(href="/admin/post/edit/#{post.get('uuid')}") Edit
|
a(href="/admin/post/edit/#{post.get('uuid')}") Edit
|
||||||
| -
|
| -
|
||||||
a(href="/admin/post/build/#{post.get('uuid')}") Build
|
a(href="/admin/post/build/#{post.get('uuid')}") Build
|
||||||
|
|
3
views/partial-photo.jade
Normal file
3
views/partial-photo.jade
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
img(slug="#{photo.getURL()}", size='post',
|
||||||
|
src="/static/images/loading.gif", ext="#{photo.get('extension')}", load='lazy',
|
||||||
|
onload='changeImg(this);').img-responsive
|
|
@ -1 +1,2 @@
|
||||||
script(type="text/javascript", src="/static/scripts/crunch.js")
|
script(src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js")
|
||||||
|
script(src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js" integrity="sha256-Sk3nkD6mLTMOF0EOpNtsIry+s1CsaqQC1rVLTAy+0yc= sha512-K1qjQ+NcF2TYO/eI3M6v8EiNYZfA95pQumfvcVrTHtwQVDG+aHRqLi/ETn2uB+1JqwYqVG3LIvdm9lj6imS/pQ==" crossorigin="anonymous")
|
||||||
|
|
|
@ -1,23 +1,28 @@
|
||||||
doctype html
|
doctype html
|
||||||
html
|
html
|
||||||
head
|
head
|
||||||
title #{title}
|
title #{title}
|
||||||
meta(charset="utf-8")
|
meta(charset="utf-8")
|
||||||
meta(http-equiv="X-UA-Compatible", content="IE=edge")
|
meta(http-equiv="X-UA-Compatible", content="IE=edge")
|
||||||
meta(name="viewport", content="width=device-width, initial-scale=1")
|
meta(name="viewport", content="width=device-width, initial-scale=1")
|
||||||
link(href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css", rel="stylesheet" integrity="sha256-MfvZlkHCEqatNoGiOXveE8FIwMzZg4W85qfrfIFBfYc= sha512-dTfge/zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz/ixG7ArTxmDjLXDmezHubeNikyKGVyQ==" crossorigin="anonymous")
|
link(href="https://maxcdn.bootstrapcdn.com/bootswatch/3.3.6/simplex/bootstrap.min.css", rel="stylesheet", integrity="sha256-rgHoMgF45/9e2kvxfvR0KarwQNw5CRqgxbrthGpeUuc= sha512-CGGV53FSdrXrjyGCNk04p+xuna3CbE33n773A0EEmqtcN8W3NaFsR0vSQcbll5dpSS90d3i2Zh3jFX/j46hzJA==", crossorigin="anonymous")
|
||||||
link(rel='stylesheet', href='/static/stylesheets/style.css')
|
link(rel='stylesheet', href='/static/stylesheets/style.css')
|
||||||
block head-addition
|
script(type="text/javascript", src="/static/scripts/crunch.js")
|
||||||
body(role="document")
|
block head-addition
|
||||||
div(role="main").container-fluid
|
body(role="document")
|
||||||
div.col-sm-3
|
div(class="container-fluid", role="main", style="padding-bottom: 20px;")
|
||||||
div.title-block
|
div.row
|
||||||
img(src="/static/images/logo.png").img-responsive
|
div(class="col-sm-3 sidebar")
|
||||||
div.col-sm-8.col-sm-offset-4
|
div.row.visible-xs-block.col-xs-6.col-xs-offset-3
|
||||||
block content
|
img(src="/static/images/logo.png").img-responsive
|
||||||
div.col-sm-3.title-block-nav
|
img(src="/static/images/logo.png").img-responsive.center-block.hidden-xs
|
||||||
ul.nav.nav-pills.nav-justified
|
div.hidden-xs
|
||||||
li: a(href="/") Home
|
include ./render-sidebar.jade
|
||||||
li: a(href="/blog") Blog
|
|
||||||
li: a(href="/photos") Photos
|
|
||||||
|
|
||||||
|
div(class="col-sm-7 col-sm-offset-1 col-xs-12 main")
|
||||||
|
block content
|
||||||
|
|
||||||
|
div(style="text-align:center;").visible-xs-block.col-xs-12
|
||||||
|
include ./render-sidebar.jade
|
||||||
|
|
||||||
|
include ./render-footer.jade
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
extends render-layout
|
extends render-layout
|
||||||
|
|
||||||
block head-addition
|
|
||||||
script(type="text/javascript", src="/static/scripts/crunch.js")
|
|
||||||
|
|
||||||
block content
|
block content
|
||||||
div: img(slug='#{slug}', size='md',
|
article
|
||||||
src="/static/images/loading.gif", ext='#{extension}', load='lazy',
|
header
|
||||||
onload='changeImg(this);')
|
div(style="padding-top: 30px;")
|
||||||
|
include ./partial-photo.jade
|
||||||
h3: a(href="#{url}") #{title}
|
h3: a(href="#{photo.getURL()}") #{photo.get('title')}
|
||||||
div !{content}
|
!{photo.renderMarkdown()}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,19 @@
|
||||||
extends render-layout
|
extends render-layout
|
||||||
|
|
||||||
block content
|
block content
|
||||||
h1 #{title}
|
h1 #{pageTitle}
|
||||||
|
|
||||||
each post in posts
|
each post in posts
|
||||||
include ./partial-post.jade
|
include ./partial-post.jade
|
||||||
|
|
||||||
|
div
|
||||||
|
if prev == 0
|
||||||
|
a(href="/blog/") Newer
|
||||||
|
if prev > 0
|
||||||
|
a(href="/blog/#{prev}/") Newer
|
||||||
|
|
||||||
|
if prev >= 0 && next > 0
|
||||||
|
| —
|
||||||
|
|
||||||
|
if next > 0
|
||||||
|
a(href="/blog/#{next}/") Older
|
||||||
|
|
3
views/render-sidebar.jade
Normal file
3
views/render-sidebar.jade
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
ul.nav.nav-sidebar
|
||||||
|
li: a(href="/blog/") Blog
|
||||||
|
li: a(href='/photos/') Photos
|
Loading…
Reference in a new issue