Merge branch 'release/v0.2.0'

This commit is contained in:
Dryusdan 2017-07-23 17:42:02 +02:00
commit 9365d82bef
28 changed files with 1235 additions and 279 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 KiB

File diff suppressed because one or more lines are too long

170
app.js
View File

@ -1,11 +1,13 @@
const express = require('express'),
cors = require("cors"),
app = express(),
log = require("color-logs")(true, true, "Dryusdan.fr"),
fs = require("fs"),
path = require('path'),
promise = require('promise'),
hbs = require('hbs');
const express = require('express'),
cors = require("cors"),
app = express(),
session = require('express-session'),
bodyParser = require('body-parser'),
cookieParser = require('cookie-parser'),
helmet = require('helmet'),
log = require("color-logs")(true, true, "Nodezzarella app"),
fs = require("fs"),
promise = require('promise');
log.info("Application started and now preparing");
@ -15,105 +17,69 @@ var corsOptions = {
"methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
"preflightContinue": false
};
/**
* Create menu html
*/
const config = require("./ressources/config.json");
var Template = require("./classes/Template.class");
var Categories = require("./classes/Categories.class");
var Articles = require("./classes/Articles.class");
class App {
constructor(rootPath, port){
global.config = require("./config.json");
class Nodezzarella {
constructor(rootPath){
this.getDBType().then((configDB) => {
if(!configDB.flatFile){
var db = require('./lib/db/'+config.db+'/db');
new db().connectDB(configDB).then((connexion) => {
global.dbConnexion = connexion;
global.dbConf = configDB;
this.run();
});
}
else{
this.run();
}
}).catch((err) => {
new Error("Nodezzarella can't initialize");
});
}
getDBType(){
return new Promise((resolve, reject) => {
fs.access("./lib/db/"+config.db+"/config.json", fs.constants.F_OK || fs.constants.R_OK, (error) => {
if(error){
reject(new Error("File not exist"));
}
else{
resolve(require("./lib/db/"+config.db+"/config.json"));
}
});
});
}
run(){
var routes = require("./lib/router");
log.info("HTTP server listening on port", config.appPort);
log.info("Application ready");
app.set('trust proxy', 1);
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(session({
secret: 'Nodezzarella',
resave: true,
saveUninitialized: true,
cookie: { secure: false, maxAge: 3600*24*31 }
}))
app.use(config.webroot || "/", routes);
app.use(function(req, res, next) {
res.status(404);
res.send("404 not found");
return;
});
/**
* Listen to http://0.0.0.0:port
*/
app.listen(port);
log.info("HTTP server listening on port", port);
log.info("Application ready");
var template = new Template();
app.get("/", function(req, res){
var categories = new Categories();
Promise.all([
template.getNav(),
categories.getHome(),
categories.getDisclaimer()
]).then(data => {
var nav = data[0];
var content = data[1];
var disclaimer = data[2];
res.setHeader("Content-type", "text/html");
var tplData = {
"blogName": config.blogName,
"title": config.homeTitle,
"nav": nav,
"content": content,
"disclaimer": disclaimer
};
res.render('template.hbs', tplData);
}).catch(err => {
res.setHeader("Content-type", "text/plain");
res.end("erreur");
});
});
app.get("/:slug", function(req, res){
var categories = new Categories();
Promise.all([
template.getNav(),
categories.getListArticles(req.params.slug),
categories.getCategorie(req.params.slug)
]).then(data => {
var nav = data[0];
var content = data[1];
var dataCategories = data[2];
res.setHeader("Content-type", "text/html");
var tplData = {
"blogName": config.blogName,
"title": dataCategories.title+" - "+ config.blogName,
"nav": nav,
"content": content,
"disclaimer": ''
};
res.render('template.hbs', tplData);
}).catch(err => {
res.setHeader("Content-type", "text/plain");
res.end("erreur");
});
});
app.get("/:categories/:slug", function(req, res){
var categories = new Categories();
var articles = new Articles();
Promise.all([
template.getNav(),
categories.getCategorie(req.params.categories),
articles.getArticle(req.params.categories, req.params.slug)
]).then(data => {
var nav = data[0];
var dataCategories = data[1];
var content = data[2];
res.setHeader("Content-type", "text/html");
var tplData = {
"blogName": config.blogName,
"title": articles.title+" - "+dataCategories.title+" - "+ config.blogName,
"nav": nav,
"content": content,
"disclaimer": ''
};
res.render('template.hbs', tplData);
}).catch(err => {
res.setHeader("Content-type", "text/plain");
res.end("erreur");
});
});
app.use(express.static("./public"));
app.disable('x-powered-by');
app.listen(config.appPort || 8888);
}
}
new App("/", config.appPort);
new Nodezzarella("/");

7
classes/Account.class.js Normal file
View File

@ -0,0 +1,7 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

97
classes/Article.class.js Normal file
View File

@ -0,0 +1,97 @@
const log = require('color-logs')(true, true, "Article.class.js"),
markdown = require('markdown').markdown,
promise = require('promise');
var id,
title,
author,
content,
date,
img,
categorieName,
categorieID,
slug;
class Article {
constructor(id, title, author, date, img, slug, categorieID, content = null){
this.setId(id);
this.setTitle(title);
this.setAuthor(author);
this.setDate(date);
this.setImg(img);
this.setSlug(slug);
this.setCategorieID(categorieID);
(content !== null)?this.setContent(content):'';
}
setId(id){
this.id = id;
}
setTitle(title){
this.title = title;
}
setAuthor(author){
this.author = author;
}
setContent(content){
this.content = markdown.toHTML(content);
}
setImg(img){
this.img = img;
}
setDate(date){
this.date = date;
}
setSlug(slug){
this.slug = slug;
}
setCategorieID(categorieID){
this.categorieID = categorieID;
}
setCategorieName(name){
this.categorieName = name;
}
getId(){
return this.id;
}
getTitle(){
return this.title;
}
getAuthor(){
return this.author;
}
getContent(){
return this.content;
}
getDate(){
return this.date;
}
getImg(){
return this.img;
}
getSlug(){
return this.slug;
}
getcategorieID(){
return this.categorieID;
}
}
module.exports = Article;

View File

@ -0,0 +1,86 @@
const log = require('color-logs')(true, true, "Categorie.class.js");
var id,
title,
uri,
articles,
description;
class Categorie {
/**
*
* @param {string} title : title of categorie
* @param {string} uri : uri of categorie
* @param {string} description : description of categorie
*/
constructor(id, title, uri, description){
this.setId(id);
this.setTitle(title);
this.setUri(uri);
this.setDescription(description);
this.articles = new Array();
}
setId(id){
this.id = id;
}
setTitle(title){
this.title = title;
}
setUri(uri){
this.uri = uri;
}
setDescription(description){
this.description = description;
}
/**
*
* @param {object <Article>} article : array of article object owned by this categorie
*/
setArticle(article){
this.articles.push(article);
}
getId(){
return this.id;
}
/**
*
* @returns {string} title of categorie
*/
getTitle(){
return this.title;
}
/**
*
* @returns {string} uri of categorie
*/
getUri(){
return this.uri;
}
/**
*
* @returns {string} description of categories
*/
getDescription(){
return this.description;
}
/**
*
* @returns {array} article array of categories
*/
getArticles(){
return this.articles;
}
}
module.exports = Categorie;

View File

@ -1,131 +0,0 @@
const log = require('color-logs')(true, true, "Categories.class.js"),
path = require('path'),
hbs = require('handlebars'),
promise = require('promise'),
fs = require("fs");
hbs.registerHelper('listArticle', function(tabs, options) {
var i = 1;
var out = '';
for(var x in options['data']['root']){
out = out + "" + options.fn(options['data']['root'][x]) + "";
if(i == 3){
i= 1;
out = out + "</div><div class=\"row\">";
}
else{
i++;
}
}
return out;
});
class Categories {
/**
* hydrate global var
* @param {type} slug : url of categorie
* @returns {Promise} data of categories
*/
getCategorie(slug){
return new Promise((resolve, reject) => {
var path = "./ressources/"+slug+"/params.json";
fs.access(path, fs.constants.F_OK || fs.constants.R_OK, (error) => {
if(error)
resolve(new Error("File not exist"));
else
resolve(require("."+path));
});
});
}
/**
*
* @returns {Promise} the list of article
*/
getHome(){
return new Promise((resolve, reject) => {
fs.readFile('./views/articles/list.hbs', 'utf-8', (error, source) => {
var data = require('../ressources/lastArticles.json');
hbs.registerHelper('articles', (articles) =>{
return articles;
});
var template = hbs.compile(source);
var html = template(data);
resolve(html);
});
});
}
getDisclaimer(){
return new Promise((resolve, reject) => {
fs.readFile('./views/articles/disclaimer.hbs', 'utf-8', (error, source) => {
var data = require('../ressources/disclaimer.json');
hbs.registerHelper('articles', (articles) =>{
return articles;
});
var template = hbs.compile(source);
var html = template(data);
resolve(html);
});
});
}
/**
*
* @param {type} slug : url of categorie
* @returns {Promise} the list of article in this categorie
*/
getListArticles(slug){
return new Promise((resolve, reject) => {
fs.readFile('./views/articles/list.hbs', 'utf-8', (error, source) => {
var pathOfArticles = "./ressources/"+slug+"";
var dataObj = {};
fs.readdir(pathOfArticles, (err, files)=> {
if(err){
resolve(new Error("File not exist"));
}
else{
var i = 0;
files.forEach((file) => {
if(file != "params.json"){
if(path.extname(file) == ".json"){
dataObj[i] = require('.'+pathOfArticles+"/"+file);
i++;
}
}
});
var objectSize = Object.keys(dataObj).length;
var data = "{";
for(var x in dataObj){
if(x < objectSize-1){
data += "\""+x+"\""+":"+JSON.stringify(dataObj[x])+',';
}
else{
data += "\""+x+"\""+":"+JSON.stringify(dataObj[x])+'';
}
}
data += "}";
data = JSON.parse(data);
hbs.registerHelper('articles', (articles) =>{
return articles;
});
var template = hbs.compile(source);
var html = template(data);
resolve(html);
}
});
});
});
}
}
module.exports = Categories;

View File

View File

@ -4,12 +4,6 @@ const log = require('color-logs')(true, true, "Articles.class.js"),
markdown = require('markdown').markdown,
fs = require("fs");
var title,
author,
content,
date,
slug;
class Articles {
getArticle(categorie, article){

View File

@ -0,0 +1,264 @@
const log = require('color-logs')(true, true, "Categories.class.js"),
path = require('path'),
hbs = require('handlebars'),
promise = require('promise'),
dbConnector = require('../../lib/db/'+config.db+"/db.js");
fs = require("fs"),
Categorie = require('../Categorie.class.js');
Article = require('../Article.class.js');
hbs.registerHelper('listArticle', function(tabs, options) {
var i = 1;
var out = '';
log.debug();
var articles = options['data']['root'].getArticles();
articles.shift();
log.debug(articles);
for(var x in articles){
out = out + "" + options.fn(articles[x]) + "";
if(i == 3){
i= 1;
out = out + "</div><div class=\"row\">";
}
else{
i++;
}
}
return out;
});
hbs.registerHelper('disclamer', function(tabs, options) {
return options.fn(options['data']['root'].getArticles()[0]) + "";
});
hbs.registerHelper('listNav', function(tabs, options) {
var out = '';
for(var x in options['data']['root']){
out = out + "" + options.fn(options['data']['root'][x]) + "";
}
return out;
});
hbs.registerHelper('article', function(tabs, options) {
var out = '';
for(var x in options['data']['root']){
out = out + "" + options.fn(options['data']['root'][x]) + "";
}
return out;
});
class Categories {
/**
*
* @returns {<Promise>} html : the html code of navbar
*/
getNav(){
var db = new dbConnector();
return db.get({
"select" : {
"categories" : [
"title",
"uri",
"description"
]
},
"condition" : "",
"join": ""
}).then((result) => {
return new Promise((resolve, reject) => {
fs.readFile('./views/_nav.hbs', 'utf-8', (error, source) => {
hbs.registerHelper('nav', (nav) =>{
return nav;
});
var template = hbs.compile(source);
var html = template(JSON.parse(result));
resolve(html);
});
});
}).catch((err) => {
throw err;
});
}
/**
* hydrate global var
* @param {type} select : object of select {id = id}
* @returns {Promise} data of categories
*/
getCategorie(select){
var db = new dbConnector();
return db.get({
"select" : {
"categories" : [
"id",
"title",
"uri",
"description"
]
},
"condition" : select,
"join" : ""
}).then((result) => {
return new Promise((resolve, reject) => {
var data = JSON.parse(result);
result = null;
var categorie = new Categorie(data[0].id, data[0].title, data[0].uri, data[0].description);
resolve(categorie);
});
}).catch((err) => {
throw err;
});
}
/**
*
* @param {<Categorie>} categorie : object categorie
* @param {string} returnFormat : format of return [object, json, html]
* @returns {<Promise> listArticleToHTML} a list of article in HTML format
*/
getListArticles(categorie, returnFormat){
var db = new dbConnector();
return db.get({
"select" : {
"articles" : [
"id",
"title",
"slug",
"author",
"date",
"img",
"categorie_id"
]
},
"condition" : {
"categorie_id" : categorie.getId()
},
"join" : ""
}).then((result) => {
return new Promise((resolve) => {
var data = JSON.parse(result);
for(var i in data){
categorie.setArticle(new Article(data[i].id,data[i].title, data[i].author, data[i].date, data[i].img, data[i].slug, data[i].categorie_id));
categorie.getArticles()[i].setCategorieName(categorie.getTitle());
}
switch(returnFormat){
case 'html':
resolve(this.listArticlesToHTML(categorie));
break;
case 'json':
break;
case 'object':
break;
}
});
});
}
getHomeListArticles(returnFormat){
var db = new dbConnector();
return db.get({
"select" : {
"articles" : []
},
"condition" : "",
"join" : {
"left" : "categorie_id",
"right" : {
"db" : "categories",
"index" : "id"
}
}
}).then((result) => {
return new Promise((resolve) => {
var data = JSON.parse(result);
//log.debug(data);
var categorie = new Categorie(0, "home", "/", "home");
for(var i in data){
categorie.setArticle(new Article(data[i].left.id,data[i].left.title, data[i].left.author, data[i].left.date, data[i].left.img, "/"+data[i].right.uri+"/"+data[i].left.slug, data[i].left.categorie_id));
categorie.getArticles()[i].setCategorieName(data[i].right.title);
}
switch(returnFormat){
case 'html':
resolve(this.listArticlesToHTML(categorie));
break;
case 'json':
break;
case 'object':
break;
}
});
});
}
/**
*
* @param {<Categorie>} categorie : object categorie
* @returns {<Promise>} a list of article in HTML format
*/
listArticlesToHTML(categorie){
return new Promise((resolve, reject) => {
fs.readFile('./views/articles/list.hbs', 'utf-8', (error, source) => {
hbs.registerHelper('articles', (articles) =>{
return articles;
});
var template = hbs.compile(source);
var html = template(categorie);
resolve(html);
});
});
}
/**
*
* @param {<Categorie>} categorie : object categorie
* @param {string} uri the uri of article
* @returns {<Promise>} a compiled article in HTML
*/
getArticle(categorie, uri){
var db = new dbConnector();
return db.get({
"select" : {
"articles" : [
"id",
"title",
"slug",
"author",
"date",
"img",
"categorie_id",
"content"
]
},
"condition" : {
"categorie_id" : categorie.getId(),
"slug" : uri
},
"join" : ""
}).then((result) => {
return new Promise((resolve) => {
var data = JSON.parse(result);
categorie.setArticle(new Article(data[0].id,data[0].title, data[0].author, data[0].date, data[0].img, data[0].slug, data[0].categorie_id, data[0].content));
fs.readFile('./views/articles/article.hbs', 'utf-8', (error, source) => {
if(error){
log.error(error);
}
hbs.registerHelper('displayArticle', (article) =>{
return article;
});
var template = hbs.compile(source);
var html = template(categorie.getArticles());
resolve(html);
});
})
})
}
}
module.exports = Categories;

View File

@ -0,0 +1,61 @@
const crypto = require('crypto'),
moment = require("moment"),
jwt = require('jsonwebtoken'),
log = require('color-logs')(true, true, "JWTHandler.class.js");
moment.locale("fr");
class JWTHandler {
constructor() {
this.secret = crypto.createHash('sha256').update("La vie sans gâteau c'est possible, mais c'est sans intérêt", "UTF-8").digest("base64");
log.debug(this.secret);
}
verify(token, secret, cb){
jwt.verify(token, secret, {
issuer: "Nodezzarella",
clockTolerance: 3
}, function(err, decoded) {
if (err) {
cb(err, null);
} else {
cb(false, decoded);
}
});
}
sign(payload, cb){
let baseObject = {
iat: moment().unix(),
exp: moment().add(1, "day").unix(),
iss: "Orbital-Blaze"
};
jwt.sign(Object.assign(baseObject, payload), this.secret, {
algorithm: 'HS256'
}, function(err, token) {
if (err) throw err;
cb(token);
});
}
protect(req, res, next){
var that = this;
return function (req, res, next){
that.verify(req.header("Authorization"), that.secret, function(err, decoded){
if (err) {
res.status(403).json({
status: 403,
message: "Token expired",
expDate: moment(err.expiredAt).unix()
});
}else{
req.token = decoded;
next();
return;
}
})
};
}
}
module.exports = JWTHandler;

View File

@ -20,7 +20,9 @@ class Template {
* @returns {Promise} the navbar in html compiled
*/
getNav(){
/*getNav(){
return new Promise((resolve, reject) => {
fs.readFile('./views/_nav.hbs', 'utf-8', (error, source) => {
const articles = require("../ressources/categories.json");
@ -34,9 +36,10 @@ class Template {
});
}
getToot(){
}
}*/
}

View File

@ -1,5 +1,9 @@
{
"appPort": "8888",
"blogName": "Dryusdan",
"homeTitle": "Dryusdan.fr, blog d'un passionné d'informatique"
"siteTitle": "Dryusdan",
"siteHomeTitle": "Dryusdan.fr, blog d'un passionné d'informatique",
"db": "rethinkdb",
"webroot" : "/",
"login": "root",
"password": "root"
}

19
connectorSelectQuery.json Normal file
View File

@ -0,0 +1,19 @@
{
"select": {
"table" : [
"field1",
"field2"
]
},
"join" : {
"left" : "field_to_index",
"right" : {
"db" : "tableName",
"index" : "field_to_index"
}
},
"condition" : {
"field1" : "equal",
"field2" : "equal"
}
}

View File

@ -0,0 +1,3 @@
{
"flatFile": true
}

21
lib/db/jsonfile/db.js Normal file
View File

@ -0,0 +1,21 @@
class jsonFileDB{
get(){
}
post(){
}
update(){
}
remove(){
}
}
module.exports = jsonFileDB;

View File

@ -0,0 +1,8 @@
{
"flatFile": false,
"host":"172.20.1.2",
"port":"28015",
"username":"",
"password":"",
"dbName":"nodezzarella"
}

113
lib/db/rethinkdb/db.js Normal file
View File

@ -0,0 +1,113 @@
const r = require("rethinkdb"),
promise = require('promise'),
fs = require('fs'),
log = require("color-logs")(true, true, "RethinDB connector");
class rethinkdb{
static constructor(){
}
get(query){
return new Promise((resolve, reject) => {
/*
* select table
*/
var formatedQuery = r.table(Object.keys(query.select)[0]);
/*
* create join
*/
if(typeof query.join === "object"){
formatedQuery = formatedQuery.eqJoin(query.join.left, r.db(dbConf.dbName).table(query.join.right.db))
}
/*
* form filter / condition of qyert
*/
if(query.condition !== ""){
formatedQuery = formatedQuery.filter(query.condition);
}
/**
* select collumn of table
*/
for (var collumn in query.select){
if(query.select.hasOwnProperty(collumn)){
var selectCollumn = query.select[collumn];
break;
}
}
// r.db("nodezzarella").table("articles").eqJoin("categorie_id", r.db("nodezzarella").table("categories")).pluck({"left":["id"]})
if(selectCollumn.length > 0){
formatedQuery = formatedQuery.pluck(selectCollumn);
}
/**
* run query
*/
//log.debug(formatedQuery);
formatedQuery.run(dbConnexion).then((cursor) => {
return cursor.toArray();
}).then((result) => {
resolve(JSON.stringify(result));
}).catch((err)=>{
throw err;
log.error(err);
});
});
}
post(){
/*r.db("nodezzarella").table("categories").insert([{
"title": "global test",
"uri":"global-test",
"description":"desc"
},
{
"title": "test",
"uri":"test",
"description":"desc2"
}])*/
//https://www.rethinkdb.com/api/javascript/insert/
}
update(){
}
remove(){
}
getDBConfig(){
return new Promise((resolve, reject) => {
fs.access("./config.json", fs.constants.F_OK || fs.constants.R_OK, (error) => {
if(error){
reject(new Error("File not exist"));
}
else{
resolve(require("./config.json"));
}
});
});
}
connectDB(config){
this.host = config.host;
this.port = config.port;
this.dbName = config.dbName;
log.info("Application connecting to database...");
return r.connect({
host: config.host,
port: config.port,
db: config.dbName
});
}
}
module.exports = rethinkdb;

89
lib/router.js Normal file
View File

@ -0,0 +1,89 @@
const express = require("express"),
router = express.Router(),
promise = require('promise'),
hbs = require('hbs'),
path = require('path'),
log = require("color-logs")(true, true, "Router"),
session = require('express-session'),
Template = require('../classes/Template.class.js'),
Article = require('../classes/Article.class.js'),
Categorie = require('../classes/Categorie.class.js'),
Articles = require('../classes/Controllers/Articles.class.js'),
Categories = require('../classes/Controllers/Categories.class.js');
var template = new Template();
router.get("/", function(req, res){
var categories = new Categories();
Promise.all([
categories.getNav(),
categories.getHomeListArticles("html")
]).then((data) => {
var nav = data[0];
var content = data[1];
res.setHeader("Content-type", "text/html");
var tplData = {
"blogName": config.siteTitle,
"title": config.siteHomeTitle,
"nav": nav,
"content": content,
};
res.render('template.hbs', tplData);
}).catch((err) => {
console.log(err);
throw err;
});
});
router.get("/:uri/", function(req, res){
var categories = new Categories();
Promise.all([
categories.getNav(),
categories.getCategorie(req.params.uri),
]).then(data => {
var nav = data[0];
var categorie = data[1];
categories.getListArticles(categorie, "html").then((result) => {
res.setHeader("Content-type", "text/html");
var tplData = {
"blogName": config.siteTitle,
"title": categorie.getTitle() + " - "+config.siteHomeTitle,
"nav": nav,
"content": result,
};
res.render('template.hbs', tplData);
})
}).catch(err => {
res.setHeader("Content-type", "text/plain");
res.end("erreur");
});
});
router.get("/:categories/:slug", function(req, res){
var categories = new Categories();
var articles = new Articles();
Promise.all([
categories.getNav(),
categories.getCategorie(req.params.categories)
]).then(data => {
var nav = data[0];
var categorie = data[1];
categories.getArticle(categorie, req.params.slug).then((result) => {
res.setHeader("Content-type", "text/html");
var tplData = {
"blogName": config.siteTitle,
"title": categorie.getTitle() + " - "+config.siteHomeTitle,
"nav": nav,
"content": result,
};
res.render('template.hbs', tplData);
})
}).catch(err => {
log.debug(err);
res.setHeader("Content-type", "text/plain");
res.end("erreur");
});
});
router.use(express.static("./public"));
module.exports = router;

300
package-lock.json generated
View File

@ -1,5 +1,5 @@
{
"name": "nodezzarela",
"name": "nodezzarella",
"version": "1.0.0",
"lockfileVersion": 1,
"dependencies": {
@ -33,11 +33,53 @@
"version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
},
"base64url": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
"integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs="
},
"bluebird": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz",
"integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE="
},
"body-parser": {
"version": "1.17.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz",
"integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=",
"dependencies": {
"debug": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
"integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4="
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
"buffer-equal-constant-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
},
"bytes": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
"integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk="
},
"camelcase": {
"version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
"optional": true
},
"camelize": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
"integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
},
"center-align": {
"version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
@ -63,10 +105,37 @@
"version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
},
"connect": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/connect/-/connect-3.6.2.tgz",
"integrity": "sha1-aU6NIGgb/kkCgsiriGvpjwn0L+c=",
"dependencies": {
"debug": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
"integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4="
},
"finalhandler": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz",
"integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk="
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
"content-disposition": {
"version": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
},
"content-security-policy-builder": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-1.1.0.tgz",
"integrity": "sha1-2R8bB2I2wRmFDH3umSS/VeBXcrM="
},
"content-type": {
"version": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
"integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0="
@ -75,14 +144,39 @@
"version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
},
"cookie-parser": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz",
"integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU="
},
"cookie-signature": {
"version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cors": {
"version": "https://registry.npmjs.org/cors/-/cors-2.8.1.tgz",
"integrity": "sha1-YYGqVqu0WiglvjMEcDdHrk6dI4M="
},
"crc": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz",
"integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms="
},
"dasherize": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz",
"integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg="
},
"dashify": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dashify/-/dashify-0.2.2.tgz",
"integrity": "sha1-agdBWgHJH69KMuONnfunH2HLIP4="
},
"debug": {
"version": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
"integrity": "sha1-eYVQkLosTjEVzH2HaUkdWPBJE1E="
@ -100,6 +194,21 @@
"version": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"dns-prefetch-control": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz",
"integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI="
},
"dont-sniff-mimetype": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz",
"integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g="
},
"ecdsa-sig-formatter": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
"integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE="
},
"ee-first": {
"version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
@ -116,10 +225,42 @@
"version": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz",
"integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE="
},
"expect-ct": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.0.tgz",
"integrity": "sha1-UnNWeN4YUwiQ2Ne5XwrGNkCVgJQ="
},
"express": {
"version": "https://registry.npmjs.org/express/-/express-4.15.2.tgz",
"integrity": "sha1-rxB/wUhQRFfy3Kmm8lcdcSm5ezU="
},
"express-jwt": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.0.tgz",
"integrity": "sha1-PZDNZYAuYzYlLxnmo98+FJ4MXqA="
},
"express-session": {
"version": "1.15.4",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.4.tgz",
"integrity": "sha1-Xizc9t7+PB7aTpgPE7mGzFjPuVQ=",
"dependencies": {
"debug": {
"version": "2.6.8",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw="
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
"express-unless": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.0.tgz",
"integrity": "sha1-XHlec5JXFRLdKPUgs4V6UrISYaI="
},
"finalhandler": {
"version": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.1.tgz",
"integrity": "sha1-vNFdFonA5e1ym29/VBpt+YQRfbg=",
@ -138,6 +279,11 @@
"version": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz",
"integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M="
},
"frameguard": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz",
"integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk="
},
"fresh": {
"version": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz",
"integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44="
@ -156,10 +302,50 @@
}
}
},
"helmet": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/helmet/-/helmet-3.6.1.tgz",
"integrity": "sha1-kfOqf6TJRnFZX7Vo39jChImjiL4="
},
"helmet-csp": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.4.0.tgz",
"integrity": "sha1-flOhVxZ6BkWq3XF30SrmxgXBhC4="
},
"hide-powered-by": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz",
"integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys="
},
"hoek": {
"version": "2.16.3",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
"integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
},
"hpkp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz",
"integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI="
},
"hsts": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hsts/-/hsts-2.0.0.tgz",
"integrity": "sha1-pSI0xgcN7PIUsra3C7FE0H5Hdsc="
},
"http-errors": {
"version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz",
"integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc="
},
"iconv-lite": {
"version": "0.4.15",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
"integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es="
},
"ienoopen": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz",
"integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms="
},
"inherits": {
"version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
@ -172,6 +358,38 @@
"version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
"integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw="
},
"isemail": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
"integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo="
},
"joi": {
"version": "6.10.1",
"resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
"integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY="
},
"jsonwebtoken": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz",
"integrity": "sha1-fKMk9SFfi+A5zTWmxFu4y3SkSPs=",
"dependencies": {
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
"jwa": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
"integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU="
},
"jws": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
"integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI="
},
"kind-of": {
"version": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz",
"integrity": "sha1-R11pil5J/15T0U4+cyQp3Iv0z0c="
@ -181,6 +399,21 @@
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
"optional": true
},
"lodash.once": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
},
"lodash.reduce": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
"integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs="
},
"lodash.set": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
"integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
},
"longest": {
"version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
@ -218,6 +451,11 @@
"version": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
},
"moment": {
"version": "2.18.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
"integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8="
},
"ms": {
"version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
"integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
@ -226,6 +464,11 @@
"version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
},
"nocache": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz",
"integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA="
},
"nopt": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz",
@ -235,6 +478,11 @@
"version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
},
"on-headers": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
"integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
},
"optimist": {
"version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY="
@ -247,6 +495,11 @@
"version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"platform": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz",
"integrity": "sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE="
},
"promise": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.0.0.tgz",
@ -260,19 +513,44 @@
"version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
"integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
},
"random-bytes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
"integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
},
"range-parser": {
"version": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
},
"raw-body": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz",
"integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y="
},
"referrer-policy": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz",
"integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk="
},
"repeat-string": {
"version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
},
"rethinkdb": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/rethinkdb/-/rethinkdb-2.3.3.tgz",
"integrity": "sha1-PcZYbiL6HavuDSVOZL0ON5+tL3I="
},
"right-align": {
"version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
"optional": true
},
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
"send": {
"version": "https://registry.npmjs.org/send/-/send-0.15.1.tgz",
"integrity": "sha1-igI1TCbm9cynAAZfXwzeupDse18="
@ -293,6 +571,11 @@
"version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
},
"topo": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
"integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU="
},
"type-is": {
"version": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
"integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA="
@ -314,6 +597,11 @@
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
"optional": true
},
"uid-safe": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz",
"integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE="
},
"unpipe": {
"version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
@ -339,6 +627,16 @@
"version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
},
"x-xss-protection": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz",
"integrity": "sha1-iYr7k4abJGYc+cUvnujbjtB2Tdk="
},
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
},
"yargs": {
"version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",

View File

@ -1,5 +1,5 @@
{
"name": "nodezzarela",
"name": "nodezzarella",
"version": "1.0.0",
"keywords": [
"util",
@ -15,12 +15,17 @@
},
"contributors": [],
"dependencies": {
"body-parser": "^1.17.2",
"color-logs": "0.6.1",
"cookie-parser": "^1.4.3",
"cors": "2.8.1",
"express": "4.15.2",
"express-session": "^1.15.4",
"handlebars": "4.0.6",
"hbs": "4.0.1",
"helmet": "^3.6.1",
"markdown": "^0.5.0",
"promise": "^8.0.0"
"promise": "^8.0.0",
"rethinkdb": "^2.3.3"
}
}

View File

@ -1,6 +1,6 @@
<nav>
{{#listNav data}}<div class="navItem"><a href="{{slug}}">{{title}}</a></div>{{/listNav}}
{{#listNav data}}<div class="navItem"><a href="/{{uri}}/">{{title}}</a></div>{{/listNav}}
<!--<div class="navItem"><a href="index.html">Accueil</a></div>
<div class="navItem"><a href="portfolio.html">Portfolio</a></div>
<div class="navItem">Contact</div>-->

21
views/admin/login.hbs Normal file
View File

@ -0,0 +1,21 @@
<div id="disclaimer">
<h2>Espace admin</h2>
<img class="separator" src="/assets/img/separator.png">
</div>
<main class="transparent">
<section>
<article>
<!-- <div class="articleTitle">
<h1></h1>
<p class="author">Par </p>
</div>-->
<div class="content">
<form action="" method="post">
<input type="input" name="login">
<input type="password" name="password">
<input type="submit" name="connexion">
</form>
</div>
</article>
</section>
</main>

View File

@ -1,18 +1,20 @@
<main>
<section>
<nav>
<button class="prev"><!--<img src="/assets/img/prev.png">Précédent--></button>
<img class="blackAsset separator" src="/assets/img/separator.png">
<button class="next"><!--Suivant<img src="/assets/img/next.png">--></button>
</nav>
<article>
<div class="articleTitle">
<h1>{{title}}</h1>
<p class="author">Par {{author}}</p>
</div>
<div class="content">
{{{content}}}
</div>
</article>
</section>
</main>
{{#article data}}
<main>
<section>
<nav>
<button class="prev"><!--<img src="/assets/img/prev.png">Précédent--></button>
<img class="blackAsset separator" src="/assets/img/separator.png">
<button class="next"><!--Suivant<img src="/assets/img/next.png">--></button>
</nav>
<article>
<div class="articleTitle">
<h1>{{title}}</h1>
<p class="author">Par {{author}}</p>
</div>
<div class="content">
{{{content}}}
</div>
</article>
</section>
</main>
{{/article}}

View File

@ -1,8 +0,0 @@
<div id="disclaimer">
<div class="titleLegend">{{categorie}}</div>
<img class="separator" src="assets/img/separator.png">
<h2>{{title}}</h2>
<a href="{{slug}}">
<button>Consulter</button>
</a>
</div>

View File

@ -1,3 +1,13 @@
{{#disclamer article}}
<div id="disclaimer">
<div class="titleLegend">{{categorieName}}</div>
<img class="separator" src="/assets/img/separator.png">
<h2>{{title}}</h2>
<a href="{{slug}}">
<button>Consulter</button>
</a>
</div>
{{/disclamer}}
<main class="transparent">
<section>
<div class="flexgrid">
@ -10,7 +20,7 @@
</div>
<div class="tileLegend">
<div class="content">
<div class="titleLegend">{{categorie}}</div>
<div class="titleLegend">{{categorieName}}</div>
<img class="blackAsset separator" src="/assets/img/separator.png">
<h2>{{title}}</h2>
</div>

View File

@ -4,6 +4,7 @@
<meta charset="UTF-8">
<title>{{title}}</title>
<link rel="stylesheet" href="/assets/css/global.css">
<link href='https://miaou.drycat.fr/favicon.ico' rel='icon' type='image/x-icon'>
</head>
<body>
<header>
@ -16,7 +17,6 @@
<button> </button>
</div>
</div>-->
{{{disclaimer}}}
{{{content}}}
<footer>

28
views/templateAdmin.hbs Normal file
View File

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Administration è {{title}}</title>
<link rel="stylesheet" href="/assets/css/global.css">
<link href='https://miaou.drycat.fr/favicon.ico' rel='icon' type='image/x-icon'>
</head>
<body>
<header>
<div id="logo"><a href="/">{{blogName}}</a></div>
{{{nav}}}
</header>
<!--<div class="search">
<div class="inputContainer">
<input type="search" placeholder="Rechercher...">
<button> </button>
</div>
</div>-->
{{{content}}}
<footer>
</footer>
<script src="/assets/js/jquery-2.2.0.min.js"></script>
<script src="/assets/js/parallax.js"></script>
<script src="/assets/js/searchInput.js"></script>
</body>
</html>