Skip to content

Commit a53431d

Browse files
author
thefenderstory
committed
Add chat-parser
1 parent 93080c5 commit a53431d

5 files changed

Lines changed: 64 additions & 5 deletions

File tree

chat-parser.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
"use strict";
2+
/**
3+
* chat-parser
4+
* https://github.com/nineage/pokepad
5+
* @license MIT license
6+
*/
7+
let demFeels = require('dem-feels');
8+
demFeels.setImageSize(1);
9+
10+
/**
11+
* escapeHTML
12+
* Prevents input from being parsed as HTML.
13+
* @param {String} str
14+
*/
15+
const escapeHTML = function (str) {
16+
if (!str) return '';
17+
return ('' + str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;').replace(/\//g, '&#x2f;');
18+
};
19+
20+
/**
21+
* parseMessage
22+
* Parses a message for emotes or hyperlinks.
23+
* @param {String} str
24+
*/
25+
exports.parseMessage = function(msg) {
26+
const message =
27+
// escape HTML
28+
escapeHTML(msg)
29+
30+
// remove zalgo
31+
.replace(/[\u0300-\u036f\u0483-\u0489\u0610-\u0615\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06ED\u0E31\u0E34-\u0E3A\u0E47-\u0E4E]{3,}/g, '')
32+
.replace(/[\u239b-\u23b9]/g, '')
33+
34+
// ``code``
35+
.replace(/\`\`([^< ](?:[^<`]*?[^< ])??)\`\`/g, '<code>$1</code>')
36+
37+
// __italics__
38+
.replace(/\_\_([^< ](?:[^<]*?[^< ])??)\_\_(?![^<]*?<\/a)/g, '<i>$1</i>')
39+
40+
// **bold**
41+
.replace(/\*\*([^< ](?:[^<]*?[^< ])??)\*\*/g, '<b>$1</b>')
42+
43+
// linking of URIs
44+
.replace(/(https?\:\/\/[a-z0-9-.]+(\/([^\s]*[^\s?.,])?)?|[a-z0-9]([a-z0-9-\.]*[a-z0-9])?\.(com|org|net|edu|tk|us|io|me)((\/([^\s]*[^\s?.,])?)?|\b))/ig, '<a href="$1" target="_blank">$1</a>')
45+
.replace(/<a href="([a-z]*[^a-z:])/g, '<a href="http://$1').replace(/(\bgoogle ?\[([^\]<]+)\])/ig, '<a href="http://www.google.com/search?ie=UTF-8&q=$2" target="_blank">$1</a>')
46+
.replace(/(\bgl ?\[([^\]<]+)\])/ig, '<a href="http://www.google.com/search?ie=UTF-8&btnI&q=$2" target="_blank">$1</a>')
47+
.replace(/(\bwiki ?\[([^\]<]+)\])/ig, '<a href="http://en.wikipedia.org/w/index.php?title=Special:Search&search=$2" target="_blank">$1</a>')
48+
.replace(/\[\[([^< ]([^<`]*?[^< ])?)\]\]/ig, '<a href="http://www.google.com/search?ie=UTF-8&btnI&q=$1" target="_blank">$1</a>');
49+
50+
// emotes
51+
return demFeels(message);
52+
}

client/public/css/style.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ form {
154154
overflow: auto;
155155
}
156156

157+
.dem-feels-emote {
158+
height: 30px !important;
159+
width: 30px !important;
160+
}
161+
157162
/************************/
158163
/* Editor Style
159164
/************************/

client/views/404.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ <h1 class="display-3 ">404</h1>
1515
<img src="/images/psyduck.gif" alt="It's a Psyduck"></img>
1616
<p class="lead">We couldn't find the room you are looking for. Create a new room below to get started! Inactive rooms are periodically deleted.</p>
1717
<hr class="my-2"></hr>
18-
<a href="./create" id="create-room" class="btn btn-primary btn-lg">Start Building!</a>
18+
<a href="/create" id="create-room" class="btn btn-primary btn-lg">Start Building!</a>
1919
</div>
2020
</div>
2121
</body>

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
},
1111
"dependencies": {
1212
"compression": "^1.6.2",
13+
"dem-feels": "^1.8.1",
1314
"ejs": "^2.5.2",
1415
"express": "4.10.2",
1516
"helmet": "^3.1.0",

server.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ app.use(express.static(__dirname + '/client/public'));
2424

2525
const Rooms = require('./rooms.js');
2626
const movesets = require('./setdex-xy.js');
27+
const parser = require('./chat-parser.js');
2728

2829
const serverData = require('./server-data.js');
2930
const randPoke = serverData.randPoke;
@@ -184,7 +185,7 @@ app.get('/view/:id', (req,res) => {
184185
/**
185186
* Socket events
186187
*/
187-
188+
188189
io.on('connection', (socket) => {
189190
socket.pokemon = randPoke();
190191
socket.name = 'Anonymous ' + socket.pokemon;
@@ -205,8 +206,8 @@ io.on('connection', (socket) => {
205206
});
206207
socket.on('chat message', (msg, room) => {
207208
if (msg.trim().length < 1) return;
208-
io.sockets.in(socket.room).emit('chat message', socket.name, socket.img, escapeHTML(msg));
209-
Rooms.updateChat(socket.room, socket.name, socket.img, msg);
209+
io.sockets.in(socket.room).emit('chat message', socket.name, socket.img, parser.parseMessage(msg));
210+
Rooms.updateChat(socket.room, socket.name, socket.img, parser.parseMessage(msg));
210211
});
211212
socket.on('send team', (res) => {
212213
socket.emit(res, Rooms.getTeam(socket.room));
@@ -378,7 +379,7 @@ io.on('connection', (socket) => {
378379
socket.on('get view only', () => {
379380
if (!socket.edit) return;
380381
let room = socket.room;
381-
io.sockets.in(room).emit('view only', Rooms.rooms[room].viewid || '');
382+
io.sockets.in(room).emit('view only', Rooms.rooms[room].viewid || '');
382383
});
383384
socket.on('disconnect', () => {
384385
let msg = socket.name + ' has left.';

0 commit comments

Comments
 (0)