Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 8 additions & 37 deletions slackviewer/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,32 +100,27 @@ def msg(self):
text = self._message.get("text", "")
if not text or text.strip() == "":
text = "[ MESSAGE TEXT EMPTY ]"

return self._formatter.render_text(text)


def _generate_blocks_text(self, blocks):
"""Build a message together from various message["blocks"]"""
text = ""
for block in blocks:
if block["type"] in ["rich_text", "rich_text_quote"]:
if block["type"] == "image":
text += self._format_block_type(block, block["type"])
elif block["type"] in ["rich_text", "rich_text_quote"]:
for element in block["elements"]:
text += self._format_rich_text_element(element)

elif "fields" in block:
for field in block["fields"]:
text += self._format_block_type(field, block["type"])

elif "elements" in block:
for element in block["elements"]:
text += self._format_block_type(element, block["type"])

elif "type" in block and block["type"] == "divider":
text += "---\n"

else:
logging.warning(f"Unknown block type: {block}")

return text

def _format_rich_text_element(self, element):
Expand Down Expand Up @@ -153,9 +148,12 @@ def _format_rich_text_element(self, element):
return text

elif element["type"] == "link":
text = element.get('text', element['url']).replace("_", "_")
return f"<a href='{element['url']}'>{text}</a>"
text = element.get('text', "")
if not text:
text = element['url'].replace("\\/", "/")

@hfaran hfaran Jun 1, 2026

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be worth adding the following explanation as a comment above this: Slack's block kit JSON sometimes encodes forward slashes as /(a valid JSON escape). Python'sjson module may leave these as literal backslash+slash depending on the serialiser, so this replacement normalises them before using the URL as display text.


text = text.replace("_", "&#95;")
return f"<a href='{element['url']}'>{text}</a>"

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

element['url'] will raise KeyError if the field is absent. Consider element.get('url', '') here (and in the href) for safety.


elif element["type"] == "user":
user = self._formatter.find_user(self.user_message(element['user_id']))
Expand Down Expand Up @@ -204,9 +202,6 @@ def _format_rich_text_element(self, element):
logging.warning(f"Unsupported rich text element type '{element['type']}' for {element}")
return ""




def _format_block_type(self, text_obj, b_type):
"""Format the text based on the block type"""
if b_type == "image":
Expand Down Expand Up @@ -260,30 +255,6 @@ def _format_block_type(self, text_obj, b_type):
return f"unsupported_block({b_type}: {text_obj}\n\n)"



def _generate_blocks_text(self, blocks):
"""Build a message together from various message["blocks"]"""
text = ""
for block in blocks:
if block["type"] == "image":
text += self._format_block_type(block, block["type"])
elif block["type"] in ["rich_text", "rich_text_quote"]:
for element in block["elements"]:
text += self._format_rich_text_element(element)
elif "fields" in block:
for field in block["fields"]:
text += self._format_block_type(field, block["type"])
elif "elements" in block:
for element in block["elements"]:
text += self._format_block_type(element, block["type"])
elif "type" in block and block["type"] == "divider":
text += "---\n"
else:
logging.warning(f"Unknown block type: {block}")
return text



def user_message(self, user_id):
return {"user": user_id}

Expand Down
Loading