web page anchors

master
const an teen 2022-02-11 02:19:32 -05:00
parent 0704122bfd
commit 304d917fd2
4 changed files with 153 additions and 22 deletions

View File

@ -358,15 +358,19 @@ body {
width: 95%; width: 95%;
margin: 1% 0 0 2.5%; margin: 1% 0 0 2.5%;
font-size: 18px; font-size: 18px;
color: #821010;
} }
.main_payload__chat_username { .main_payload__chat_username {
text-decoration: none;
flex: 10%; flex: 10%;
margin-right: 1%; margin-right: 1%;
font-weight: bold; font-weight: bold;
} }
.main_payload__chat_username:hover {
background-color: #d4d4d4;
}
.main_payload__chat_mail { .main_payload__chat_mail {
flex: 89%; flex: 89%;
color: #2f444c; color: #2f444c;

View File

@ -898,6 +898,12 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
//// Main section body compilation //// Main section body compilation
QString payloadBlock; QString payloadBlock;
std::pair<QString,QString> lastGreenNickname; // nick, color
std::pair<QString,QString> lastRedNickname; // nick, color
quint64 messageAnchorCounter = 0;
NickColorist nickColorist;
bool colorEdited = false;
// Search request // Search request
if (not searchRequest.isEmpty()) { if (not searchRequest.isEmpty()) {
uint counter = 0; uint counter = 0;
@ -969,6 +975,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
QString buffer {file.readLine()}; QString buffer {file.readLine()};
while (not buffer.isEmpty()) { while (not buffer.isEmpty()) {
removeBrakelineSymbols(buffer); removeBrakelineSymbols(buffer);
messageAnchorCounter++;
bool finded = false; bool finded = false;
if (rgxIsValid) { if (rgxIsValid) {
@ -992,13 +999,34 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
message.replace("class=\"main_payload__chat\"", message.replace("class=\"main_payload__chat\"",
"class=\"main_payload__chat\" style=\"opacity: .5\""); "class=\"main_payload__chat\" style=\"opacity: .5\"");
} }
message.remove(" name=\"{{ANCHOR}}\"");
for (const auto &user: m_servers[originalServerName][originalChannelName]) { for (const auto &user: m_servers[originalServerName][originalChannelName]) {
if (QRegularExpression("^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) { if (QRegularExpression("^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) {
message.replace("class=\"main_payload__chat_username\"", if (lastGreenNickname.first == rawMessage.first) {
"class=\"main_payload__chat_username\" style=\"color: green\""); replaceTag(message, "COLOR", lastGreenNickname.second);
}else{
replaceTag(message, "COLOR", nickColorist.getGreenColor());
lastGreenNickname.first = rawMessage.first;
lastGreenNickname.second = nickColorist.getGreenColor(false);
}
break; break;
} }
} }
if (not colorEdited) {
if (lastRedNickname.first == rawMessage.first) {
replaceTag(message, "COLOR", lastRedNickname.second);
}else{
replaceTag(message, "COLOR", nickColorist.getRedColor());
lastRedNickname.first = rawMessage.first;
lastRedNickname.second = nickColorist.getRedColor(false);
}
}
QString logFolder {m_dataFolder};
logFolder.remove(QRegularExpression(".$"));
QString link {path};
link.remove(logFolder);
link.remove(QRegularExpression("\\.txt$"));
replaceTag(message, "ANCHOR", link+"#"+ANCHOR_SUFFIX+QString::number(messageAnchorCounter-1));
replaceTag(message, "USERNAME", rawMessage.first); replaceTag(message, "USERNAME", rawMessage.first);
replaceTag(message, "MESSAGE_TEXT", rawMessage.second); replaceTag(message, "MESSAGE_TEXT", rawMessage.second);
matchedPathsAndMessages[path].push_back(message); matchedPathsAndMessages[path].push_back(message);
@ -1006,6 +1034,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
buffer = file.readLine(); buffer = file.readLine();
} }
file.close(); file.close();
messageAnchorCounter = 0;
} }
} }
else if (month.isEmpty() and not year.isEmpty()){ else if (month.isEmpty() and not year.isEmpty()){
@ -1029,6 +1058,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
} }
QString buffer {file.readLine()}; QString buffer {file.readLine()};
while (not buffer.isEmpty()) { while (not buffer.isEmpty()) {
messageAnchorCounter++;
removeBrakelineSymbols(buffer); removeBrakelineSymbols(buffer);
bool finded = false; bool finded = false;
@ -1053,13 +1083,34 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
message.replace("class=\"main_payload__chat\"", message.replace("class=\"main_payload__chat\"",
"class=\"main_payload__chat\" style=\"opacity: .5\""); "class=\"main_payload__chat\" style=\"opacity: .5\"");
} }
message.remove(" name=\"{{ANCHOR}}\"");
for (const auto &user: m_servers[originalServerName][originalChannelName]) { for (const auto &user: m_servers[originalServerName][originalChannelName]) {
if (QRegularExpression("^^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) { if (QRegularExpression("^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) {
message.replace("class=\"main_payload__chat_username\"", if (lastGreenNickname.first == rawMessage.first) {
"class=\"main_payload__chat_username\" style=\"color: green\""); replaceTag(message, "COLOR", lastGreenNickname.second);
}else{
replaceTag(message, "COLOR", nickColorist.getGreenColor());
lastGreenNickname.first = rawMessage.first;
lastGreenNickname.second = nickColorist.getGreenColor(false);
}
break; break;
} }
} }
if (not colorEdited) {
if (lastRedNickname.first == rawMessage.first) {
replaceTag(message, "COLOR", lastRedNickname.second);
}else{
replaceTag(message, "COLOR", nickColorist.getRedColor());
lastRedNickname.first = rawMessage.first;
lastRedNickname.second = nickColorist.getRedColor(false);
}
}
QString logFolder {m_dataFolder};
logFolder.remove(QRegularExpression(".$"));
QString link {path};
link.remove(logFolder);
link.remove(QRegularExpression("\\.txt$"));
replaceTag(message, "ANCHOR", link+"#"+ANCHOR_SUFFIX+QString::number(messageAnchorCounter-1));
replaceTag(message, "USERNAME", rawMessage.first); replaceTag(message, "USERNAME", rawMessage.first);
replaceTag(message, "MESSAGE_TEXT", rawMessage.second); replaceTag(message, "MESSAGE_TEXT", rawMessage.second);
matchedPathsAndMessages[path].push_back(message); matchedPathsAndMessages[path].push_back(message);
@ -1067,6 +1118,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
buffer = file.readLine(); buffer = file.readLine();
} }
file.close(); file.close();
messageAnchorCounter = 0;
} }
} }
} }
@ -1108,6 +1160,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
QString buffer {file.readLine()}; QString buffer {file.readLine()};
while (not buffer.isEmpty()) { while (not buffer.isEmpty()) {
removeBrakelineSymbols(buffer); removeBrakelineSymbols(buffer);
messageAnchorCounter++;
bool finded = false; bool finded = false;
if (rgxIsValid) { if (rgxIsValid) {
@ -1131,13 +1184,34 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
message.replace("class=\"main_payload__chat\"", message.replace("class=\"main_payload__chat\"",
"class=\"main_payload__chat\" style=\"opacity: .5\""); "class=\"main_payload__chat\" style=\"opacity: .5\"");
} }
message.remove(" name=\"{{ANCHOR}}\"");
for (const auto &user: m_servers[originalServerName][originalChannelName]) { for (const auto &user: m_servers[originalServerName][originalChannelName]) {
if (QRegularExpression("^^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) { if (QRegularExpression("^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) {
message.replace("class=\"main_payload__chat_username\"", if (lastGreenNickname.first == rawMessage.first) {
"class=\"main_payload__chat_username\" style=\"color: green\""); replaceTag(message, "COLOR", lastGreenNickname.second);
}else{
replaceTag(message, "COLOR", nickColorist.getGreenColor());
lastGreenNickname.first = rawMessage.first;
lastGreenNickname.second = nickColorist.getGreenColor(false);
}
break; break;
} }
} }
if (not colorEdited) {
if (lastRedNickname.first == rawMessage.first) {
replaceTag(message, "COLOR", lastRedNickname.second);
}else{
replaceTag(message, "COLOR", nickColorist.getRedColor());
lastRedNickname.first = rawMessage.first;
lastRedNickname.second = nickColorist.getRedColor(false);
}
}
QString logFolder {m_dataFolder};
logFolder.remove(QRegularExpression(".$"));
QString link {path};
link.remove(logFolder);
link.remove(QRegularExpression("\\.txt$"));
replaceTag(message, "ANCHOR", link+"#"+ANCHOR_SUFFIX+QString::number(messageAnchorCounter-1));
replaceTag(message, "USERNAME", rawMessage.first); replaceTag(message, "USERNAME", rawMessage.first);
replaceTag(message, "MESSAGE_TEXT", rawMessage.second); replaceTag(message, "MESSAGE_TEXT", rawMessage.second);
matchedPathsAndMessages[path].push_back(message); matchedPathsAndMessages[path].push_back(message);
@ -1145,6 +1219,7 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
buffer = file.readLine(); buffer = file.readLine();
} }
file.close(); file.close();
messageAnchorCounter = 0;
} }
} }
@ -1321,11 +1396,27 @@ void HttpServer::writeRegularPage(QTcpSocket *socket, QString &urlPath, bool isH
} }
for (const auto &user: m_servers[originalServerName][originalChannelName]) { for (const auto &user: m_servers[originalServerName][originalChannelName]) {
if (QRegularExpression("^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) { if (QRegularExpression("^(.*;|~|@|\\&|\\+)?"+rawMessage.first+"$").match(user).hasMatch()) {
message.replace("class=\"main_payload__chat_username\"", if (lastGreenNickname.first == rawMessage.first) {
"class=\"main_payload__chat_username\" style=\"color: green\""); replaceTag(message, "COLOR", lastGreenNickname.second);
}else{
replaceTag(message, "COLOR", nickColorist.getGreenColor());
lastGreenNickname.first = rawMessage.first;
lastGreenNickname.second = nickColorist.getGreenColor(false);
}
break; break;
} }
} }
if (not colorEdited) {
if (lastRedNickname.first == rawMessage.first) {
replaceTag(message, "COLOR", lastRedNickname.second);
}else{
replaceTag(message, "COLOR", nickColorist.getRedColor());
lastRedNickname.first = rawMessage.first;
lastRedNickname.second = nickColorist.getRedColor(false);
}
}
message.replace("href=\"", "href=\"#");
replaceTag(message, "ANCHOR", ANCHOR_SUFFIX+QString::number(messageAnchorCounter++));
replaceTag(message, "USERNAME", rawMessage.first); replaceTag(message, "USERNAME", rawMessage.first);
replaceTag(message, "MESSAGE_TEXT", rawMessage.second); replaceTag(message, "MESSAGE_TEXT", rawMessage.second);
payloadBlock += message; payloadBlock += message;
@ -2098,3 +2189,31 @@ void MessagePool::messageToDelete(qint64 timestamp)
m_messages.erase(it); m_messages.erase(it);
} }
} }
const QString &NickColorist::getGreenColor(bool next)
{
if (not next) {
return *m_currentGreen;
}
if (m_currentGreen == &GREEN_1) {
m_currentGreen = &GREEN_2;
}else{
m_currentGreen = &GREEN_1;
}
return *m_currentGreen;
}
const QString &NickColorist::getRedColor(bool next)
{
if (not next) {
return *m_currentRed;
}
if (m_currentRed == &RED_1) {
m_currentRed = &RED_2;
}else{
m_currentRed = &RED_1;
}
return *m_currentRed;
}

View File

@ -13,6 +13,23 @@ constexpr int MAX_MESSAGE_LENGTH_WITHOUT_WBR = 30;
constexpr int MAX_NICKNAME_LENGTH_WITHOUT_WBR = 20; constexpr int MAX_NICKNAME_LENGTH_WITHOUT_WBR = 20;
constexpr int BUFFER_SIZE = 2048; constexpr int BUFFER_SIZE = 2048;
const QString HTTP_ACTUAL_ETAG {__DATE__ __TIME__}; const QString HTTP_ACTUAL_ETAG {__DATE__ __TIME__};
const QString ANCHOR_SUFFIX {"msg"};
const QString RED_1 {"#753d08"};
const QString RED_2 {"#b83e3e"};
const QString GREEN_1 {"#60940c"};
const QString GREEN_2 {"#27940c"};
class NickColorist
{
public:
const QString& getGreenColor(bool next = true);
const QString& getRedColor(bool next = true);
private:
const QString* m_currentGreen = &GREEN_1;
const QString* m_currentRed = &RED_1;
};
class Message : public QObject class Message : public QObject
{ {
@ -193,9 +210,9 @@ Content-Length: {{SIZE}}\r\n\r\n";
const QString HTML_PAYLOAD_LIST_CHAT_MESSAGE = "\ const QString HTML_PAYLOAD_LIST_CHAT_MESSAGE = "\
<div class=\"main_payload__chat\">\n\ <div class=\"main_payload__chat\">\n\
<span class=\"main_payload__chat_username\">\n\ <a name=\"{{ANCHOR}}\" href=\"{{ANCHOR}}\" class=\"main_payload__chat_username\" style=\"color: {{COLOR}}\">\n\
{{USERNAME}}\n\ {{USERNAME}}\n\
</span>\n\ </a>\n\
<span class=\"main_payload__chat_mail\">\n\ <span class=\"main_payload__chat_mail\">\n\
{{MESSAGE_TEXT}}\n\ {{MESSAGE_TEXT}}\n\
</span>\n\ </span>\n\

View File

@ -1,9 +0,0 @@
#ifndef VERSION_H
#define VERSION_H
#include <QString>
const QString IRCABOT_VERSION {"2.1.0"};
const QString COPYRIGHT_YEAR {"2021-2022"};
#endif // VERSION_H