Spaces:
Sleeping
Sleeping
Update css.py
Browse files
css.py
CHANGED
|
@@ -4,40 +4,58 @@ import re
|
|
| 4 |
import uuid
|
| 5 |
import pandas as pd
|
| 6 |
import time
|
|
|
|
| 7 |
|
| 8 |
# ββββββββββββββββββ λ§νμ μμ± ν¨μ
|
| 9 |
# μμ μ μ
|
| 10 |
PRIMARY_USER = "#e2f6e8"
|
| 11 |
PRIMARY_BOT = "#f6f6f6"
|
| 12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
def render_message(
|
| 14 |
message: str,
|
| 15 |
sender: str = "bot",
|
| 16 |
chips: list[str] | None = None,
|
| 17 |
key: str | None = None,
|
| 18 |
*,
|
| 19 |
-
animated: bool = False, #
|
| 20 |
-
speed_cps: int = 40, #
|
| 21 |
-
by_word: bool = False, #
|
| 22 |
) -> str | None:
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
color =
|
| 30 |
align = "right" if sender == "user" else "left"
|
|
|
|
|
|
|
|
|
|
| 31 |
message = str(message).rstrip()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
|
| 33 |
# κ³΅ν΅ νμ λνΌ
|
| 34 |
def _wrap(html_inner: str) -> str:
|
| 35 |
return (
|
| 36 |
f'''<div style="text-align:{align}; margin:6px 0;">'''
|
| 37 |
-
f'''<
|
| 38 |
-
f'''
|
| 39 |
-
f'''
|
| 40 |
-
f'''word-break:break-word;">{html_inner}</span></div>'''
|
| 41 |
)
|
| 42 |
|
| 43 |
if not animated:
|
|
@@ -45,24 +63,21 @@ def render_message(
|
|
| 45 |
else:
|
| 46 |
ph = st.empty()
|
| 47 |
buf = ""
|
| 48 |
-
|
| 49 |
-
# νκ·Έλ μ¦μ μΆκ°, ν
μ€νΈλ§ μ μ§ μΆλ ₯(νκ·Έ λ°μ―€ μλ € 보μ΄λ νμ μ΅μν)
|
| 50 |
segments = re.split(r'(<[^>]+>)', message)
|
| 51 |
delay = max(0.005, 1.0 / max(1, speed_cps))
|
| 52 |
-
|
| 53 |
for seg in segments:
|
| 54 |
if not seg:
|
| 55 |
continue
|
| 56 |
if seg.startswith("<") and seg.endswith(">"):
|
| 57 |
-
# νκ·Έλ ꡬ쑰 μ μ§ μν΄ ν λ²μ μΆκ°
|
| 58 |
buf += seg
|
| 59 |
ph.markdown(_wrap(buf), unsafe_allow_html=True)
|
| 60 |
else:
|
| 61 |
-
if by_word:
|
| 62 |
for w in seg.split(" "):
|
| 63 |
buf = (buf + " " + w).strip()
|
| 64 |
ph.markdown(_wrap(buf), unsafe_allow_html=True)
|
| 65 |
-
time.sleep(delay * 5)
|
| 66 |
else:
|
| 67 |
for ch in seg:
|
| 68 |
buf += ch
|
|
|
|
| 4 |
import uuid
|
| 5 |
import pandas as pd
|
| 6 |
import time
|
| 7 |
+
from datetime import datetime # νμμ€ν¬νμ©
|
| 8 |
|
| 9 |
# ββββββββββββββββββ λ§νμ μμ± ν¨μ
|
| 10 |
# μμ μ μ
|
| 11 |
PRIMARY_USER = "#e2f6e8"
|
| 12 |
PRIMARY_BOT = "#f6f6f6"
|
| 13 |
|
| 14 |
+
# β’ λ§νμ ν
λ§ νλ νΈ & ν¬νΌ
|
| 15 |
+
THEMES = {
|
| 16 |
+
"λ―ΌνΈ": {"user": "#DCFCE7", "bot": "#E0F2FE"},
|
| 17 |
+
"λΌλ²€λ": {"user": "#EDE9FE", "bot": "#E9D5FF"},
|
| 18 |
+
"λͺ¨λ
Έ": {"user": "#EFEFEF", "bot": "#F5F5F5"},
|
| 19 |
+
}
|
| 20 |
+
def _get_colors():
|
| 21 |
+
theme = st.session_state.get("bubble_theme", "λ―ΌνΈ")
|
| 22 |
+
return THEMES.get(theme, THEMES["λ―ΌνΈ"])
|
| 23 |
+
|
| 24 |
def render_message(
|
| 25 |
message: str,
|
| 26 |
sender: str = "bot",
|
| 27 |
chips: list[str] | None = None,
|
| 28 |
key: str | None = None,
|
| 29 |
*,
|
| 30 |
+
animated: bool = False, # νμ ν¨κ³Ό ON/OFF
|
| 31 |
+
speed_cps: int = 40, # μ΄λΉ κΈμ μ
|
| 32 |
+
by_word: bool = False, # λ¨μ΄ λ¨μ μΆλ ₯
|
| 33 |
) -> str | None:
|
| 34 |
+
import re, time
|
| 35 |
+
# β’ ν
λ§/μ½€ν©νΈ κ° μ½κΈ°
|
| 36 |
+
palette = _get_colors()
|
| 37 |
+
dense = st.session_state.get("dense_mode", False)
|
| 38 |
+
show_time = st.session_state.get("show_time", False) and sender == "bot" # β£ λ΄λ§ μκ° νμ
|
| 39 |
+
|
| 40 |
+
color = palette["user"] if sender == "user" else palette["bot"]
|
| 41 |
align = "right" if sender == "user" else "left"
|
| 42 |
+
pad = "6px 10px" if dense else "10px 14px" # β’ μ½€ν©νΈ λͺ¨λ ν¨λ©
|
| 43 |
+
fsz = "12px" if dense else "13px" # β’ μ½€ν©νΈ λͺ¨λ ν°νΈ
|
| 44 |
+
|
| 45 |
message = str(message).rstrip()
|
| 46 |
+
# β£ νμμ€ν¬ν HTML
|
| 47 |
+
ts_html = (
|
| 48 |
+
f'<div style="font-size:11px;color:#888;margin-top:4px;">{datetime.now().strftime("%H:%M")}</div>'
|
| 49 |
+
if show_time else ""
|
| 50 |
+
)
|
| 51 |
|
| 52 |
# κ³΅ν΅ νμ λνΌ
|
| 53 |
def _wrap(html_inner: str) -> str:
|
| 54 |
return (
|
| 55 |
f'''<div style="text-align:{align}; margin:6px 0;">'''
|
| 56 |
+
f'''<span style="background:{color}; padding:{pad}; border-radius:12px;'''
|
| 57 |
+
f'''display:inline-block; max-width:80%; font-size:{fsz}; line-height:1.45;'''
|
| 58 |
+
f'''word-break:break-word;">{html_inner}{ts_html}</span></div>'''
|
|
|
|
| 59 |
)
|
| 60 |
|
| 61 |
if not animated:
|
|
|
|
| 63 |
else:
|
| 64 |
ph = st.empty()
|
| 65 |
buf = ""
|
| 66 |
+
# νκ·Έλ μ¦μ, ν
μ€νΈλ§ μ μ§ μΆλ ₯(νκ·Έ κΉ¨μ§ λ°©μ§)
|
|
|
|
| 67 |
segments = re.split(r'(<[^>]+>)', message)
|
| 68 |
delay = max(0.005, 1.0 / max(1, speed_cps))
|
|
|
|
| 69 |
for seg in segments:
|
| 70 |
if not seg:
|
| 71 |
continue
|
| 72 |
if seg.startswith("<") and seg.endswith(">"):
|
|
|
|
| 73 |
buf += seg
|
| 74 |
ph.markdown(_wrap(buf), unsafe_allow_html=True)
|
| 75 |
else:
|
| 76 |
+
if by_word or st.session_state.get("type_by_word", False):
|
| 77 |
for w in seg.split(" "):
|
| 78 |
buf = (buf + " " + w).strip()
|
| 79 |
ph.markdown(_wrap(buf), unsafe_allow_html=True)
|
| 80 |
+
time.sleep(delay * 5)
|
| 81 |
else:
|
| 82 |
for ch in seg:
|
| 83 |
buf += ch
|