From ef7bea7f9c22a916fbe7aa4eb9cfc6483b8952ef Mon Sep 17 00:00:00 2001
From: STDquantum <405720329@qq.com>
Date: Sun, 17 Dec 2023 18:33:06 +0800
Subject: [PATCH] =?UTF-8?q?html=E7=BE=A4=E8=81=8A=E5=AF=BC=E5=87=BA?=
=?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=B4=E5=83=8F=E5=92=8C=E6=98=B5=E7=A7=B0?=
=?UTF-8?q?=EF=BC=9B=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=80=E4=BA=9B=E5=85=B6?=
=?UTF-8?q?=E4=BB=96=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/DataBase/msg.py | 15 ++
app/DataBase/output_pc.py | 349 ++++++++++++++++++++++++++----------
app/DataBase/package_msg.py | 64 ++++++-
app/util/emoji.py | 91 +++++++++-
main.py | 1 +
5 files changed, 424 insertions(+), 96 deletions(-)
diff --git a/app/DataBase/msg.py b/app/DataBase/msg.py
index 037c5eb..b0ff151 100644
--- a/app/DataBase/msg.py
+++ b/app/DataBase/msg.py
@@ -57,6 +57,21 @@ class Msg:
lock.release()
def get_messages(self, username_):
+ '''
+ return list
+ a[0]: localId,
+ a[1]: talkerId, (和strtalker对应的,不是群聊信息发送人)
+ a[2]: type,
+ a[3]: subType,
+ a[4]: is_sender,
+ a[5]: timestamp,
+ a[6]: status, (没啥用)
+ a[7]: str_content,
+ a[8]: str_time, (格式化的时间)
+ a[9]: msgSvrId,
+ a[10]: BytesExtra,
+ a[11]: CompressContent,
+ '''
if not self.open_flag:
return None
sql = '''
diff --git a/app/DataBase/output_pc.py b/app/DataBase/output_pc.py
index 60569c7..329d5ab 100644
--- a/app/DataBase/output_pc.py
+++ b/app/DataBase/output_pc.py
@@ -27,6 +27,7 @@ def makedirs(path):
os.makedirs(os.path.join(path, 'video'), exist_ok=True)
os.makedirs(os.path.join(path, 'voice'), exist_ok=True)
os.makedirs(os.path.join(path, 'file'), exist_ok=True)
+ os.makedirs(os.path.join(path, 'avatar'), exist_ok=True)
def escape_js_and_html(input_str):
@@ -181,20 +182,32 @@ class ChildThread(QThread):
str_content = message[7]
str_time = message[8]
is_send = message[4]
- avatar = 'myhead.png' if is_send else 'tahead.png'
timestamp = message[5]
+ is_chatroom = 1 if self.contact.is_chatroom else 0
+ if is_chatroom:
+ avatar = f"./avatar/{message[12].wxid}.png"
+ else:
+ avatar = "./avatar/" + ('myhead.png' if is_send else 'tahead.png')
+ if is_chatroom:
+ if is_send:
+ displayname = MePC().name
+ else:
+ displayname = message[12].remark
+ else:
+ displayname = MePC().name if is_send else self.contact.remark
+ displayname = escape_js_and_html(displayname)
if self.output_type == Output.HTML:
str_content = escape_js_and_html(str_content)
if self.is_5_min(timestamp):
doc.write(
- f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:''}},'''
+ f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:'',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
)
emojiText = findall(r"(\[.+?\])", str_content)
for emoji_text in emojiText:
if emoji_text in emoji:
str_content = str_content.replace(emoji_text, emoji[emoji_text])
doc.write(
- f'''{{ type:{1}, text: '{str_content}',is_send:{is_send},avatar_path:'{avatar}'}},'''
+ f'''{{ type:{1}, text: '{str_content}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
)
elif self.output_type == Output.TXT:
name = '你' if is_send else self.contact.remark
@@ -208,9 +221,21 @@ class ChildThread(QThread):
str_content = message[7]
str_time = message[8]
is_send = message[4]
- avatar = 'myhead.png' if is_send else 'tahead.png'
- timestamp = message[5]
BytesExtra = message[10]
+ timestamp = message[5]
+ is_chatroom = 1 if self.contact.is_chatroom else 0
+ if is_chatroom:
+ avatar = f"./avatar/{message[12].wxid}.png"
+ else:
+ avatar = "./avatar/" + ('myhead.png' if is_send else 'tahead.png')
+ if is_chatroom:
+ if is_send:
+ displayname = MePC().name
+ else:
+ displayname = message[12].remark
+ else:
+ displayname = MePC().name if is_send else self.contact.remark
+ displayname = escape_js_and_html(displayname)
if self.output_type == Output.HTML:
str_content = escape_js_and_html(str_content)
image_path = hard_link_db.get_image(str_content, BytesExtra, thumb=False)
@@ -231,10 +256,10 @@ class ChildThread(QThread):
# print(f"tohtml:---{image_path}")
if self.is_5_min(timestamp):
doc.write(
- f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:''}},'''
+ f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:'',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
)
doc.write(
- f'''{{ type:{type_}, text: '{image_path}',is_send:{is_send},avatar_path:'{avatar}'}},'''
+ f'''{{ type:{type_}, text: '{image_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
)
elif self.output_type == Output.TXT:
name = '你' if is_send else self.contact.remark
@@ -247,15 +272,26 @@ class ChildThread(QThread):
str_content = message[7]
str_time = message[8]
is_send = message[4]
- avatar = 'myhead.png' if is_send else 'tahead.png'
- creatorName = MePC().name if is_send else self.contact.remark
- timestamp = message[5]
msgSvrId = message[9]
+ timestamp = message[5]
+ is_chatroom = 1 if self.contact.is_chatroom else 0
+ if is_chatroom:
+ avatar = f"./avatar/{message[12].wxid}.png"
+ else:
+ avatar = "./avatar/" + ('myhead.png' if is_send else 'tahead.png')
+ if is_chatroom:
+ if is_send:
+ displayname = MePC().name
+ else:
+ displayname = message[12].remark
+ else:
+ displayname = MePC().name if is_send else self.contact.remark
+ displayname = escape_js_and_html(displayname)
if self.output_type == Output.HTML:
try:
audio_path = media_msg_db.get_audio(msgSvrId, output_path=origin_docx_path + "/voice")
audio_path = audio_path.replace('/', '\\')
- modify_audio_metadata(audio_path, creatorName)
+ modify_audio_metadata(audio_path, displayname)
os.utime(audio_path, (timestamp, timestamp))
audio_path = audio_path.replace('\\', '/')
voice_to_text = escape_js_and_html(media_msg_db.get_audio_text(str_content))
@@ -263,10 +299,10 @@ class ChildThread(QThread):
return
if self.is_5_min(timestamp):
doc.write(
- f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:''}},'''
+ f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:'',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
)
doc.write(
- f'''{{ type:34, text:'{audio_path}',is_send:{is_send},avatar_path:'{avatar}',voice_to_text:'{voice_to_text}'}},'''
+ f'''{{ type:34, text:'{audio_path}',is_send:{is_send},avatar_path:'{avatar}',voice_to_text:'{voice_to_text}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
)
if self.output_type == Output.TXT:
name = '你' if is_send else self.contact.remark
@@ -279,17 +315,33 @@ class ChildThread(QThread):
str_content = message[7]
str_time = message[8]
is_send = message[4]
- avatar = 'myhead.png' if is_send else 'tahead.png'
timestamp = message[5]
+ is_chatroom = 1 if self.contact.is_chatroom else 0
+ if is_chatroom:
+ avatar = f"./avatar/{message[12].wxid}.png"
+ else:
+ avatar = "./avatar/" + ('myhead.png' if is_send else 'tahead.png')
+ if is_chatroom:
+ if is_send:
+ displayname = MePC().name
+ else:
+ displayname = message[12].remark
+ else:
+ displayname = MePC().name if is_send else self.contact.remark
+ displayname = escape_js_and_html(displayname)
if self.output_type == Output.HTML:
emoji_path = get_emoji(str_content, thumb=True, output_path=origin_docx_path + '/emoji')
- emoji_path = './emoji/' + os.path.basename(emoji_path)
+ if emoji_path == "":
+ shutil.copy(f"{os.path.abspath('.')}/app/resources/icons/404.png", origin_docx_path + '/emoji/404.png')
+ emoji_path = "./emoji/404.png"
+ else:
+ emoji_path = './emoji/' + os.path.basename(emoji_path)
if self.is_5_min(timestamp):
doc.write(
- f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:''}},'''
+ f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:'',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
)
doc.write(
- f'''{{ type:{3}, text: '{emoji_path}',is_send:{is_send},avatar_path:'{avatar}'}},'''
+ f'''{{ type:{3}, text: '{emoji_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
)
elif self.output_type == Output.TXT:
name = '你' if is_send else self.contact.remark
@@ -317,6 +369,20 @@ class ChildThread(QThread):
avatar = 'myhead.png' if is_send else 'tahead.png'
content = parser_reply(message[11])
refer_msg = content.get('refer')
+ timestamp = message[5]
+ is_chatroom = 1 if self.contact.is_chatroom else 0
+ if is_chatroom:
+ avatar = f"./avatar/{message[12].wxid}.png"
+ else:
+ avatar = "./avatar/" + ('myhead.png' if is_send else 'tahead.png')
+ if is_chatroom:
+ if is_send:
+ displayname = MePC().name
+ else:
+ displayname = message[12].remark
+ else:
+ displayname = MePC().name if is_send else self.contact.remark
+ displayname = escape_js_and_html(displayname)
if self.output_type == Output.HTML:
contentText = content.get('title')
emojiText = findall(r"(\[.+?\])", contentText)
@@ -330,11 +396,11 @@ class ChildThread(QThread):
if emoji_text in emoji:
referText = referText.replace(emoji_text, emoji[emoji_text])
doc.write(
- f'''{{ type:49, text: '{contentText}',is_send:{is_send},sub_type:{content.get('type')},refer_text: '{referText}',avatar_path:'{avatar}'}},'''
+ f'''{{ type:49, text: '{contentText}',is_send:{is_send},sub_type:{content.get('type')},refer_text: '{referText}',avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
)
else:
doc.write(
- f'''{{ type:49, text: '{contentText}',is_send:{is_send},sub_type:{content.get('type')},avatar_path:'{avatar}'}},'''
+ f'''{{ type:49, text: '{contentText}',is_send:{is_send},sub_type:{content.get('type')},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
)
elif self.output_type == Output.TXT:
name = '你' if is_send else self.contact.remark
@@ -351,10 +417,12 @@ class ChildThread(QThread):
str_content = message[7]
is_send = message[4]
str_time = message[8]
+ timestamp = message[5]
+ is_chatroom = 1 if self.contact.is_chatroom else 0
str_content = escape_js_and_html(str_content.lstrip('
',
'[亲亲]': '
',
'[可怜]': '
',
+ '[Whimper]': '
',
'[笑脸]': '
',
'[生病]': '
',
'[脸红]': '
',
@@ -691,7 +787,8 @@ body{
word-wrap:break-word;
word-break:normal;
}
-.chat-refer{
+.chat-refer {
+ margin-top: 5px;
max-width: 400px;
padding: 6px;
border-radius: 5px;
@@ -701,11 +798,11 @@ body{
word-wrap:break-word;
word-break:normal;
}
-.chat-refer-right{
- margin-right:55px;
+.chat-refer-right {
+ margin-right: 55px;
}
.chat-refer-left{
- margin-left:55px;
+ margin-left: 15px;
}
.item-left .bubble{
margin-left: 15px;
@@ -737,8 +834,8 @@ body{
border-bottom: 10px solid transparent;
right: -20px;
}
-.item{
- white-space: pre-line;
+.item {
+ white-space: pre-wrap;
margin-top: 15px;
display: flex;
width: 100%;
@@ -765,6 +862,20 @@ body{
user-select:none;
}
+.content-wrapper {
+ display: flex;
+ flex-direction: column;
+ align-items: baseline;
+}
+
+.displayname {
+ margin-left: 13px;
+ margin-left: 13px;
+ font-size: 13px;
+ margin-bottom: 5px;
+ color: darkgray;
+}
+
.chat-image img{
margin-right: 18px;
margin-left: 18px;
@@ -960,84 +1071,142 @@ html_end = '''
const startIndex = (page - 1) * itemsPerPage;
const endIndex = startIndex + itemsPerPage;
console.log(page);
+
+ // 生成各类标签的函数
+ function messageBubble(message, side) {
+ const messageBubbleTag = document.createElement('div');
+ messageBubbleTag.className = `bubble bubble-${side}`;
+ messageBubbleTag.innerHTML = message.text;
+ return messageBubbleTag;
+ }
+ function displayNameBox(message) {
+ const displayName = document.createElement('div');
+ displayName.className = "displayname";
+ displayName.innerHTML = message.displayname;
+ return displayName;
+ }
+ function avatarBox(message) {
+ const avatarTag = document.createElement('div');
+ avatarTag.className = "avatar";
+ avatarTag.innerHTML = `