-
Notifications
You must be signed in to change notification settings - Fork 0
/
comment.cpp
67 lines (63 loc) · 1.46 KB
/
comment.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <sstream>
#include "comment.h"
#include "engine.h"
static std::string escape(const std::string &str)
{
std::ostringstream ret;
for (const char c : str) {
if (c == '<')
ret << "<";
else if (c == '>')
ret << ">";
else
ret << c;
}
return ret.str();
}
static std::string limit(std::string str, size_t size)
{
if (str.size() > size)
str.resize(size);
std::string::iterator i = str.begin();
while (true) {
std::string::iterator j = i;
for (int k = 0; k < 80; k++) {
if (*j == '\n')
k = 1;
if (j != str.end())
++j;
}
if (j == str.end())
break;
while (*j != ' ' && j != str.end())
j++;
if (j == str.end())
break;
*j = '\n';
i = ++j;
}
return str;
}
std::istream &operator >>(std::istream &stream, Comment &comment)
{
std::getline(stream, comment.nickname);
std::getline(stream, comment.text, '\0');
comment.nickname = escape(comment.nickname);
comment.text = escape(comment.text);
comment.nickname = limit(comment.nickname, 64);
comment.text = limit(comment.text, 16384);
return stream;
}
std::ostream &operator <<(std::ostream &stream, const Comment &comment)
{
tags::article article;
article.push_attr("class", "comment");
tags::h4 h4;
h4.innerhtml(comment.nickname);
tags::pre pre;
tags::i i;
i.innerhtml(comment.text);
pre.innerhtml(i.content());
article.innerhtml(h4.content() + pre.content());
return stream << article.content() << std::endl;
}