openfree commited on
Commit
1ffb587
ยท
verified ยท
1 Parent(s): 0299d00

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +59 -35
app.py CHANGED
@@ -48,47 +48,71 @@ def process_url_for_iframe(url):
48
  return url, False, []
49
 
50
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ 4. ์นด๋“œ ๊ทธ๋ฆฌ๋“œ HTML โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
51
- def html(urls, pg, total):
52
- if not urls:
53
- return '<div style="text-align:center;padding:70px;color:#555;">ํ‘œ์‹œํ•  ๋ฐฐํฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</div>'
54
-
55
  css = r"""
56
  <style>
57
- body{margin:0;font-family:Poppins,sans-serif;background:#f4f5f7;}
58
- .container{padding:16px;}
59
- .grid{
60
- display:grid;
61
- grid-template-columns:repeat(auto-fill,minmax(340px,1fr));
62
- gap:16px;
63
- }
64
- .card{
65
- background:#fff;border-radius:10px;overflow:hidden;
66
- box-shadow:0 2px 10px rgba(0,0,0,.08);
67
- height:480px; /* โ˜… ๊ธฐ๋ณธ ์นด๋“œ ๋†’์ด โ†‘ */
68
- transition:transform .2s;
69
- }
70
- @media (min-width:1400px){.card{height:640px;} }/* โ˜… ์•„์ฃผ ํฐ ํ™”๋ฉด */
71
- @media (max-width:992px) {.card{height:420px;} }/* ํƒœ๋ธ”๋ฆฟ */
72
- @media (max-width:600px) {.card{height:360px;} }/* ๋ชจ๋ฐ”์ผ */
73
-
74
- .card:hover{transform:translateY(-4px);}
75
- .frame{position:relative;width:100%;height:100%;}
76
- .frame iframe{position:absolute;inset:0;width:100%;height:100%;border:none;}
77
- .page-info{text-align:center;color:#777;margin:12px 0;}
 
 
 
 
 
 
 
 
 
 
 
78
  </style>"""
79
-
80
- body = '<div class="container"><div class="grid">'
81
- for i, origin in enumerate(urls):
82
- src, is_hf, _ = process_url_for_iframe(origin)
83
- body += f"""
 
 
 
 
 
 
 
 
 
 
84
  <div class="card">
85
- <div class="frame{' huggingface' if is_hf else ''}">
86
- <iframe src="{src}" loading="lazy"></iframe>
 
 
87
  </div>
88
  </div>"""
89
- body += "</div></div>"
90
- page_info = f'<div class="page-info">Page {pg} / {total}</div>'
91
- return css + body + page_info
 
92
 
93
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ 5. Gradio UI โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
94
  def build():
 
48
  return url, False, []
49
 
50
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ 4. ์นด๋“œ ๊ทธ๋ฆฌ๋“œ HTML โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
51
+ # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ 6. HTML ๊ทธ๋ฆฌ๋“œ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
52
+ def html(cards, pg, total):
53
+ if not cards:
54
+ return "<div style='text-align:center;padding:70px;color:#555;'>ํ‘œ์‹œํ•  ๋ฐฐํฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</div>"
55
  css = r"""
56
  <style>
57
+ body{
58
+ margin:0;padding:0;font-family:Poppins,sans-serif;
59
+ background:#f0f0f0;overflow-x:hidden;overflow-y:auto;
60
+ }
61
+ .container{width:100%;padding:10px;padding-bottom:70px;box-sizing:border-box;}
62
+ .grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;width:100%;}
63
+ /* ์นด๋“œ ์ „์ฒด๊ฐ€ ๊ฒŒ์ž„ ํ™”๋ฉด โ€“ ํ…Œ๋‘๋ฆฌ๋งŒ ๋‘” ์ƒํƒœ */
64
+ .card{
65
+ background:#fff;border-radius:10px;overflow:hidden;
66
+ box-shadow:0 4px 10px rgba(0,0,0,0.08);
67
+ height:420px; /* โ† ์นด๋“œ ํ‚ค์›€ */
68
+ position:relative;
69
+ }
70
+ .frame{width:100%;height:100%;position:relative;overflow:hidden;}
71
+ .frame iframe{
72
+ position:absolute;top:0;left:0;
73
+ width:166.667%;height:166.667%; /* 1/0.6 = 1.6667 */
74
+ transform:scale(0.6); /* ๊ฒŒ์ž„ ํ™”๋ฉด 60โ€ฏ% ์ถ•์†Œ */
75
+ transform-origin:top left;
76
+ border:0;
77
+ }
78
+ /* ํ—ˆ๊น…ํŽ˜์ด์Šค ์ž„๋ฒ ๋“œ(์ด๋ฏธ ๋‚ด๋ถ€์„œ ์Šค์ผ€์ผ๋ง๋จ)๋Š” ๊ทธ๋Œ€๋กœ */
79
+ .frame.huggingface iframe{
80
+ width:100%!important;height:100%!important;
81
+ transform:none!important;border:none!important;
82
+ }
83
+ /* ๋ฐ˜์‘ํ˜• ๋†’์ด ์กฐ์ • */
84
+ @media(min-width:1200px){.card{height:560px;}}
85
+ @media(max-width:767px){
86
+ .grid{grid-template-columns:1fr;}
87
+ .card{height:480px;}
88
+ }
89
  </style>"""
90
+
91
+ # โฌ‡(์ดํ•˜ JS ๋ฐ ์นด๋“œ ์ƒ์„ฑ ๋กœ์ง์€ ๊ธฐ์กด๊ณผ ๋™์ผ)โฌ‡
92
+ js = """
93
+ <script>
94
+ /* ... (๋™์ผ) ... */
95
+ </script>
96
+ """
97
+
98
+ h = css + js + '<div class="container"><div class="grid">'
99
+ for idx, url in enumerate(cards):
100
+ iframe_url, is_huggingface, alt_urls = process_url_for_iframe(url)
101
+ frame_class = "frame huggingface" if is_huggingface else "frame"
102
+ iframe_id = f"iframe-{idx}-{hash(url)%10000}"
103
+ alt_attr = f'data-alternate-urls="{",".join(alt_urls)}"' if alt_urls else ""
104
+ h += f"""
105
  <div class="card">
106
+ <div class="{frame_class}">
107
+ <iframe id="{iframe_id}" src="{iframe_url}" loading="lazy"
108
+ sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"
109
+ data-original-url="{url}" {alt_attr}></iframe>
110
  </div>
111
  </div>"""
112
+ h += "</div></div>"
113
+ h += f'<div class="page-info">Page {pg} / {total}</div>'
114
+ return h
115
+
116
 
117
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ 5. Gradio UI โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
118
  def build():