try display article
This commit is contained in:
parent
d8db4101d0
commit
676ae5bee4
55
app.js
55
app.js
|
@ -20,6 +20,8 @@ var corsOptions = {
|
||||||
*/
|
*/
|
||||||
const config = require("./config.json");
|
const config = require("./config.json");
|
||||||
var Template = require("./classes/Template.class");
|
var Template = require("./classes/Template.class");
|
||||||
|
var Categories = require("./classes/Categories.class");
|
||||||
|
var Articles = require("./classes/Articles.class");
|
||||||
|
|
||||||
class App {
|
class App {
|
||||||
constructor(rootPath, port){
|
constructor(rootPath, port){
|
||||||
|
@ -33,9 +35,10 @@ class App {
|
||||||
var template = new Template();
|
var template = new Template();
|
||||||
|
|
||||||
app.get("/", function(req, res){
|
app.get("/", function(req, res){
|
||||||
|
var categories = new Categories();
|
||||||
Promise.all([
|
Promise.all([
|
||||||
template.getNav(),
|
template.getNav(),
|
||||||
template.getHome()
|
categories.getHome()
|
||||||
]).then(data => {
|
]).then(data => {
|
||||||
var nav = data[0];
|
var nav = data[0];
|
||||||
var content = data[1];
|
var content = data[1];
|
||||||
|
@ -48,7 +51,6 @@ class App {
|
||||||
};
|
};
|
||||||
res.render('template.hbs', tplData);
|
res.render('template.hbs', tplData);
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
console.error(err);
|
|
||||||
res.setHeader("Content-type", "text/plain");
|
res.setHeader("Content-type", "text/plain");
|
||||||
|
|
||||||
res.end("erreur");
|
res.end("erreur");
|
||||||
|
@ -57,14 +59,53 @@ class App {
|
||||||
|
|
||||||
});
|
});
|
||||||
app.get("/:slug", function(req, res){
|
app.get("/:slug", function(req, res){
|
||||||
res.setHeader("Content-type", "text/plain");
|
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,
|
||||||
|
"nav": nav,
|
||||||
|
"content": content
|
||||||
|
};
|
||||||
|
res.render('template.hbs', tplData);
|
||||||
|
}).catch(err => {
|
||||||
|
res.setHeader("Content-type", "text/plain");
|
||||||
|
|
||||||
res.end("Slug : "+req.params.slug);
|
res.end("erreur");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
app.get("/article/:slug", function(req, res){
|
app.get("/:categories/:slug", function(req, res){
|
||||||
res.setHeader("Content-type", "text/plain");
|
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 dataCategories = data[2];
|
||||||
|
res.setHeader("Content-type", "text/html");
|
||||||
|
var tplData = {
|
||||||
|
"blogName": config.blogName,
|
||||||
|
"title": dataCategories.title,
|
||||||
|
"nav": nav,
|
||||||
|
"content": content
|
||||||
|
};
|
||||||
|
res.render('template.hbs', tplData);
|
||||||
|
}).catch(err => {
|
||||||
|
res.setHeader("Content-type", "text/plain");
|
||||||
|
|
||||||
res.end("Slug : "+req.params.slug);
|
res.end("erreur");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
app.use(express.static("./public"));
|
app.use(express.static("./public"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
const log = require('color-logs')(true, true, "Articles.class.js"),
|
|
||||||
fs = require("fs");
|
|
||||||
|
|
||||||
var title,
|
|
||||||
author,
|
|
||||||
content,
|
|
||||||
date,
|
|
||||||
slug;
|
|
||||||
|
|
||||||
class Article {
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Article;
|
|
44
classes/Articles.class.js
Normal file
44
classes/Articles.class.js
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
const log = require('color-logs')(true, true, "Articles.class.js"),
|
||||||
|
hbs = require('handlebars'),
|
||||||
|
promise = require('promise'),
|
||||||
|
markdown = require('markdown').markdown,
|
||||||
|
fs = require("fs");
|
||||||
|
|
||||||
|
var title,
|
||||||
|
author,
|
||||||
|
content,
|
||||||
|
date,
|
||||||
|
slug;
|
||||||
|
|
||||||
|
class Articles {
|
||||||
|
|
||||||
|
getArticle(categories, article){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fs.readFile('./views/articles/article.hbs', 'utf-8', (error, source) => {
|
||||||
|
var paramPath = "./ressources/"+catehorie+"/"+article+".json"; // path to param of article
|
||||||
|
var contentPath = "./ressources/"+catehorie+"/"+article+".md"; //path to article
|
||||||
|
fs.access(paramPath, fs.constants.F_OK || fs.constants.R_OK, (error) => {
|
||||||
|
if(error)
|
||||||
|
resolve(new Error("File not exist"));
|
||||||
|
else
|
||||||
|
fs.access(contentPath, fs.constants.F_OK || fs.constants.R_OK, (error) => {
|
||||||
|
if(error)
|
||||||
|
resolve(new Error("File not exist"));
|
||||||
|
else{
|
||||||
|
console.log(markdown.toHTML(require("."+contentPath)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const data = require('../ressources/lastArticles.json');
|
||||||
|
hbs.registerHelper('articles', (articles) =>{
|
||||||
|
return articles;
|
||||||
|
});
|
||||||
|
var template = hbs.compile(source);
|
||||||
|
var html = template(data);
|
||||||
|
resolve(html);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Articles;
|
|
@ -1,20 +0,0 @@
|
||||||
const log = require('color-logs')(true, true, "Categories.class.js"),
|
|
||||||
path = require('path'),
|
|
||||||
fs = require("fs");
|
|
||||||
|
|
||||||
var title,
|
|
||||||
slug,
|
|
||||||
position;
|
|
||||||
|
|
||||||
class Categorie {
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {string} folder where located categories
|
|
||||||
* @returns {nm$_Categorie.class.Categorie}
|
|
||||||
*/
|
|
||||||
constructor(folder){
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Categorie;
|
|
83
classes/Categories.class.js
Normal file
83
classes/Categories.class.js
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
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) => {
|
||||||
|
const data = require('../ressources/lastArticles.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) => {
|
||||||
|
const data = require('../ressources/lastArticles.json');
|
||||||
|
hbs.registerHelper('articles', (articles) =>{
|
||||||
|
return articles;
|
||||||
|
});
|
||||||
|
var template = hbs.compile(source);
|
||||||
|
var html = template(data);
|
||||||
|
resolve(html);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Categories;
|
|
@ -4,36 +4,15 @@ const log = require('color-logs')(true, true, "Template.class.js"),
|
||||||
promise = require('promise'),
|
promise = require('promise'),
|
||||||
config = require('../config.json');
|
config = require('../config.json');
|
||||||
|
|
||||||
var Categorie = require('../classes/Categorie.class.js');
|
|
||||||
var Article = require('../classes/Article.class.js');
|
|
||||||
|
|
||||||
hbs.registerHelper('listNav', function(tabs, options) {
|
hbs.registerHelper('listNav', function(tabs, options) {
|
||||||
var out = '';
|
var out = '';
|
||||||
for(var x in options['data']['root']){
|
for(var x in options['data']['root']){
|
||||||
console.log(x);
|
|
||||||
out = out + "" + options.fn(options['data']['root'][x]) + "";
|
out = out + "" + options.fn(options['data']['root'][x]) + "";
|
||||||
|
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
});
|
});
|
||||||
|
|
||||||
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 Template {
|
class Template {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -56,19 +35,8 @@ class Template {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getHome(){
|
getToot(){
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
fs.readFile('./views/articles/list.hbs', 'utf-8', (error, source) => {
|
|
||||||
const data = require('../ressources/lastArticles.json');
|
|
||||||
hbs.registerHelper('articles', (articles) =>{
|
|
||||||
return articles;
|
|
||||||
});
|
|
||||||
var template = hbs.compile(source);
|
|
||||||
var html = template(data);
|
|
||||||
console.log(html);
|
|
||||||
resolve(html);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
15
package-lock.json
generated
15
package-lock.json
generated
|
@ -3,6 +3,11 @@
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"abbrev": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz",
|
||||||
|
"integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8="
|
||||||
|
},
|
||||||
"accepts": {
|
"accepts": {
|
||||||
"version": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
|
"version": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
|
||||||
"integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo="
|
"integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo="
|
||||||
|
@ -180,6 +185,11 @@
|
||||||
"version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
"version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||||
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
|
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
|
||||||
},
|
},
|
||||||
|
"markdown": {
|
||||||
|
"version": "0.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/markdown/-/markdown-0.5.0.tgz",
|
||||||
|
"integrity": "sha1-KCBbVlqK51kt4gdGPWY33BgnIrI="
|
||||||
|
},
|
||||||
"media-typer": {
|
"media-typer": {
|
||||||
"version": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
"version": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
|
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
|
||||||
|
@ -216,6 +226,11 @@
|
||||||
"version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
|
"version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
|
||||||
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
|
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
|
||||||
},
|
},
|
||||||
|
"nopt": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz",
|
||||||
|
"integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8="
|
||||||
|
},
|
||||||
"on-finished": {
|
"on-finished": {
|
||||||
"version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
"version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
||||||
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
|
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
"express": "4.15.2",
|
"express": "4.15.2",
|
||||||
"handlebars": "4.0.6",
|
"handlebars": "4.0.6",
|
||||||
"hbs": "4.0.1",
|
"hbs": "4.0.1",
|
||||||
|
"markdown": "^0.5.0",
|
||||||
"promise": "^8.0.0"
|
"promise": "^8.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
4
ressources/tests/params.json
Normal file
4
ressources/tests/params.json
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"title": "tests",
|
||||||
|
"description": "tests description"
|
||||||
|
}
|
4
ressources/tests2/params.json
Normal file
4
ressources/tests2/params.json
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"title": "tests2",
|
||||||
|
"description": "tests description"
|
||||||
|
}
|
18
views/articles/article.hbs
Normal file
18
views/articles/article.hbs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
<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">{{author}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
{{{content}}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
</main>
|
Reference in a new issue