Spaces:
Running
Running
| <html lang="ko"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>TeXray β AI κΈ νλ³κΈ°</title> | |
| <link href="https://fonts.googleapis.com/css2?family=Sora:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&family=Noto+Sans+KR:wght@300;400;500;700;900&display=swap" rel="stylesheet"> | |
| <style> | |
| *{margin:0;padding:0;box-sizing:border-box;} | |
| :root{ | |
| --bg:#f8f9fc;--bg-deep:#f0f2f8;--surface:#ffffff;--surface-alt:#f5f6fa; | |
| --border:#e2e5f0;--border-hover:#c7cce0; | |
| --shadow-sm:0 1px 3px rgba(15,23,42,0.04),0 1px 2px rgba(15,23,42,0.06); | |
| --shadow:0 4px 16px rgba(15,23,42,0.06),0 1px 3px rgba(15,23,42,0.08); | |
| --shadow-lg:0 12px 40px rgba(15,23,42,0.08),0 4px 12px rgba(15,23,42,0.06); | |
| --text:#0f172a;--text-sec:#475569;--text-muted:#94a3b8; | |
| --accent:#6366f1;--accent-light:#818cf8;--accent-bg:rgba(99,102,241,0.06); | |
| --teal:#0d9488;--teal-bg:rgba(13,148,136,0.06); | |
| --rose:#e11d48;--rose-bg:rgba(225,29,72,0.06); | |
| --amber:#d97706;--amber-bg:rgba(217,119,6,0.06); | |
| --green:#16a34a; | |
| --radius:16px;--radius-sm:10px;--radius-xs:6px; | |
| --font-display:'Sora','Noto Sans KR',sans-serif; | |
| --font-body:'Noto Sans KR','Sora',sans-serif; | |
| --font-mono:'JetBrains Mono',monospace; | |
| --tr:0.25s cubic-bezier(0.4,0,0.2,1); | |
| } | |
| html{scroll-behavior:smooth;} | |
| body{font-family:var(--font-body);background:var(--bg);color:var(--text);min-height:100vh;overflow-x:hidden;-webkit-font-smoothing:antialiased;} | |
| ::-webkit-scrollbar{width:6px;}::-webkit-scrollbar-track{background:transparent;} | |
| ::-webkit-scrollbar-thumb{background:rgba(99,102,241,0.2);border-radius:10px;} | |
| ::selection{background:rgba(99,102,241,0.15);} | |
| .bg-pattern{position:fixed;inset:0;z-index:0;pointer-events:none; | |
| background:radial-gradient(ellipse 80% 50% at 20% 10%,rgba(99,102,241,0.04),transparent 50%), | |
| radial-gradient(ellipse 60% 40% at 80% 90%,rgba(13,148,136,0.03),transparent 50%);} | |
| .app-wrapper{position:relative;z-index:1;display:flex;flex-direction:column;min-height:100vh;max-width:900px;margin:0 auto;padding:24px 24px 48px;} | |
| /* HEADER */ | |
| .header{text-align:center;padding:40px 0 32px;animation:fadeIn .8s ease-out;} | |
| @keyframes fadeIn{from{opacity:0;transform:translateY(-16px)}to{opacity:1;transform:translateY(0)}} | |
| .header-eyebrow{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:5px;text-transform:uppercase;color:var(--accent);margin-bottom:10px;} | |
| .header-title{font-family:var(--font-display);font-size:48px;font-weight:800;line-height:1.15;letter-spacing:-1.5px;margin-bottom:12px;} | |
| .gradient-text{background:linear-gradient(135deg,#6366f1,#0ea5e9 40%,#0d9488 70%,#6366f1);background-size:200% 200%;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:shimmer 6s ease-in-out infinite;} | |
| @keyframes shimmer{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}} | |
| .header-sub{font-size:14px;color:var(--text-sec);line-height:1.7;max-width:540px;margin:0 auto 18px;} | |
| .header-sub b{color:var(--text);font-weight:600;} | |
| .pill-row{display:flex;gap:6px;justify-content:center;flex-wrap:wrap;animation:fadeUp .8s .2s ease-out both;} | |
| @keyframes fadeUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}} | |
| .pill{padding:4px 12px;background:var(--surface);border:1px solid var(--border);border-radius:20px;font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--text-muted);transition:var(--tr);box-shadow:var(--shadow-sm);} | |
| .pill:hover{border-color:var(--accent);color:var(--accent);} | |
| /* NAV */ | |
| .nav{display:flex;gap:4px;background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:4px;margin-bottom:24px;position:sticky;top:12px;z-index:100;box-shadow:var(--shadow);animation:fadeUp .8s .3s ease-out both;} | |
| .nav-item{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;border-radius:var(--radius-sm);cursor:pointer;font-size:13px;font-weight:600;color:var(--text-muted);transition:var(--tr);user-select:none;} | |
| .nav-item:hover{color:var(--text-sec);background:var(--surface-alt);} | |
| .nav-item.active{color:#fff;background:linear-gradient(135deg,#6366f1,#4f46e5);box-shadow:0 4px 16px rgba(99,102,241,0.3),inset 0 1px 0 rgba(255,255,255,0.15);} | |
| .nav-icon{font-size:14px;} | |
| /* PANELS */ | |
| .panel{display:none;animation:panelIn .4s ease-out;}.panel.active{display:block;} | |
| @keyframes panelIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}} | |
| /* CARD */ | |
| .card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:28px;margin-bottom:20px;box-shadow:var(--shadow-sm);transition:all .3s;} | |
| .card:hover{box-shadow:var(--shadow);border-color:var(--border-hover);} | |
| .card-header{display:flex;align-items:center;gap:12px;margin-bottom:6px;} | |
| .card-icon{width:38px;height:38px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;} | |
| .card-icon.purple{background:var(--accent-bg);border:1px solid rgba(99,102,241,0.15);} | |
| .card-icon.teal{background:var(--teal-bg);border:1px solid rgba(13,148,136,0.15);} | |
| .card-icon.amber{background:var(--amber-bg);border:1px solid rgba(217,119,6,0.15);} | |
| .card-title{font-family:var(--font-display);font-size:17px;font-weight:700;} | |
| .card-desc{font-size:12.5px;color:var(--text-muted);line-height:1.65;margin-bottom:18px;padding-left:50px;} | |
| /* TEXTAREA */ | |
| .input-group{margin-bottom:18px;}.textarea-wrap{position:relative;} | |
| textarea{width:100%;min-height:200px;padding:18px 20px 32px;background:var(--surface-alt);border:1.5px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-family:var(--font-body);font-size:14px;line-height:1.8;resize:vertical;outline:none;transition:border-color .3s,box-shadow .3s;} | |
| textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(99,102,241,0.1);} | |
| textarea::placeholder{color:var(--text-muted);font-size:13px;} | |
| .char-counter{position:absolute;bottom:10px;right:16px;font-family:var(--font-mono);font-size:10px;color:var(--text-muted);background:var(--surface);padding:2px 8px;border-radius:4px;pointer-events:none;} | |
| /* BUTTONS */ | |
| .btn-group{display:flex;gap:8px;flex-wrap:wrap;align-items:center;} | |
| .btn{padding:11px 22px;border:none;border-radius:var(--radius-sm);cursor:pointer;font-family:var(--font-body);font-weight:600;font-size:13px;transition:all .25s;letter-spacing:0.2px;} | |
| .btn-primary{background:linear-gradient(135deg,#6366f1,#4f46e5);color:#fff;box-shadow:0 4px 16px rgba(99,102,241,0.25);} | |
| .btn-primary:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(99,102,241,0.3);} | |
| .btn-primary:active{transform:translateY(0);}.btn-primary:disabled{opacity:0.45;cursor:not-allowed;transform:none!important;} | |
| .btn-ghost{padding:9px 16px;background:var(--surface);color:var(--text-muted);border:1px solid var(--border);font-size:12px;border-radius:var(--radius-xs);} | |
| .btn-ghost:hover{background:var(--accent-bg);color:var(--accent);border-color:rgba(99,102,241,0.3);} | |
| /* LOADING */ | |
| .loader{display:none;text-align:center;padding:48px 24px;}.loader.active{display:block;} | |
| .loader-ring{width:44px;height:44px;border:3px solid rgba(99,102,241,0.12);border-top-color:var(--accent);border-radius:50%;animation:spin .9s linear infinite;margin:0 auto 16px;position:relative;} | |
| .loader-ring::after{content:'';position:absolute;inset:4px;border:2px solid transparent;border-top-color:var(--teal);border-radius:50%;animation:spin 1.4s linear infinite reverse;} | |
| @keyframes spin{to{transform:rotate(360deg)}} | |
| .loader-text{font-size:13px;color:var(--text-sec);animation:breathe 2s ease-in-out infinite;} | |
| .loader-dots{display:inline-flex;gap:4px;margin-top:8px;} | |
| .loader-dots span{width:4px;height:4px;border-radius:50%;background:var(--accent);opacity:0.3;animation:dotP 1.2s ease-in-out infinite;} | |
| .loader-dots span:nth-child(2){animation-delay:.15s;}.loader-dots span:nth-child(3){animation-delay:.3s;} | |
| @keyframes dotP{0%,100%{opacity:0.2;transform:scale(0.8)}50%{opacity:1;transform:scale(1.2)}} | |
| @keyframes breathe{0%,100%{opacity:1}50%{opacity:0.5}} | |
| /* RESULT */ | |
| .result-html{border-radius:var(--radius);overflow:hidden;margin-top:16px;animation:rIn .5s ease-out;} | |
| .result-html:empty{display:none;} | |
| @keyframes rIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}} | |
| .log-box{background:var(--surface-alt);border:1px solid var(--border);border-radius:var(--radius-xs);padding:14px 18px;font-family:var(--font-mono);font-size:11px;color:var(--text-muted);line-height:1.7;white-space:pre-wrap;margin-top:10px;} | |
| .log-box:empty{display:none;} | |
| /* FOOTER */ | |
| .footer{text-align:center;margin-top:48px;padding:24px 0;border-top:1px solid var(--border);} | |
| .footer-brand{font-family:var(--font-display);font-size:13px;font-weight:600;color:var(--text-muted);margin-bottom:6px;} | |
| .footer-tech{font-family:var(--font-mono);font-size:10px;color:var(--text-muted);opacity:0.6;letter-spacing:1px;} | |
| .footer-line{width:40px;height:2px;background:linear-gradient(90deg,transparent,var(--accent),transparent);margin:10px auto;border-radius:2px;opacity:0.4;} | |
| /* FILE */ | |
| .btn-file{position:relative;overflow:hidden;}.btn-file input[type=file]{position:absolute;inset:0;opacity:0;cursor:pointer;font-size:0;} | |
| .file-status{display:none;padding:8px 14px;background:var(--accent-bg);border:1px solid rgba(99,102,241,0.15);border-radius:var(--radius-sm);margin-top:10px;font-size:11px;color:var(--accent);align-items:center;gap:8px;} | |
| .file-status.active{display:flex;} | |
| .file-status .fname{font-weight:600;color:var(--text);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} | |
| .file-status .fsize{color:var(--text-muted);font-family:var(--font-mono);font-size:10px;} | |
| .file-status .fclose{cursor:pointer;color:var(--rose);margin-left:auto;font-size:13px;padding:0 4px;} | |
| .file-loading{display:inline-block;width:12px;height:12px;border:2px solid var(--accent);border-top-color:transparent;border-radius:50%;animation:spin .6s linear infinite;} | |
| /* βββ COMPETITION TAB βββ */ | |
| @keyframes cmpUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}} | |
| @keyframes cmpBar{from{width:0%}} | |
| @keyframes cmpGlow{0%,100%{box-shadow:0 0 0 2px rgba(99,102,241,0.08)}50%{box-shadow:0 0 0 4px rgba(99,102,241,0.15)}} | |
| @keyframes cmpPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.03)}} | |
| .cmp-hero{background:linear-gradient(135deg,#4f46e5,#6366f1 40%,#818cf8 70%,#a5b4fc);border-radius:var(--radius);padding:32px 28px;margin-bottom:16px;position:relative;overflow:hidden;animation:cmpUp .6s ease-out;} | |
| .cmp-hero::before{content:'';position:absolute;top:-60%;right:-20%;width:50%;height:200%;background:radial-gradient(circle,rgba(255,255,255,0.08),transparent 60%);transform:rotate(20deg);} | |
| .cmp-hero-title{font-family:var(--font-display);font-size:24px;font-weight:900;color:#fff;position:relative;} | |
| .cmp-hero-sub{font-size:12px;color:rgba(255,255,255,0.8);line-height:1.7;margin-top:6px;position:relative;} | |
| .cmp-hero-badge{display:inline-block;background:rgba(255,255,255,0.2);backdrop-filter:blur(8px);color:#fff;font-size:10px;font-weight:800;padding:5px 14px;border-radius:20px;margin-top:10px;animation:cmpPulse 2.5s ease-in-out infinite;position:relative;border:1px solid rgba(255,255,255,0.25);} | |
| .cmp-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:16px;animation:cmpUp .8s .1s ease-out both;} | |
| .cmp-stat{background:var(--surface);border:1.5px solid var(--border);border-radius:var(--radius-sm);padding:16px 8px;text-align:center;transition:all .3s;box-shadow:var(--shadow-sm);} | |
| .cmp-stat:hover{transform:translateY(-3px);border-color:var(--accent);box-shadow:var(--shadow);} | |
| .cmp-stat-num{font-size:26px;font-weight:900;font-family:var(--font-display);color:var(--accent);} | |
| .cmp-stat-label{font-size:9px;color:var(--text-muted);margin-top:3px;font-weight:600;line-height:1.4;} | |
| .cmp-tw{animation:cmpUp .9s .2s ease-out both;margin-bottom:16px;overflow-x:auto;border-radius:var(--radius-sm);box-shadow:var(--shadow);} | |
| .cmp-t{width:100%;border-collapse:collapse;background:var(--surface);} | |
| .cmp-t thead th{background:linear-gradient(135deg,#4f46e5,#6366f1);color:#fff;padding:11px 7px;font-size:10px;font-weight:700;text-align:center;white-space:nowrap;} | |
| .cmp-t thead th:first-child{text-align:left;padding-left:14px;min-width:120px;} | |
| .cmp-t thead th.co{background:linear-gradient(135deg,#dc2626,#ef4444);font-size:11px;} | |
| .cmp-t tbody td{padding:9px 7px;font-size:10px;text-align:center;color:var(--text-sec);border-bottom:1px solid var(--border);} | |
| .cmp-t tbody tr:hover td{background:rgba(99,102,241,0.03);} | |
| .cmp-t tbody td:first-child{text-align:left;padding-left:14px;font-weight:600;color:var(--text);} | |
| .cmp-t tbody td:nth-child(2){background:rgba(99,102,241,0.04);font-weight:700;} | |
| .cmp-t tbody tr:last-child td{border-bottom:none;} | |
| .ck{color:#16a34a;font-weight:800;font-size:14px;}.cx{color:#dc2626;font-weight:700;font-size:12px;} | |
| .cp{color:#d97706;font-weight:700;font-size:11px;}.cs{color:#6366f1;font-weight:900;font-size:13px;} | |
| .cmp-dg{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:16px;animation:cmpUp 1s .4s ease-out both;} | |
| .cmp-d{background:var(--surface);border:1.5px solid var(--border);border-radius:var(--radius-sm);padding:16px;transition:all .3s;position:relative;overflow:hidden;box-shadow:var(--shadow-sm);} | |
| .cmp-d:hover{transform:translateY(-2px);box-shadow:var(--shadow);border-color:var(--border-hover);} | |
| .cmp-d::after{content:'';position:absolute;top:0;left:0;right:0;height:3px;} | |
| .cmp-d:nth-child(1)::after{background:linear-gradient(90deg,#6366f1,#a78bfa);} | |
| .cmp-d:nth-child(2)::after{background:linear-gradient(90deg,#e11d48,#f97316);} | |
| .cmp-d:nth-child(3)::after{background:linear-gradient(90deg,#0d9488,#06b6d4);} | |
| .cmp-d:nth-child(4)::after{background:linear-gradient(90deg,#2563eb,#818cf8);} | |
| .cmp-di{font-size:24px;margin-bottom:5px;}.cmp-dt{font-size:13px;font-weight:800;color:var(--text);margin-bottom:4px;} | |
| .cmp-dd{font-size:9.5px;color:var(--text-muted);line-height:1.55;} | |
| .cmp-dv{display:inline-block;background:var(--rose-bg);color:var(--rose);font-size:8.5px;font-weight:700;padding:2px 7px;border-radius:4px;margin-top:5px;} | |
| .cmp-atk{animation:cmpUp 1.1s .6s ease-out both;margin-bottom:16px;} | |
| .cmp-atk-title{font-size:13px;font-weight:800;color:var(--text);margin-bottom:10px;} | |
| .cmp-ai{margin-bottom:8px;}.cmp-al{display:flex;justify-content:space-between;align-items:center;margin-bottom:3px;} | |
| .cmp-an{font-size:10px;font-weight:600;color:var(--text-sec);}.cmp-aw{font-size:9px;color:var(--teal);font-weight:600;} | |
| .cmp-ab{height:7px;background:var(--surface-alt);border:1px solid var(--border);border-radius:4px;overflow:hidden;} | |
| .cmp-af{height:100%;border-radius:3px;animation:cmpBar 1.8s ease-out;} | |
| .cmp-slogan{background:linear-gradient(135deg,#f5f3ff,#ede9fe,#e0e7ff);border:2px solid #c7d2fe;border-radius:var(--radius);padding:22px;text-align:center;animation:cmpGlow 3s ease-in-out infinite;} | |
| .cmp-sm{font-family:var(--font-display);font-size:15px;font-weight:900;color:#4338ca;margin-bottom:6px;} | |
| .cmp-ss{font-size:10.5px;color:#6366f1;line-height:1.8;}.cmp-ss b{color:#0d9488;} | |
| @media(max-width:640px){ | |
| .app-wrapper{padding:12px 12px 32px;}.header{padding:24px 0 18px;}.header-title{font-size:32px;} | |
| .nav{flex-wrap:wrap;position:static;}.nav-item{font-size:11px;padding:10px 6px;} | |
| .card{padding:20px 16px;}.card-desc{padding-left:0;margin-top:8px;} | |
| textarea{min-height:160px;font-size:13px;padding:14px 16px 28px;}.btn{padding:10px 16px;font-size:12px;} | |
| .cmp-stats{grid-template-columns:repeat(2,1fr);}.cmp-dg{grid-template-columns:1fr;} | |
| .cmp-stat-num{font-size:20px;}.cmp-hero-title{font-size:18px;} | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="bg-pattern"></div> | |
| <div class="app-wrapper"> | |
| <header class="header"> | |
| <div class="header-eyebrow">AI Text Detector</div> | |
| <h1 class="header-title"><span class="gradient-text">TeXray</span></h1> | |
| <p class="header-sub"><b>5μΆ+Perplexity+Humanizerνμ§+λͺ¨λΈμΆμ </b> Β· <b>νμ§ μΈ‘μ </b> Β· <b>LLM κ΅μ°¨κ²μ¦</b> Β· <b>νμ κ²μ¬</b></p> | |
| <div class="pill-row"> | |
| <span class="pill" style="background:linear-gradient(135deg,rgba(239,68,68,0.08),rgba(249,115,22,0.08));border-color:rgba(239,68,68,0.25);color:#dc2626;font-weight:700;">π₯ v5.1</span> | |
| <span class="pill">Perplexity νλ₯ </span><span class="pill">Humanizer νμ§</span> | |
| <span class="pill">λͺ¨λΈ μΆμ </span><span class="pill">LLM 3μ€ κ²μ¦</span><span class="pill">PDFΒ·DOCXΒ·HWP</span> | |
| </div> | |
| </header> | |
| <nav class="nav"> | |
| <div class="nav-item active" data-tab="compare" onclick="switchTab('compare')"><span class="nav-icon">βοΈ</span><span>μλΉμ€ λΉκ΅</span></div> | |
| <div class="nav-item" data-tab="detect" onclick="switchTab('detect')"><span class="nav-icon">π</span><span>μμ± AI μ¬λΆ νλ³</span></div> | |
| <div class="nav-item" data-tab="highlight" onclick="switchTab('highlight')"><span class="nav-icon">π</span><span>ꡬκ°λ³ λΆμ</span></div> | |
| <div class="nav-item" data-tab="plagiarism" onclick="switchTab('plagiarism')"><span class="nav-icon">π</span><span>νμ κ²μ¬</span></div> | |
| </nav> | |
| <!-- μλΉμ€ λΉκ΅ --> | |
| <div class="panel active" id="panel-compare"> | |
| <div class="cmp-hero"> | |
| <div class="cmp-hero-title">π°π· νκ΅μ΄ AI νλ³ No.1</div> | |
| <div class="cmp-hero-sub">μΉ΄νΌν¬λ¬ Β· GPTZero Β· Turnitin Β· JustDone Β· Originality.ai λ±<br>κΈλ‘λ² 8κ° κ²½μ μλΉμ€ μ λ° λΆμ ν μ€κ³λ μ°¨μΈλ νλ³κΈ°</div> | |
| <div class="cmp-hero-badge">π¬ v5.1 β 3λ ν¬λ¬ κΈ°λ₯ νμ¬</div> | |
| </div> | |
| <div class="cmp-stats"> | |
| <div class="cmp-stat"><div class="cmp-stat-num">8μΆ</div><div class="cmp-stat-label">νμ§ μ°¨μ<br>(μ κ³ μ΅λ€)</div></div> | |
| <div class="cmp-stat"><div class="cmp-stat-num">100%</div><div class="cmp-stat-label">ν μ€νΈ μ νλ<br>(11/11 μν)</div></div> | |
| <div class="cmp-stat"><div class="cmp-stat-num">무λ£</div><div class="cmp-stat-label">μμ 무λ£<br>(νμ 무μ ν)</div></div> | |
| <div class="cmp-stat"><div class="cmp-stat-num">4μ’ </div><div class="cmp-stat-label">λͺ¨λΈ μΆμ <br>(GPT/Claude/Gemini/PPX)</div></div> | |
| </div> | |
| <div class="cmp-tw"> | |
| <table class="cmp-t"><thead><tr> | |
| <th>κΈ°λ₯</th><th class="co">π TeXray v5.1</th><th>π μΉ΄νΌν¬λ¬</th><th>π Ή JustDone</th><th>π GPTZero</th><th>π Ύ Originality</th><th>π Turnitin</th> | |
| </tr></thead><tbody> | |
| <tr><td>π― νκ΅μ΄ ννμ</td><td><span class="cs">β μ μ©</span></td><td><span class="ck">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="cp">β³</span></td></tr> | |
| <tr><td>π νμ§ μΆ μ</td><td><span class="cs">8μΆ</span></td><td>1~2</td><td>1</td><td>2</td><td>1</td><td>1</td></tr> | |
| <tr><td>π§ Perplexity λΆμ</td><td><span class="ck">β</span> 4μ€</td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="ck">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td></tr> | |
| <tr><td>π‘οΈ Humanizer νμ§</td><td><span class="ck">β</span> 6μκ·Έλ</td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="ck">β</span></td><td><span class="ck">β</span></td></tr> | |
| <tr><td>π― AI λͺ¨λΈ μΆμ </td><td><span class="cs">β 4λͺ¨λΈ</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="cp">β³</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td></tr> | |
| <tr><td>π€ LLM κ΅μ°¨κ²μ¦</td><td><span class="cs">β 3λͺ¨λΈ</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td></tr> | |
| <tr><td>π κ·Όκ±° ν¬λͺ 곡κ°</td><td><span class="cs">β 8μΆλ³</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="cp">β³</span></td><td><span class="cp">β³</span></td><td><span class="cx">β</span></td></tr> | |
| <tr><td>π¨ λ¬Έμ₯λ³ νμ΄λΌμ΄νΈ</td><td><span class="ck">β</span> 5λ¨κ³</td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="ck">β</span></td><td><span class="ck">β</span></td><td><span class="ck">β</span></td></tr> | |
| <tr><td>π HWP/HWPX</td><td><span class="ck">β</span></td><td><span class="ck">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td></tr> | |
| <tr><td>π κΈ νμ§ μΈ‘μ </td><td><span class="ck">β</span> 6νλͺ©</td><td><span class="cx">β</span></td><td><span class="cp">β³</span></td><td><span class="cx">β</span></td><td><span class="ck">β</span></td><td><span class="cx">β</span></td></tr> | |
| <tr><td>π νμ κ²μ¬</td><td><span class="ck">β</span> 5μμ€</td><td><span class="ck">β</span> DB</td><td><span class="ck">β</span></td><td><span class="cx">β</span></td><td><span class="cx">β</span></td><td><span class="ck">β</span></td></tr> | |
| <tr><td>π° κ°κ²©</td><td><b style="color:#16a34a">μμ 무λ£</b></td><td style="color:var(--text-muted)">9,900μ/건</td><td style="color:var(--text-muted)">$7.99~/μ</td><td style="color:var(--text-muted)">$8.33~/μ</td><td style="color:var(--text-muted)">$14.95/μ</td><td style="color:var(--text-muted)">κΈ°κ΄ μ μ©</td></tr> | |
| <tr><td>π― λμ λͺ¨λΈ</td><td><b style="color:#6366f1">μ AI λͺ¨λΈ</b></td><td style="color:#dc2626">GPTλ§</td><td>λ²μ©</td><td>λ²μ©</td><td>λ²μ©</td><td>λ²μ©</td></tr> | |
| <tr><td>β οΈ ν΅μ¬ μ½μ </td><td style="font-size:8px;color:#6366f1">κ·μΉ κΈ°λ°<br>(ML λ―Έμ μ©)</td><td style="font-size:8px;color:#dc2626">GPTλ§Β·89%λΆλ§</td><td style="font-size:8px;color:#dc2626">30%+νΈμ°¨</td><td style="font-size:8px;color:#dc2626">νΌν©41%</td><td style="font-size:8px;color:#dc2626">$14.95/μ</td><td style="font-size:8px;color:#dc2626">κΈ°κ΄λ§</td></tr> | |
| </tbody></table> | |
| </div> | |
| <div class="cmp-dg"> | |
| <div class="cmp-d"><div class="cmp-di">π§ </div><div class="cmp-dt">Perplexity νλ₯ λΆμ</div><div class="cmp-dd">GPTZero ν΅μ¬ κΈ°μ μ νκ΅μ΄ νΉν. λ¬Έμ μνΈλ‘νΌ + Burstiness + TTRνΈμ°¨ + μ’ κ²°μνΈλ‘νΌ 4μ€ λΆμ</div><div class="cmp-dv">vs GPTZero: νκ΅μ΄ ννμ κΈ°λ° β λ μ ν</div></div> | |
| <div class="cmp-d"><div class="cmp-di">π‘οΈ</div><div class="cmp-dt">Humanizer/Bypasser νμ§</div><div class="cmp-dd">QuillBot λ± ν¨λ¬νλ μ΄μ¦ λκ΅¬λ‘ μμ λ AI κΈμ μμ‘΄ νμ 6κ°μ§ μκ·Έλλ‘ νμ§</div><div class="cmp-dv">vs Turnitin: νκ΅μ΄ μ΅μ΄ Humanizer νμ§</div></div> | |
| <div class="cmp-d"><div class="cmp-di">π―</div><div class="cmp-dt">AI λͺ¨λΈ μΆμ (μ κ³ μ μΌ)</div><div class="cmp-dd">GPTΒ·ClaudeΒ·GeminiΒ·Perplexity 4λͺ¨λΈ κ³ μ μ§λ¬Έμ λ³΅ν© μ¦κ±°λ‘ λΆμ</div><div class="cmp-dv">vs μ κ²½μμ¬: λͺ¨λΈ μΆμ κΈ°λ₯ μμ</div></div> | |
| <div class="cmp-d"><div class="cmp-di">π€</div><div class="cmp-dt">LLM 3μ€ κ΅μ°¨κ²μ¦ (μ κ³ μ μΌ)</div><div class="cmp-dd">GPT-OSS-120B Β· Qwen3-32B Β· Kimi-K2 β 3κ° λ 립 AI μ§μ νλ + λ€μκ²° ν¬ν</div><div class="cmp-dv">vs μ κ²½μμ¬: LLM κ΅μ°¨κ²μ¦ 미보μ </div></div> | |
| </div> | |
| <div class="cmp-atk"> | |
| <div class="cmp-atk-title">βοΈ κ²½μμ¬ μ·¨μ½μ vs μ°λ¦¬μ κ°μ </div> | |
| <div class="cmp-ai"><div class="cmp-al"><span class="cmp-an">π μΉ΄νΌν¬λ¬ β GPTλ§ νμ§, 89% λΆλ§μ¨</span><span class="cmp-aw">β μ AI λͺ¨λΈ + 8μΆ ν¬λͺ κ·Όκ±°</span></div><div class="cmp-ab"><div class="cmp-af" style="width:92%;background:linear-gradient(90deg,#6366f1,#a78bfa)"></div></div></div> | |
| <div class="cmp-ai"><div class="cmp-al"><span class="cmp-an">π Ή JustDone β λμΌ ν μ€νΈ 30%+ μ μ νΈμ°¨</span><span class="cmp-aw">β κ²°μ λ‘ μ μ μ 보μ₯</span></div><div class="cmp-ab"><div class="cmp-af" style="width:95%;background:linear-gradient(90deg,#e11d48,#f97316)"></div></div></div> | |
| <div class="cmp-ai"><div class="cmp-al"><span class="cmp-an">π GPTZero β νΌν©ν μ€νΈ 41%, νΈμ§AI 35%</span><span class="cmp-aw">β Humanizer νμ§ + μΉμ λΆλ¦¬</span></div><div class="cmp-ab"><div class="cmp-af" style="width:88%;background:linear-gradient(90deg,#0d9488,#06b6d4)"></div></div></div> | |
| <div class="cmp-ai"><div class="cmp-al"><span class="cmp-an">π Turnitin β κΈ°κ΄ μ μ©, νμ μ¬μ κ²μ¬ λΆκ°</span><span class="cmp-aw">β λꡬλ λ¬΄λ£ μ¦μ μ¬μ©</span></div><div class="cmp-ab"><div class="cmp-af" style="width:90%;background:linear-gradient(90deg,#2563eb,#818cf8)"></div></div></div> | |
| <div class="cmp-ai"><div class="cmp-al"><span class="cmp-an">π Ύ Originality β $14.95/μ, λΉμμ΄ μ·¨μ½</span><span class="cmp-aw">β μμ λ¬΄λ£ + νκ΅μ΄ μ λ¬Έ</span></div><div class="cmp-ab"><div class="cmp-af" style="width:94%;background:linear-gradient(90deg,#7c3aed,#ec4899)"></div></div></div> | |
| </div> | |
| <div class="cmp-slogan"> | |
| <div class="cmp-sm">π°π· νκ΅μ΄ AI κΈμ κ°μ₯ μ ννκ², κ°μ₯ ν¬λͺ νκ², μμ 무λ£λ‘</div> | |
| <div class="cmp-ss">vs μΉ΄νΌν¬λ¬: "GPTλ§μ΄ μλ, <b>λͺ¨λ AI</b>λ₯Ό νμ§ν©λλ€" Β· vs GPTZero: "νκ΅μ΄ <b>ννμ λΆμ</b>μΌλ‘ λ μ νν©λλ€"<br>vs Turnitin: "λꡬλ, <b>무λ£</b>λ‘, μ§κΈ λ°λ‘" Β· vs JustDone: "νμ <b>λμΌν κ²°κ³Ό</b>λ₯Ό 보μ₯ν©λλ€"</div> | |
| </div> | |
| </div> | |
| <!-- μμ± AI μ¬λΆ νλ³ --> | |
| <div class="panel" id="panel-detect"> | |
| <div class="card"> | |
| <div class="card-header"><div class="card-icon purple">π</div><div class="card-title">μμ± AI μ¬λΆ νλ³</div></div> | |
| <div class="card-desc">8μΆ μμλΈ(ν΅κ³Β·λ¬Έμ²΄Β·λ°λ³΅Β·κ΅¬μ‘°Β·μ§λ¬ΈΒ·PerplexityΒ·HumanizerΒ·λͺ¨λΈμΆμ ) + 6νλͺ© νμ§ μΈ‘μ + LLM 3λͺ¨λΈ κ΅μ°¨κ²μ¦<br><span style="display:inline-flex;align-items:center;gap:4px;margin-top:6px;padding:4px 10px;background:var(--accent-bg);border:1px solid rgba(99,102,241,0.12);border-radius:6px;font-size:10px;color:var(--accent);font-weight:600;">π PDF Β· DOCX Β· HWP Β· HWPX Β· TXT Β· MD Β· CSV νμΌ μ λ‘λ μ§μ</span></div> | |
| <div class="input-group"><div class="textarea-wrap"><textarea id="input-detect" placeholder="AI νλ³ν ν μ€νΈλ₯Ό μ λ ₯νμΈμ (μ΅μ 50μ)" oninput="uc('input-detect','count-detect')"></textarea><div class="char-counter" id="count-detect">0μ</div></div></div> | |
| <div class="btn-group"> | |
| <button class="btn btn-primary" id="btn-detect" onclick="runDetect()">π AI νλ³ + νμ§ λΆμ</button> | |
| <button class="btn btn-ghost btn-file">π νμΌ μ λ‘λ<input type="file" accept=".pdf,.docx,.hwp,.hwpx,.txt,.md,.csv" onchange="loadFile(this,'input-detect','fs-detect')"></button> | |
| <button class="btn btn-ghost" onclick="ls('input-detect','ai')">π AI μμ</button> | |
| <button class="btn btn-ghost" onclick="ls('input-detect','human')">βοΈ μΈκ° μμ</button> | |
| </div> | |
| <div class="file-status" id="fs-detect"><span class="fname"></span><span class="fsize"></span><span class="fclose" onclick="clearInline('input-detect','fs-detect')">β</span></div> | |
| </div> | |
| <div class="loader" id="loader-detect"><div class="loader-ring"></div><div class="loader-text">8μΆ λΆμ + LLM κ΅μ°¨κ²μ¦ μ€</div><div class="loader-dots"><span></span><span></span><span></span></div></div> | |
| <div class="result-html" id="result-detect"></div><div class="log-box" id="log-detect"></div> | |
| </div> | |
| <!-- ꡬκ°λ³ λΆμ --> | |
| <div class="panel" id="panel-highlight"> | |
| <div class="card"> | |
| <div class="card-header"><div class="card-icon teal">π</div><div class="card-title">ꡬκ°λ³ λΆμ</div></div> | |
| <div class="card-desc">λ¬Έμ₯λ³ AI νλ₯ μ 5λ¨κ³ μμμΌλ‘ νμν©λλ€. λ§μ°μ€ μ€λ² μ νμ κ·Όκ±°λ₯Ό νμΈνμΈμ.<br><span style="display:inline-flex;align-items:center;gap:4px;margin-top:6px;padding:4px 10px;background:var(--teal-bg);border:1px solid rgba(13,148,136,0.12);border-radius:6px;font-size:10px;color:var(--teal);font-weight:600;">π PDF Β· DOCX Β· HWP Β· HWPX Β· TXT Β· MD Β· CSV νμΌ μ λ‘λ μ§μ</span></div> | |
| <div class="input-group"><div class="textarea-wrap"><textarea id="input-highlight" placeholder="λ¬Έμ₯λ³ AI νλ₯ μμ νμ (μ΅μ 30μ)" oninput="uc('input-highlight','count-highlight')"></textarea><div class="char-counter" id="count-highlight">0μ</div></div></div> | |
| <div class="btn-group"> | |
| <button class="btn btn-primary" id="btn-highlight" onclick="runHighlight()">π ꡬκ°λ³ λΆμ</button> | |
| <button class="btn btn-ghost btn-file">π νμΌ μ λ‘λ<input type="file" accept=".pdf,.docx,.hwp,.hwpx,.txt,.md,.csv" onchange="loadFile(this,'input-highlight','fs-highlight')"></button> | |
| <button class="btn btn-ghost" onclick="ls('input-highlight','ai')">π AI μμ</button> | |
| </div> | |
| <div class="file-status" id="fs-highlight"><span class="fname"></span><span class="fsize"></span><span class="fclose" onclick="clearInline('input-highlight','fs-highlight')">β</span></div> | |
| </div> | |
| <div class="loader" id="loader-highlight"><div class="loader-ring"></div><div class="loader-text">λ¬Έμ₯ λΆμ μ€</div><div class="loader-dots"><span></span><span></span><span></span></div></div> | |
| <div class="result-html" id="result-highlight"></div> | |
| </div> | |
| <!-- νμ κ²μ¬ --> | |
| <div class="panel" id="panel-plagiarism"> | |
| <div class="card"> | |
| <div class="card-header"><div class="card-icon amber">π</div><div class="card-title">νμ κ²μ¬</div></div> | |
| <div class="card-desc">Brave Search λ³λ ¬(μ΅λ 20) + KCI Β· RISS Β· arXiv νμ DB + Gemini Google Search ν΅ν© κ²μ¬<br><span style="display:inline-flex;align-items:center;gap:4px;margin-top:6px;padding:4px 10px;background:var(--amber-bg);border:1px solid rgba(217,119,6,0.12);border-radius:6px;font-size:10px;color:var(--amber);font-weight:600;">π PDF Β· DOCX Β· HWP Β· HWPX Β· TXT Β· MD Β· CSV νμΌ μ λ‘λ μ§μ</span></div> | |
| <div class="input-group"><div class="textarea-wrap"><textarea id="input-plagiarism" placeholder="νμ κ²μ¬ν ν μ€νΈ (μ΅μ 50μ)" oninput="uc('input-plagiarism','count-plagiarism')"></textarea><div class="char-counter" id="count-plagiarism">0μ</div></div></div> | |
| <div class="btn-group"> | |
| <button class="btn btn-primary" id="btn-plagiarism" onclick="runPlagiarism()">π νμ κ²μ¬ μμ</button> | |
| <button class="btn btn-ghost btn-file">π νμΌ μ λ‘λ<input type="file" accept=".pdf,.docx,.hwp,.hwpx,.txt,.md,.csv" onchange="loadFile(this,'input-plagiarism','fs-plagiarism')"></button> | |
| <button class="btn btn-ghost" onclick="ls('input-plagiarism','ai')">π AI μμ</button> | |
| </div> | |
| <div class="file-status" id="fs-plagiarism"><span class="fname"></span><span class="fsize"></span><span class="fclose" onclick="clearInline('input-plagiarism','fs-plagiarism')">β</span></div> | |
| </div> | |
| <div class="loader" id="loader-plagiarism"><div class="loader-ring"></div><div class="loader-text">μΉκ²μ + νμ DB + λ³΄κ³ μ μμ±</div><div class="loader-dots"><span></span><span></span><span></span></div></div> | |
| <div id="result-plagiarism-area" style="display:none;"><div class="result-html" id="result-plagiarism"></div><div class="log-box" id="result-plagiarism-log"></div></div> | |
| </div> | |
| <footer class="footer"> | |
| <div class="footer-brand">TeXray</div><div style="font-size:11px;color:var(--text-muted);margin-bottom:4px;">κ°λ°: <a href="https://vidraft.net" target="_blank" style="color:var(--accent);text-decoration:none;font-weight:600;">Vidraft.net</a></div><div class="footer-line"></div> | |
| <div class="footer-tech">v5.1 Β· KIWI Β· GROQ Β· BRAVE Β· KCI Β· RISS Β· ARXIV Β· GEMINI</div> | |
| </footer> | |
| </div> | |
| <script> | |
| const B=window.location.origin; | |
| const SA=`μΈκ³΅μ§λ₯ κΈ°μ μ νλ μ¬νμμ λ§€μ° μ€μν μν μ νκ³ μμ΅λλ€. νΉν μμ°μ΄ μ²λ¦¬ λΆμΌμμμ λ°μ μ λλΆμ μ±κ³Όλ₯Ό κ±°λκ³ μμ΅λλ€. μ΄λ¬ν κΈ°μ μ λ°μ μ λ€μν μ°μ λΆμΌμ κΈμ μ μΈ μν₯μ λ―ΈμΉκ³ μμΌλ©°, ν₯ν λμ± λ°μ ν κ²μΌλ‘ μμλ©λλ€.\n\nλν μμ±ν AIμ λ±μ₯μΌλ‘ μ½ν μΈ μ μ λ°©μμ΄ ν¬κ² λ³ννκ³ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ κΈ°μ λ€μ ν¨μ¨μ μΈ μ½ν μΈ μμ°μ΄ κ°λ₯ν΄μ‘μΌλ©°, κ°μΈ μ¬μ©μλ€λ λ€μν μ°½μ νλμ AIλ₯Ό νμ©ν μ μκ² λμμ΅λλ€.\n\nλμκ° AI μ€λ¦¬μ κ·μ μ λν λ Όμλ νλ°ν μ§νλκ³ μμ΅λλ€.`; | |
| const SH=`μ μ§μ§ μμ¦ AI λλ¬Έμ 머리 μνλ€γ γ γ μ΄μ chatgptνν λ ν¬νΈ μ¨λ¬λΌκ³ νλλ° μμ κ΅κ³Όμ κ°μ κΈλ§ μ¨μ€μ κ·Έλ₯ λ΄κ° λ€μ μΌμ;;\n\nκ·Όλ° μκ°ν΄λ³΄λ©΄ AIκ° μ΄ κΈμ΄λ μ¬λμ΄ μ΄ κΈμ΄ νμ€ν λ€λ₯΄κΈ΄ ν΄. λκ°... λ무 κΉλνλ¬κΉ?\n\nκ΅μλμ΄ AI νμ§κΈ° λλ¦°λ€κ³ ν΄μ μ’ λ¬΄μμ΄λ° γ γ κ±±μ λλ€ μ§μ¬μΌλ‘.`; | |
| function switchTab(t){document.querySelectorAll('.nav-item').forEach(e=>e.classList.remove('active'));document.querySelectorAll('.panel').forEach(e=>e.classList.remove('active'));document.querySelector(`[data-tab="${t}"]`).classList.add('active');document.getElementById(`panel-${t}`).classList.add('active');} | |
| function uc(a,b){document.getElementById(b).textContent=document.getElementById(a).value.length+'μ';} | |
| function ls(id,t){const e=document.getElementById(id);e.value=t==='ai'?SA:SH;e.dispatchEvent(new Event('input'));} | |
| function sw(id){document.getElementById(id).classList.add('active');} | |
| function hw(id){document.getElementById(id).classList.remove('active');} | |
| async function gc(api,data){ | |
| const urls=[`${B}/gradio/gradio_api/call${api}`,`${B}/gradio/api${api}`,`${B}/gradio_api/call${api}`,`${B}/api${api}`]; | |
| for(const u of urls){ | |
| try{const r=await fetch(u,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({data})}); | |
| if(!r.ok)continue;const j=await r.json();if(!j.event_id)continue; | |
| return new Promise((ok,no)=>{const es=new EventSource(`${u}/${j.event_id}`);let d=false; | |
| const h=e=>{if(d)return;try{const raw=JSON.parse(e.data);const p=Array.isArray(raw)?raw:(raw&&raw.data?raw.data:null);if(p){d=true;es.close();ok(p);}}catch{}}; | |
| es.onmessage=h;es.addEventListener('complete',h); | |
| es.addEventListener('process_completed',e=>{if(d)return;try{const raw=JSON.parse(e.data);const out=raw&&raw.output&&raw.output.data?raw.output.data:null;if(out){d=true;es.close();ok(out);}}catch{}}); | |
| es.onerror=()=>{if(!d){d=true;es.close();no(new Error('μ°κ²° μ€λ₯'));}}; | |
| setTimeout(()=>{if(!d){d=true;es.close();no(new Error('μκ° μ΄κ³Ό'));}},120000); | |
| }); | |
| }catch(e){continue;} | |
| }throw new Error('API μ°κ²° μ€ν¨'); | |
| } | |
| function showError(el,msg){el.innerHTML=`<div style="padding:28px;text-align:center;color:var(--rose);font-size:14px;background:var(--surface);border:1px solid rgba(225,29,72,0.2);border-radius:var(--radius);">β οΈ ${msg}</div>`;} | |
| async function runDetect(){const t=document.getElementById('input-detect').value;if(!t||t.length<50){alert('μ΅μ 50μ μ΄μ μ λ ₯ν΄μ£ΌμΈμ.');return;}const b=document.getElementById('btn-detect');b.disabled=true;document.getElementById('result-detect').innerHTML='';document.getElementById('log-detect').textContent='';sw('loader-detect');try{const d=await gc('/run_detection',[t]);hw('loader-detect');document.getElementById('result-detect').innerHTML=d[0]||'';document.getElementById('log-detect').textContent=d[1]||'';}catch(e){hw('loader-detect');showError(document.getElementById('result-detect'),e.message);}b.disabled=false;} | |
| async function runHighlight(){const t=document.getElementById('input-highlight').value;if(!t||t.length<30){alert('ν μ€νΈλ₯Ό μ λ ₯ν΄μ£ΌμΈμ.');return;}const b=document.getElementById('btn-highlight');b.disabled=true;sw('loader-highlight');try{const d=await gc('/run_highlight',[t]);hw('loader-highlight');document.getElementById('result-highlight').innerHTML=d[0]||'';}catch(e){hw('loader-highlight');showError(document.getElementById('result-highlight'),e.message);}b.disabled=false;} | |
| async function runPlagiarism(){const t=document.getElementById('input-plagiarism').value;if(!t||t.length<50){alert('μ΅μ 50μ μ΄μ μ λ ₯ν΄μ£ΌμΈμ.');return;}const b=document.getElementById('btn-plagiarism');b.disabled=true;document.getElementById('result-plagiarism-area').style.display='none';sw('loader-plagiarism');try{const d=await gc('/run_plagiarism',[t]);hw('loader-plagiarism');document.getElementById('result-plagiarism-area').style.display='block';document.getElementById('result-plagiarism').innerHTML=d[0]||'';document.getElementById('result-plagiarism-log').textContent=d[1]||'';}catch(e){hw('loader-plagiarism');document.getElementById('result-plagiarism-area').style.display='block';showError(document.getElementById('result-plagiarism'),e.message);}b.disabled=false;} | |
| document.addEventListener('keydown',e=>{if(e.ctrlKey&&e.key==='Enter'){const a=document.querySelector('.panel.active');if(a){const btn=a.querySelector('.btn-primary');if(btn&&!btn.disabled)btn.click();}}}); | |
| async function uploadFileToGradio(file){const fd=new FormData();fd.append('files',file);const urls=[`${B}/gradio/gradio_api/upload`,`${B}/gradio/upload`,`${B}/gradio_api/upload`,`${B}/upload`];for(const u of urls){try{const r=await fetch(u,{method:'POST',body:fd});if(r.ok){const j=await r.json();return Array.isArray(j)?j[0]:j;}}catch{}}throw new Error('νμΌ μ λ‘λ μ€ν¨');} | |
| function makeFileData(p,n){return{path:p,meta:{_type:'gradio.FileData'},orig_name:n||'',mime_type:''};} | |
| async function loadFile(input,tid,sid){const file=input.files&&input.files[0];if(!file)return;const fn=file.name,fs=Math.round(file.size/1024)+'KB';const se=document.getElementById(sid),ta=document.getElementById(tid);se.classList.add('active');se.querySelector('.fname').innerHTML=`<span class="file-loading"></span> ${fn} μΆμΆ μ€...`;se.querySelector('.fsize').textContent=fs;try{const up=await uploadFileToGradio(file);const res=await gc('/extract_file_text',[makeFileData(up,fn)]);const text=res[0]||'';if(text.startsWith('β οΈ')){se.querySelector('.fname').textContent='β '+text;se.querySelector('.fname').style.color='var(--rose)';return;}ta.value=text;ta.dispatchEvent(new Event('input'));se.querySelector('.fname').textContent='β '+fn;se.querySelector('.fname').style.color='var(--teal)';se.querySelector('.fsize').textContent=fs+' Β· '+text.length+'μ';}catch(e){se.querySelector('.fname').textContent='β '+e.message;se.querySelector('.fname').style.color='var(--rose)';}input.value='';} | |
| function clearInline(t,s){document.getElementById(s).classList.remove('active');document.getElementById(s).querySelector('.fname').style.color='';} | |
| [{ta:'input-detect',fs:'fs-detect'},{ta:'input-highlight',fs:'fs-highlight'},{ta:'input-plagiarism',fs:'fs-plagiarism'}].forEach(({ta,fs})=>{const el=document.getElementById(ta);if(!el)return;el.addEventListener('dragover',e=>{e.preventDefault();el.style.borderColor='var(--accent)';el.style.background='rgba(99,102,241,0.03)';});el.addEventListener('dragleave',()=>{el.style.borderColor='';el.style.background='';});el.addEventListener('drop',e=>{e.preventDefault();el.style.borderColor='';el.style.background='';const f=e.dataTransfer.files&&e.dataTransfer.files[0];if(!f)return;if(!['pdf','docx','hwp','hwpx','txt','md','csv'].includes(f.name.split('.').pop().toLowerCase()))return;loadFile({files:[f],value:f.name},ta,fs);});}); | |
| </script> | |
| </body> | |
| </html> |