Spaces:
Running
Running
| import gradio as gr | |
| from difflib import Differ | |
| def diff_texts(text1, text2): | |
| d = Differ() | |
| # 使用 splitlines(keepends=True) 可以保留换行符,使 diff 更自然 | |
| # 但 HighlightedText 通常基于 token/word,这里我们按单词分割来做细粒度对比 | |
| # 如果需要按行对比,可以调整逻辑 | |
| # 这里演示按单词/字符流的对比,效果类似 Code Diff | |
| return [ | |
| (token[2:], token[0] if token[0] != " " else None) | |
| for token in d.compare(text1.splitlines(keepends=True), text2.splitlines(keepends=True)) | |
| ] | |
| def diff_texts_word_level(text1, text2): | |
| d = Differ() | |
| # 按单词分割,更适合文章类文本 | |
| diff = d.compare(text1.split(), text2.split()) | |
| result = [] | |
| for token in diff: | |
| code = token[0] | |
| word = token[2:] + " " # 补回空格 | |
| if code == " ": | |
| result.append((word, None)) | |
| elif code == "-": | |
| result.append((word, "-")) # 删除 | |
| elif code == "+": | |
| result.append((word, "+")) # 新增 | |
| return result | |
| def create_ui(): | |
| with gr.Row(): | |
| with gr.Column(): | |
| t1 = gr.Textbox(label="原始文本 (Original)", lines=15, placeholder="输入旧版本文本...") | |
| with gr.Column(): | |
| t2 = gr.Textbox(label="新文本 (New)", lines=15, placeholder="输入新版本文本...") | |
| with gr.Row(): | |
| btn = gr.Button("🔍 对比差异", variant="primary") | |
| # HighlightedText 组件非常适合展示 Diff | |
| # color_map 定义了不同标记的颜色:+ 为绿色(新增),- 为红色(删除) | |
| diff_output = gr.HighlightedText( | |
| label="差异视图 (Diff View)", | |
| combine_adjacent=True, | |
| show_legend=True, | |
| color_map={"+": "green", "-": "red"} | |
| ) | |
| # 这里使用 word level diff,视觉效果更好 | |
| btn.click(diff_texts_word_level, inputs=[t1, t2], outputs=[diff_output]) | |