This commit is contained in:
Flummi 2020-04-06 22:15:26 +02:00
parent 8b9824e5fa
commit 3afd63b86a
6 changed files with 27 additions and 31 deletions

View File

@ -1,22 +1,12 @@
import router from "../router.mjs"; import router from "../router.mjs";
import cfg from "../../../config.json"; import cfg from "../../../config.json";
import fs from "fs"; import path from "path";
import url from "url"; import url from "url";
import sql from "../sql.mjs"; import sql from "../sql.mjs";
import lib from "../lib.mjs"; import lib from "../lib.mjs";
import tpl from "../tpl.mjs"; import tpl from "../tpl.mjs";
const templates = { tpl.readdir("views");
contact: fs.readFileSync("./views/contact.html", "utf-8"),
how: fs.readFileSync("./views/how.html", "utf-8"),
index: fs.readFileSync("./views/index.html", "utf-8"),
item: fs.readFileSync("./views/item.html", "utf-8"),
snippets: {
navbar: fs.readFileSync("./views/snippets/navbar.html", "utf-8")
}
};
tpl.snippets = templates.snippets;
router.get("/", async (req, res) => { router.get("/", async (req, res) => {
const query = await sql.query("select id, mime from items order by id desc limit 300"); const query = await sql.query("select id, mime from items order by id desc limit 300");
@ -25,7 +15,7 @@ router.get("/", async (req, res) => {
last: query[query.length - 1].id last: query[query.length - 1].id
}; };
res.reply({ body: tpl.render(templates.index, data) }); res.reply({ body: tpl.render("views/index", data) });
}); });
router.get(/^\/([0-9]+)$/, async (req, res) => { router.get(/^\/([0-9]+)$/, async (req, res) => {
@ -58,11 +48,11 @@ router.get(/^\/([0-9]+)$/, async (req, res) => {
next: query[1].length ? query[1][0].id : null, next: query[1].length ? query[1][0].id : null,
prev: query[2].length ? query[2][0].id : null prev: query[2].length ? query[2][0].id : null
}; };
res.reply({ body: tpl.render(templates.item, data) }); res.reply({ body: tpl.render("views/item", data) });
}); });
router.get(/^\/(contact|help|how)$/, (req, res) => { router.get(/^\/(contact|help|how)$/, (req, res) => {
res.reply({ body: tpl.render(templates[req.url.split[0]]) }); res.reply({ body: tpl.render(`views/${req.url.split[0]}`) });
}); });
router.get("/random", async (req, res) => { router.get("/random", async (req, res) => {

View File

@ -1,18 +1,24 @@
import fs from "fs";
import path from "path";
export default new class { export default new class {
snippets = {}; #templates = {};
#syntax = [ #syntax = [
[ "each", t => { [ "each", (t, args = t.slice(4).trim().split(" ")) => `util.forEach(${args[0]},(${(args[1] === "as" && args[2]) ? args[2] : "value"},key)=>{` ],
const tmp = t.slice(4).trim().split(" ");
return `util.forEach(${tmp[0]},(${(tmp[1] === "as" && tmp[2]) ? tmp[2] : "value"},key)=>{`;
} ],
[ "/each", () => "});" ], [ "/each", () => "});" ],
[ "if", t => `if(${t.slice(2).trim()}){` ], [ "if", t => `if(${t.slice(2).trim()}){` ],
[ "elseif", t => `}else if(${t.slice(6).trim()}){` ], [ "elseif", t => `}else if(${t.slice(6).trim()}){` ],
[ "else", () => "}else{" ], [ "else", () => "}else{" ],
[ "/if", () => "}" ], [ "/if", () => "}" ],
[ "include", t => `html+=util.snippets["${t.slice(7).trim()}"];`], [ "include", t => `html+=util.tpl["${t.slice(7).trim()}"];`],
[ "=", t => `html+=${t.slice(1).trim()};` ] [ "=", t => `html+=${t.slice(1).trim()};` ]
]; ];
readdir(dir, root = dir, rel = dir.replace(`${root}/`, "")) {
for(const d of fs.readdirSync(`${path.resolve()}/${dir}`))
d.endsWith(".html")
? this.#templates[`${rel}/${d.split(".")[0]}`] = fs.readFileSync(`${dir}/${d}`, "utf-8").replace(/\'/g, "\\'")
: this.readdir(`${dir}/${d}`, root);
}
forEach(o, f) { forEach(o, f) {
if(Array.isArray(o)) if(Array.isArray(o))
o.forEach(f); o.forEach(f);
@ -22,13 +28,13 @@ export default new class {
throw new Error(`${o} is not a iterable object`); throw new Error(`${o} is not a iterable object`);
} }
render(tpl, data = {}, f) { render(tpl, data = {}, f) {
return new Function("util", "data", "let html = \"\";with(data){" + tpl return new Function("util", "data", "let html = \"\";with(data){" + this.#templates[tpl]
.trim() .trim()
.replace(/[\n\r]/g, "") .replace(/[\n\r]/g, "")
.split(/{{\s*([^}]+)\s*}}/) .split(/{{\s*([^}]+)\s*}}/)
.filter(Boolean) .filter(Boolean)
.map(t => !(f = this.#syntax.filter(s => t.startsWith(s[0]))[0]) ? `html+='${t}';` : f[1](t)) .map(t => !(f = this.#syntax.filter(s => t.startsWith(s[0]))[0]) ? `html+='${t}';` : f[1](t))
.join("") + "}return html.trim().replace(/>[\\n\\r\\s]*?</g, '><')") .join("") + "}return html.trim().replace(/>[\\n\\r\\s]*?</g, '><')"
.bind(null, { forEach: this.forEach, snippets: this.snippets })(data); ).bind(null, { forEach: this.forEach, tpl: this.#templates })(data);
} }
}; };

View File

@ -7,7 +7,7 @@
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css"> <link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
</head> </head>
<body> <body>
{{include navbar}} {{include snippets/navbar}}
<div class="container"> <div class="container">
<div class="contact"> <div class="contact">
<p>Got a problem? We have the answer: <a href="mailto:admin@f0ck.space">admin@f0ck.space</a></p> <p>Got a problem? We have the answer: <a href="mailto:admin@f0ck.space">admin@f0ck.space</a></p>

View File

@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
</head> </head>
<body> <body>
{{include navbar}} {{include snippets/navbar}}
<div class="container"> <div class="container">
<div class="irc"> <div class="irc">
<h4>irc.n0xy.net +6697 (ssl only) #f0ck</h4> <h4>irc.n0xy.net +6697 (ssl only) #f0ck</h4>
@ -29,12 +29,12 @@
</ul> </ul>
<h4>What the f0ck is a f0ck?</h4> <h4>What the f0ck is a f0ck?</h4>
<p>A f0ck is basically giving a fuck about some internet bullshit, like stupid images, videos and so on, but also <p>A f0ck is basically giving a fuck about some internet bullshit, like stupid images, videos and so on, but also
for great things like good music taste and shit, it\'s basically "a f0ck was given" and f0ck and it\'s users gave for great things like good music taste and shit, it's basically "a f0ck was given" and f0ck and it's users gave
a lot of f0cks over the past years, it\'s not hard to finally start giving a damn f0ck about something, just a lot of f0cks over the past years, it's not hard to finally start giving a damn f0ck about something, just
f0ck.it dood!</p> f0ck.it dood!</p>
<h4>how the f0ck to f0ck, you ask?</h4> <h4>how the f0ck to f0ck, you ask?</h4>
<p>f0ck will f0ck any media link posted in the channel ending with: jpg|gif|png|webm|mp3|mp4|ogg|flac</p> <p>f0ck will f0ck any media link posted in the channel ending with: jpg|gif|png|webm|mp3|mp4|ogg|flac</p>
<p>If you don\'t want f0ck to f0ck it put !ignore behind your link. Example: <p>If you don't want f0ck to f0ck it put !ignore behind your link. Example:
https://retard-journal.com/stupidshit.png !ignore</a> https://retard-journal.com/stupidshit.png !ignore</a>
<p>f0ck will only f0ck media links with the maximum size of 30MB for cool people 80MB</p> <p>f0ck will only f0ck media links with the maximum size of 30MB for cool people 80MB</p>
<p>YouTube Links are currently not working, if you really want to f0ck them, you gotta download it yourself and <p>YouTube Links are currently not working, if you really want to f0ck them, you gotta download it yourself and

View File

@ -8,7 +8,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
</head> </head>
<body> <body>
{{include navbar}} {{include snippets/navbar}}
<div class="container-fluid"> <div class="container-fluid">
<ul id="posts" data-last="{{=last}}"> <ul id="posts" data-last="{{=last}}">
{{each items as item}} {{each items as item}}

View File

@ -15,7 +15,7 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
</head> </head>
<body> <body>
{{include navbar}} {{include snippets/navbar}}
<div class="container"> <div class="container">
<div class="controls"> <div class="controls">
<a id="rndbtn" href="/random">Random</a> <a id="rndbtn" href="/random">Random</a>