summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorWu Cheng-Han2016-10-10 20:55:33 +0800
committerWu Cheng-Han2016-10-10 20:55:33 +0800
commit36a1900ce3496f2d71ae4c41609dc52d24636be2 (patch)
tree1c99b91af2cd54cafef4a3b01b0d2a8d7f551721 /lib
parent1d2a9826af247883ff8e67b346263e5e2cd49791 (diff)
Update to make note history count in server-side when user logged
Diffstat (limited to '')
-rw-r--r--lib/models/note.js57
-rw-r--r--lib/realtime.js14
2 files changed, 69 insertions, 2 deletions
diff --git a/lib/models/note.js b/lib/models/note.js
index 3478538f..08ef083d 100644
--- a/lib/models/note.js
+++ b/lib/models/note.js
@@ -218,8 +218,23 @@ module.exports = function (sequelize, DataTypes) {
return callback(null, null);
});
},
+ parseNoteInfo: function (body) {
+ var meta = null;
+ try {
+ var obj = metaMarked(body);
+ body = obj.markdown;
+ meta = obj.meta;
+ } catch (err) {
+ //na
+ }
+ if (!meta) meta = {};
+ var $ = cheerio.load(md.render(body));
+ return {
+ title: Note.extractNoteTitle(meta, $),
+ tags: Note.extractNoteTags(meta, $)
+ };
+ },
parseNoteTitle: function (body) {
- var title = "";
var meta = null;
try {
var obj = metaMarked(body);
@@ -229,10 +244,14 @@ module.exports = function (sequelize, DataTypes) {
//na
}
if (!meta) meta = {};
+ var $ = cheerio.load(md.render(body));
+ return Note.extractNoteTitle(meta, $);
+ },
+ extractNoteTitle: function (meta, $) {
+ var title = "";
if (meta.title && (typeof meta.title == "string" || typeof meta.title == "number")) {
title = meta.title;
} else {
- var $ = cheerio.load(md.render(body));
var h1s = $("h1");
if (h1s.length > 0 && h1s.first().text().split('\n').length == 1)
title = S(h1s.first().text()).stripTags().s;
@@ -250,6 +269,40 @@ module.exports = function (sequelize, DataTypes) {
title = !title || title == "Untitled" ? "HackMD - Collaborative markdown notes" : title + " - HackMD";
return title;
},
+ extractNoteTags: function (meta, $) {
+ var tags = [];
+ var rawtags = [];
+ if (meta.tags && (typeof meta.tags == "string" || typeof meta.tags == "number")) {
+ var metaTags = ('' + meta.tags).split(',');
+ for (var i = 0; i < metaTags.length; i++) {
+ var text = metaTags[i].trim();
+ if (text) rawtags.push(text);
+ }
+ } else {
+ var h6s = $("h6");
+ h6s.each(function (key, value) {
+ if (/^tags/gmi.test($(value).text())) {
+ var codes = $(value).find("code");
+ for (var i = 0; i < codes.length; i++) {
+ var text = $(codes[i]).html().trim();
+ if (text) rawtags.push(text);
+ }
+ }
+ });
+ }
+ for (var i = 0; i < rawtags.length; i++) {
+ var found = false;
+ for (var j = 0; j < tags.length; j++) {
+ if (tags[j] == rawtags[i]) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ tags.push(rawtags[i]);
+ }
+ return tags;
+ },
parseMeta: function (meta) {
var _meta = {};
if (meta) {
diff --git a/lib/realtime.js b/lib/realtime.js
index c9c6543c..a05c1f41 100644
--- a/lib/realtime.js
+++ b/lib/realtime.js
@@ -13,6 +13,7 @@ var moment = require('moment');
//core
var config = require("./config.js");
var logger = require("./logger.js");
+var history = require("./history.js");
var models = require("./models");
//ot
@@ -390,6 +391,12 @@ function finishConnection(socket, note, user) {
note.server.setName(socket, user.name);
note.server.setColor(socket, user.color);
+ // update user note history
+ setTimeout(function () {
+ var noteId = note.alias ? note.alias : LZString.compressToBase64(note.id);
+ history.updateHistory(user.userid, noteId, note.server.document);
+ }, 0);
+
emitOnlineUsers(socket);
emitRefresh(socket);
@@ -468,6 +475,7 @@ function startConnection(socket) {
notes[noteId] = {
id: noteId,
+ alias: note.alias,
owner: owner,
ownerprofile: ownerprofile,
permission: note.permission,
@@ -652,6 +660,12 @@ function operationCallback(socket, operation) {
return logger.error('operation callback failed: ' + err);
});
}
+ // update user note history
+ setTimeout(function() {
+ var noteId = note.alias ? note.alias : LZString.compressToBase64(note.id);
+ history.updateHistory(userId, noteId, note.server.document);
+ }, 0);
+
}
// save authorship
note.authorship = models.Note.updateAuthorshipByOperation(operation, userId, note.authorship);