openfree commited on
Commit
c6725b4
ยท
verified ยท
1 Parent(s): 9893c85

fix: LaTeX latex-style markers (rightarrow, times, etc) -> unicode at render time + system prompt prohibits LaTeX

Browse files
Files changed (2) hide show
  1. app.py +1 -0
  2. static/script.js +44 -0
app.py CHANGED
@@ -36,6 +36,7 @@ SYSTEM_PROMPT = """๋‹น์‹ ์€ ์ „๋‚จ๊ด‘์ฃผ ํ†ตํ•ฉํŠน๋ณ„์‹œ๋ฏผ๊ณผ ํ•จ๊ป˜ํ•˜๋Š” AI
36
  ใ€์ถœ๋ ฅ ํ˜•์‹ โ€” ์ ˆ๋Œ€ ๊ทœ์น™ใ€‘
37
  - thought / <think> / ๋ถ„์„ ๊ณผ์ • / ์ž๊ธฐ ์ ๊ฒ€ ๋ชจ๋‘ ์ถœ๋ ฅ ๊ธˆ์ง€. **์ฒซ ์ค„๋ถ€ํ„ฐ ๊ณง๋ฐ”๋กœ ์ •์ค‘ํ•œ ๋ณธ๋ฌธ**์œผ๋กœ ์‹œ์ž‘.
38
  - ํ•œ๊ตญ์–ด ๋งˆํฌ๋‹ค์šด, ๊ฐ„๊ฒฐํ•˜๊ฒŒ. ํ‘œยท๋ฆฌ์ŠคํŠธ ํ™œ์šฉ.
 
39
 
40
  ใ€๋‹ต๋ณ€ ์›์น™ใ€‘
41
  - ์ถœ์ฒ˜ ์žˆ๋Š” ์‚ฌ์‹ค๋งŒ, ์ถ”์ธก์€ '์ถ”์ •' ํ‘œ๊ธฐ.
 
36
  ใ€์ถœ๋ ฅ ํ˜•์‹ โ€” ์ ˆ๋Œ€ ๊ทœ์น™ใ€‘
37
  - thought / <think> / ๋ถ„์„ ๊ณผ์ • / ์ž๊ธฐ ์ ๊ฒ€ ๋ชจ๋‘ ์ถœ๋ ฅ ๊ธˆ์ง€. **์ฒซ ์ค„๋ถ€ํ„ฐ ๊ณง๋ฐ”๋กœ ์ •์ค‘ํ•œ ๋ณธ๋ฌธ**์œผ๋กœ ์‹œ์ž‘.
38
  - ํ•œ๊ตญ์–ด ๋งˆํฌ๋‹ค์šด, ๊ฐ„๊ฒฐํ•˜๊ฒŒ. ํ‘œยท๋ฆฌ์ŠคํŠธ ํ™œ์šฉ.
39
+ - **LaTeX ์ˆ˜์‹ ํ‘œ๊ธฐ ๊ธˆ์ง€** (`$\rightarrow$` ๊ฐ™์€ ํ‘œ๊ธฐ X). ํ™”์‚ดํ‘œยท๊ธฐํ˜ธ๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๋กœ ์ง์ ‘ ์ž‘์„ฑ: โ†’ โ† โ‡’ ร— รท ยฑ โ‰ˆ โ‰ค โ‰ฅ โ‰  โˆž % ยฐ (์˜ˆ: "๊ด‘์ฃผ โ†’ ์ „๋‚จ")
40
 
41
  ใ€๋‹ต๋ณ€ ์›์น™ใ€‘
42
  - ์ถœ์ฒ˜ ์žˆ๋Š” ์‚ฌ์‹ค๋งŒ, ์ถ”์ธก์€ '์ถ”์ •' ํ‘œ๊ธฐ.
static/script.js CHANGED
@@ -51,8 +51,52 @@ function fileSizeLabel(kb) {
51
  return kb >= 1024 ? `${(kb/1024).toFixed(1)}MB` : `${kb}KB`;
52
  }
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  function renderMarkdown(md) {
55
  if (!md) return "";
 
56
  if (window.marked && window.DOMPurify) {
57
  return DOMPurify.sanitize(marked.parse(md));
58
  }
 
51
  return kb >= 1024 ? `${(kb/1024).toFixed(1)}MB` : `${kb}KB`;
52
  }
53
 
54
+ // LaTeX ์ˆ˜์‹ โ†’ ์œ ๋‹ˆ์ฝ”๋“œ (๋ชจ๋ธ์ด $\rightarrow$ ๊ฐ™์€ ํ‘œ๊ธฐ ์ถœ๋ ฅ ์‹œ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ)
55
+ const LATEX_MAP = {
56
+ "rightarrow": "โ†’", "to": "โ†’", "Rightarrow": "โ‡’", "longrightarrow": "โ†’",
57
+ "leftarrow": "โ†", "Leftarrow": "โ‡", "leftrightarrow": "โ†”", "Leftrightarrow": "โ‡”",
58
+ "uparrow": "โ†‘", "downarrow": "โ†“",
59
+ "times": "ร—", "div": "รท", "pm": "ยฑ", "mp": "โˆ“",
60
+ "cdot": "ยท", "bullet": "โ€ข", "circ": "โˆ˜", "ast": "โˆ—",
61
+ "approx": "โ‰ˆ", "sim": "โˆผ", "simeq": "โ‰ƒ", "cong": "โ‰…", "equiv": "โ‰ก",
62
+ "le": "โ‰ค", "leq": "โ‰ค", "ge": "โ‰ฅ", "geq": "โ‰ฅ", "neq": "โ‰ ", "ne": "โ‰ ",
63
+ "ll": "โ‰ช", "gg": "โ‰ซ", "subset": "โŠ‚", "supset": "โŠƒ", "subseteq": "โІ", "supseteq": "โЇ",
64
+ "in": "โˆˆ", "notin": "โˆ‰", "cap": "โˆฉ", "cup": "โˆช", "emptyset": "โˆ…",
65
+ "infty": "โˆž", "partial": "โˆ‚", "nabla": "โˆ‡", "forall": "โˆ€", "exists": "โˆƒ",
66
+ "sum": "โˆ‘", "prod": "โˆ", "int": "โˆซ", "sqrt": "โˆš",
67
+ "alpha": "ฮฑ", "beta": "ฮฒ", "gamma": "ฮณ", "delta": "ฮด", "epsilon": "ฮต", "varepsilon": "ฮต",
68
+ "zeta": "ฮถ", "eta": "ฮท", "theta": "ฮธ", "vartheta": "ฯ‘", "iota": "ฮน", "kappa": "ฮบ",
69
+ "lambda": "ฮป", "mu": "ฮผ", "nu": "ฮฝ", "xi": "ฮพ", "pi": "ฯ€", "varpi": "ฯ–",
70
+ "rho": "ฯ", "varrho": "ฯฑ", "sigma": "ฯƒ", "varsigma": "ฯ‚", "tau": "ฯ„",
71
+ "upsilon": "ฯ…", "phi": "ฯ†", "varphi": "ฯ•", "chi": "ฯ‡", "psi": "ฯˆ", "omega": "ฯ‰",
72
+ "Gamma": "ฮ“", "Delta": "ฮ”", "Theta": "ฮ˜", "Lambda": "ฮ›", "Xi": "ฮž", "Pi": "ฮ ",
73
+ "Sigma": "ฮฃ", "Upsilon": "ฮฅ", "Phi": "ฮฆ", "Psi": "ฮจ", "Omega": "ฮฉ",
74
+ "degree": "ยฐ", "prime": "โ€ฒ", "dprime": "โ€ณ",
75
+ "ldots": "โ€ฆ", "cdots": "โ‹ฏ", "vdots": "โ‹ฎ", "ddots": "โ‹ฑ",
76
+ "%": "%", "&": "&", "_": "_", "#": "#",
77
+ };
78
+
79
+ function deLatex(text) {
80
+ if (!text || typeof text !== "string") return text;
81
+ // $\command$ โ†’ unicode (๋Œ€๋ถ€๋ถ„์˜ ์ผ€์ด์Šค)
82
+ text = text.replace(/\$\\([a-zA-Z]+)\$/g, (m, cmd) => LATEX_MAP[cmd] || m);
83
+ // \(...\) inline math, \[...\] display math ๋‚ด๋ถ€์—์„œ๋„ ๋‹จ์ผ ๋ช…๋ น์–ด ๋ณ€ํ™˜
84
+ text = text.replace(/\\\(\s*\\([a-zA-Z]+)\s*\\\)/g, (m, cmd) => LATEX_MAP[cmd] || m);
85
+ text = text.replace(/\\\[\s*\\([a-zA-Z]+)\s*\\\]/g, (m, cmd) => LATEX_MAP[cmd] || m);
86
+ // bare \command (math env ๋ฐ–) โ€” ํ•œ๊ตญ์–ด ๋ณธ๋ฌธ์—์„œ ๋นˆ๋ฒˆ
87
+ text = text.replace(/\\([a-zA-Z]+)(?![a-zA-Z])/g, (m, cmd) => LATEX_MAP[cmd] || m);
88
+ // ๋‹จ์ˆœ $math$ โ€” math ๋‚ด๋ถ€์˜ \rightarrow ๋“ฑ ์ฒ˜๋ฆฌ (์œ„์—์„œ ์ฒ˜๋ฆฌ ๋ชป ํ•œ ์ผ€์ด์Šค)
89
+ text = text.replace(/\$([^$\n]{1,30})\$/g, (m, inner) => {
90
+ const replaced = inner.replace(/\\([a-zA-Z]+)/g, (mm, cmd) => LATEX_MAP[cmd] || mm);
91
+ // ๋ณ€ํ™˜๋๊ณ  LaTeX ํ”์  ์—†์œผ๋ฉด $ ์ œ๊ฑฐ
92
+ return /[\\{}]/.test(replaced) ? m : replaced;
93
+ });
94
+ return text;
95
+ }
96
+
97
  function renderMarkdown(md) {
98
  if (!md) return "";
99
+ md = deLatex(md); // โญ LaTeX โ†’ unicode ๋ณ€ํ™˜
100
  if (window.marked && window.DOMPurify) {
101
  return DOMPurify.sanitize(marked.parse(md));
102
  }