File size: 1,973 Bytes
f799edd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import gradio as gr
from datasets import load_dataset
from rapidfuzz import process, fuzz

# 1) 데이터셋 스트리밍 로드(메타만 메모리에 보관)
ds = load_dataset("nyuuzyou/clker-svg", split="train", streaming=True)

records = []
for ex in ds:
    records.append(
        {
            "id": ex["id"],
            "title": ex["title"] or "",
            "tags": " ".join(ex["tags"] or []),
            "svg": ex["svg_content"],
            "url": ex["download_url"],
        }
    )

# 2) 검색 함수
def search_svg(query, top_k):
    if not query:
        return "⚠️ 검색어를 입력하세요.", None

    # title+tags 스트링 하나로 결합
    choices = {i: r["title"] + " " + r["tags"] for i, r in enumerate(records)}
    matched = process.extract(
        query,
        choices,
        scorer=fuzz.WRatio,
        limit=top_k,
    )

    # Rapidfuzz 결과 → SVG HTML 변환
    html_snippets = []
    for idx, score, _ in matched:
        r = records[idx]
        svg_html = (
            f"<div style='border:1px solid #ddd;margin:8px;padding:8px'>"
            f"<strong>{r['title']}</strong> "
            f"(score {score})<br>"
            f"<em>{r['tags']}</em><br>"
            f"<a href='{r['url']}' target='_blank'>원본&nbsp;다운로드</a><br>"
            f"{r['svg']}"  # raw SVG → 브라우저가 바로 렌더
            f"</div>"
        )
        html_snippets.append(svg_html)

    return "", "\n".join(html_snippets)


with gr.Blocks(title="Clker SVG 검색") as demo:
    gr.Markdown("## 🔍 Clker.com SVG Public-Domain Clipart 검색")
    with gr.Row():
        query = gr.Textbox(label="검색어", placeholder="예: cat, tree, …")
        top_k = gr.Slider(1, 50, value=10, step=1, label="결과 개수")
    warn = gr.Markdown()
    out = gr.HTML()

    query.submit(
        fn=search_svg,
        inputs=[query, top_k],
        outputs=[warn, out],
    )

if __name__ == "__main__":
    demo.launch()