Skip to content

Commit

Permalink
Merge pull request #25 from nalbam/main
Browse files Browse the repository at this point in the history
chore: Refactor split_message function to improve code readability and maintainability
  • Loading branch information
nalbam authored Sep 5, 2024
2 parents 1062ace + 5313245 commit ee00bbc
Show file tree
Hide file tree
Showing 2 changed files with 204 additions and 30 deletions.
124 changes: 124 additions & 0 deletions bin/split.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
def split_message(message, max_len):
split_parts = []

# 먼저 ``` 기준으로 분리
parts = message.split("```")

for i, part in enumerate(parts):
if i % 2 == 1: # 코드 블록인 경우
# 코드 블록도 "\n\n" 기준으로 자름
split_parts.extend(split_code_block(part, max_len))
else: # 일반 텍스트 부분
split_parts.extend(split_by_newline(part, max_len))

# 전체 블록을 합친 후 max_len을 넘지 않도록 추가로 자름
return finalize_split(split_parts, max_len)


def split_code_block(code, max_len):
# 코드 블록을 "\n\n" 기준으로 분리 후, 다시 ```로 감쌈
code_parts = code.split("\n\n")
result = []
current_part = "```\n"

for part in code_parts:
if len(current_part) + len(part) + 2 < max_len - 6: # 6은 ``` 앞뒤 길이
if current_part != "```\n":
current_part += "\n\n" + part
else:
current_part += part
else:
result.append(current_part + "\n```") # ```로 감쌈
current_part = "```\n" + part

if current_part != "```\n":
result.append(current_part + "\n```")

return result


def split_by_newline(text, max_len):
# "\n\n" 기준으로 분리
parts = text.split("\n\n")
result = []
current_part = ""

for part in parts:
if len(current_part) + len(part) + 2 < max_len: # 2는 "\n\n"의 길이
if current_part != "":
current_part += "\n\n" + part
else:
current_part = part
else:
result.append(current_part)
current_part = part
if current_part != "":
result.append(current_part)

return result


def finalize_split(parts, max_len):
# 각 파트를 max_len에 맞춰 추가로 자름
result = []
current_message = ""

for part in parts:
if len(current_message) + len(part) < max_len:
current_message += "\n\n" + part
else:
result.append(current_message)
current_message = part
if current_message != "":
result.append(current_message)

return result


# 테스트
message = """
JSON 데이터를 정렬하는 방법은 사용하는 프로그래밍 언어나 도구에 따라 다를 수 있습니다. 여기서는 Python을 사용한 예시를 보여드리겠습니다. Python의 json 모듈을 사용하면 쉽게 JSON 데이터를 정렬할 수 있습니다.
```python
import json
# 정렬되지 않은 JSON 데이터
data = {
"name": "Alice",
"age": 30,
"city": "New York",
"hobbies": ["reading", "hiking", "coding"]
}
# JSON 데이터를 정렬하여 문자열로 변환
sorted_json_str = json.dumps(data, indent=4, sort_keys=True)
# 정렬되지 않은 JSON 데이터
data = {
"name": "Alice",
"age": 30,
"city": "New York",
"hobbies": ["reading", "hiking", "coding"]
}
# JSON 데이터를 정렬하여 문자열로 변환
sorted_json_str = json.dumps(data, indent=4, sort_keys=True)
```
```python
# 정렬된 JSON 출력
print(sorted_json_str)
```
이와 같은 방법으로 JSON 데이터를 정렬할 수 있습니다. 다른 프로그래밍 언어에서도 유사한 방법으로 JSON 데이터를 정렬할 수 있으니, 사용하는 언어의 JSON 라이브러리를 참고하세요.
"""

MAX_LEN_SLACK = 400 # 슬랙 최대 메시지 길이 설정

split_messages = split_message(message, MAX_LEN_SLACK)

# 나누어진 메시지 출력
for i, part in enumerate(split_messages, 1):
print(f"Part {i}:")
print(part)
print("-" * 40)
110 changes: 80 additions & 30 deletions handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,47 +124,97 @@ def replace_text(text):
return text


# Update the message in Slack
def chat_update(say, channel, thread_ts, latest_ts, message="", continue_thread=False):
# print("chat_update: {}".format(message))
def split_message(message, max_len):
split_parts = []

# 먼저 ``` 기준으로 분리
parts = message.split("```")

for i, part in enumerate(parts):
if i % 2 == 1: # 코드 블록인 경우
# 코드 블록도 "\n\n" 기준으로 자름
split_parts.extend(split_code_block(part, max_len))
else: # 일반 텍스트 부분
split_parts.extend(split_by_newline(part, max_len))

# 전체 블록을 합친 후 max_len을 넘지 않도록 추가로 자름
return finalize_split(split_parts, max_len)


def split_code_block(code, max_len):
# 코드 블록을 "\n\n" 기준으로 분리 후, 다시 ```로 감쌈
code_parts = code.split("\n\n")
result = []
current_part = "```\n"

for part in code_parts:
if len(current_part) + len(part) + 2 < max_len - 6: # 6은 ``` 앞뒤 길이
if current_part != "```\n":
current_part += "\n\n" + part
else:
current_part += part
else:
result.append(current_part + "\n```") # ```로 감쌈
current_part = "```\n" + part

if sys.getsizeof(message) > MAX_LEN_SLACK:
split_key = "\n\n"
if "```" in message:
split_key = "```"
if current_part != "```\n":
result.append(current_part + "\n```")

parts = message.split(split_key)
return result

last_one = parts.pop()

if len(parts) % 2 == 0:
text = split_key.join(parts) + split_key
message = last_one
def split_by_newline(text, max_len):
# "\n\n" 기준으로 분리
parts = text.split("\n\n")
result = []
current_part = ""

for part in parts:
if len(current_part) + len(part) + 2 < max_len: # 2는 "\n\n"의 길이
if current_part != "":
current_part += "\n\n" + part
else:
current_part = part
else:
text = split_key.join(parts)
message = split_key + last_one
result.append(current_part)
current_part = part
if current_part != "":
result.append(current_part)

text = replace_text(text)
return result

# Update the message
app.client.chat_update(channel=channel, ts=latest_ts, text=text)

if continue_thread:
text = replace_text(message) + " " + BOT_CURSOR
else:
text = replace_text(message)
def finalize_split(parts, max_len):
# 각 파트를 max_len에 맞춰 추가로 자름
result = []
current_message = ""

# New message
result = say(text=text, thread_ts=thread_ts)
latest_ts = result["ts"]
else:
if continue_thread:
text = replace_text(message) + " " + BOT_CURSOR
for part in parts:
if len(current_message) + len(part) < max_len:
current_message += "\n\n" + part
else:
text = replace_text(message)
result.append(current_message)
current_message = part
if current_message != "":
result.append(current_message)

return result

# Update the message
app.client.chat_update(channel=channel, ts=latest_ts, text=text)

# Update the message in Slack
def chat_update(say, channel, thread_ts, latest_ts, message="", continue_thread=False):
# print("chat_update: {}".format(message))

split_messages = split_message(message, MAX_LEN_SLACK)

for i, text in enumerate(split_messages):
if i == 0:
# Update the message
app.client.chat_update(channel=channel, ts=latest_ts, text=text)
else:
# New message
result = say(text=text, thread_ts=thread_ts)
latest_ts = result["ts"]

return message, latest_ts

Expand Down

0 comments on commit ee00bbc

Please sign in to comment.