Browse Source

/new page implemented

master
Christian Müller 10 years ago
parent
commit
b05f103a37
  1. 27
      messages.json
  2. 1
      package.json
  3. 33
      resources/new.html
  4. 18
      resources/public/js/publishing.js
  5. 4
      resources/template.html
  6. 15
      server.js
  7. 11
      src/page.js

27
messages.json

@ -1,27 +0,0 @@
{
"page-title": "Free Pastebin for One-Off Markdown Publishing",
"title": "Free and Hassle-free Pastebin for Markdown Notes.",
"name": "NoteHub",
"new-page": "New Page",
"status-404": "Not Found",
"status-400": "Bad Request",
"status-403": "Forbidden",
"status-500": "Internal Server Error",
"footer": "Source code on [GitHub](https://github.com/chmllr/NoteHub) &middot; Hosted on [Heroku](http://heroku.com) &middot; DB on [RedisLabs](http://redislabs.com) &middot; SSL by [CloudFlare](http://cloudflare.com) <br/> Created by [@chmllr](https://github.com/chmllr)",
"loading": "Loading...",
"set-passwd": "Password for editing",
"enter-passwd": "Password",
"publish": "Publish",
"update": "Save",
"published": "Published",
"publisher": "Publisher",
"edited": "Edited",
"views": "Article Views",
"statistics": "Statistics",
"stats": "statistics",
"export": "export",
"notehub": "&#8962; notehub",
"edit": "edit",
"short-url": "short url",
"api-title": "API"
}

1
package.json

@ -26,6 +26,7 @@
"express": "^4.13.3", "express": "^4.13.3",
"lru-cache": "^2.6.5", "lru-cache": "^2.6.5",
"marked": "^0.3.5", "marked": "^0.3.5",
"md5": "^2.0.0",
"sequelize": "^3.8.0", "sequelize": "^3.8.0",
"sqlite3": "^3.1.0" "sqlite3": "^3.1.0"
} }

33
resources/new.html

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html>
<head>
<title>NoteHub &mdash; New Page</title>
<meta charset="UTF-8" />
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
<link href="/style.css" rel="stylesheet" type="text/css" />
<script src="//cdnjs.cloudflare.com/ajax/libs/marked/0.3.5/marked.min.js" type="text/javascript"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/blueimp-md5/1.0.1/js/md5.min.js" type="text/javascript"></script>
<script src="/js/publishing.js" type="text/javascript"></script>
</head>
<body onload="onLoad()">
<article id="preview" style="flex: none; -webkit-flex: none"></article>
<div class="hidden" id="dashed-line"></div>
<div class="central-element helvetica" style="margin-bottom: 3em">
<form action="/note" autocomplete="off" method="%METHOD%">
<input id="password" name="password" type="hidden">
<input id="session" name="session" type="hidden" value="%SESSION%" />
<input id="signature" name="signature" type="hidden" />
<textarea id="note" name="note">Loading...</textarea>
<fieldset class="hidden" id="input-elems">
<input class="ui-elem" id="plain-password" name="plain-password" placeholder="Password for editing" type="text">&nbsp;
<input class="button ui-elem" id="publish-button" type="submit" value="Publish">
<br>
<br>
</fieldset>
</form>
</div>
</body>
</html>

18
resources/public/js/publishing.js

@ -1,8 +1,12 @@
var $ = function(id){ return document.getElementById(id); } var $ = function(id) {
return document.getElementById(id);
}
var iosDetected = navigator.userAgent.match("(iPad|iPod|iPhone)"); var iosDetected = navigator.userAgent.match("(iPad|iPod|iPhone)");
var timer = null; var timer = null;
var timerDelay = iosDetected ? 800 : 400; var timerDelay = iosDetected ? 800 : 400;
var show = function(elem) { elem.style.display = "block" } var show = function(elem) {
elem.style.display = "block"
}
var $note, $action, $preview, $plain_password, $input_elems, $dashed_line, $proposed_title, updatePreview; var $note, $action, $preview, $plain_password, $input_elems, $dashed_line, $proposed_title, updatePreview;
var backendTimer; var backendTimer;
@ -12,7 +16,7 @@ function md2html(input){
function onLoad() { function onLoad() {
$note = $("note"); $note = $("note");
$action = $("action"); $action = document.getElementsByTagName("form")[0].method;
$preview = $("preview"); $preview = $("preview");
$plain_password = $("plain-password"); $plain_password = $("plain-password");
$proposed_title = $("proposed-title"); $proposed_title = $("proposed-title");
@ -28,14 +32,14 @@ function onLoad () {
$preview.innerHTML = md2html(content); $preview.innerHTML = md2html(content);
}, delay); }, delay);
}; };
if($action){ if ($action.value == "update") updatePreview();
if($action.value == "update") updatePreview(); else $note.value = ""; else $note.value = "";
$note.onkeyup = updatePreview; $note.onkeyup = updatePreview;
$("publish-button").onclick = function(e) { $("publish-button").onclick = function(e) {
if ($plain_password.value != "") $("password").value = md5($plain_password.value); if ($plain_password.value != "") $("password").value = md5($plain_password.value);
$plain_password.value = null; $plain_password.value = null;
$("signature").value = md5($("session").value + $note.value); $("signature").value = md5($("session").value + $note.value);
} }
if(iosDetected) $note.className += " ui-border"; else $note.focus(); if (iosDetected) $note.className += " ui-border";
} else $note.focus();
} }

4
resources/template.html

@ -2,8 +2,8 @@
<html> <html>
<head> <head>
<title>NoteHub &mdash; %TITLE%</title> <title>NoteHub &mdash; %TITLE%</title>
<meta charset="UTF-8"> <meta charset="UTF-8" />
<meta content="width=device-width, initial-scale=1.0" name="viewport"> <meta content="width=device-width, initial-scale=1.0" name="viewport" />
<link href="/style.css" rel="stylesheet" type="text/css" /> <link href="/style.css" rel="stylesheet" type="text/css" />
</head> </head>
<body> <body>

15
server.js

@ -1,15 +1,26 @@
var express = require('express'); var express = require('express');
var page = require('./src/page'); var page = require('./src/page');
var storage = require('./src/storage'); var storage = require('./src/storage');
var md5 = require('md5');
var LRU = require("lru-cache"); var LRU = require("lru-cache");
var app = express(); var app = express();
var CACHE = new LRU(30); var CACHE = new LRU(30);
var getTimeStamp = () => {
var timestamp = new Date().getTime();
timestamp = Math.floor(timestamp / 10000000);
return (timestamp).toString(16)
}
app.use(express.static(__dirname + '/resources/public')); app.use(express.static(__dirname + '/resources/public'));
app.get('/new', function (req, res) { app.get('/new', function (req, res) {
res.send("opening new note mask") res.send(page.newNotePage(getTimeStamp() + md5(Math.random())));
});
app.post('/note', function (req, res) {
console.log(req.params);
}); });
app.get("/:year/:month/:day/:title", function (req, res) { app.get("/:year/:month/:day/:title", function (req, res) {
@ -22,7 +33,7 @@ app.get(/\/([a-zA-Z0-9]*)/, function (req, res) {
var link = req.params["0"].toLowerCase(); var link = req.params["0"].toLowerCase();
if (CACHE.has(link)) res.send(CACHE.get(link)); if (CACHE.has(link)) res.send(CACHE.get(link));
else storage.getNote(link).then(note => { else storage.getNote(link).then(note => {
var content = page.build(note); var content = page.buildNote(note);
CACHE.set(link, content); CACHE.set(link, content);
res.send(content); res.send(content);
}); });

11
src/page.js

@ -1,10 +1,15 @@
var marked = require("marked"); var marked = require("marked");
var fs = require("fs"); var fs = require("fs");
var template = fs.readFileSync("resources/template.html", "utf-8"); var pageTemplate = fs.readFileSync("resources/template.html", "utf-8");
var buildHTML = (id, title, content) => template var newNoteTemplate = fs.readFileSync("resources/new.html", "utf-8");
var buildPage = (id, title, content) => pageTemplate
.replace("%TITLE%", title) .replace("%TITLE%", title)
.replace(/%LINK%/g, id) .replace(/%LINK%/g, id)
.replace("%CONTENT%", content); .replace("%CONTENT%", content);
module.exports.build = note => buildHTML(note.id, note.title, marked(note.text)); module.exports.buildNote = note => buildPage(note.id, note.title, marked(note.text));
module.exports.newNotePage = session => newNoteTemplate
.replace("%METHOD%", "POST")
.replace("%SESSION%", session);

Loading…
Cancel
Save