[crawler]

This commit is contained in:
LASTA_DEV01\lasta
2026-05-08 17:41:15 +09:00
commit 4158789869
54 changed files with 4355 additions and 0 deletions

View File

@@ -0,0 +1,179 @@
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Ontology Crawler Platform</title>
<link rel="stylesheet" href="/static/styles.css" />
</head>
<body>
<header class="topbar">
<div>
<h1>Ontology Crawler</h1>
<p>프로젝트별 수집, Claim 검수, 온톨로지 매핑, 추천 태그 확인</p>
</div>
<button id="refreshBtn" class="icon-button" title="새로고침" aria-label="새로고침"></button>
</header>
<main class="layout">
<aside class="sidebar">
<section class="panel">
<div class="panel-head">
<h2>Projects</h2>
</div>
<div class="field-row">
<input id="configPath" value="configs/perfume_subscription.yaml" aria-label="Config path" />
<button id="createProjectBtn" title="프로젝트 생성"></button>
</div>
<div id="projectList" class="list"></div>
</section>
<section class="panel">
<div class="panel-head">
<h2>Crawl</h2>
</div>
<label>
Source
<select id="sourceSelect"></select>
</label>
<label>
URL
<input id="crawlUrl" value="tests/fixtures/sample_perfume.html" />
</label>
<label>
Analyzer
<select id="extractorProvider">
<option value="rule_based">Rule-based</option>
<option value="openai">OpenAI API</option>
<option value="ollama">Ollama</option>
<option value="lm_studio">LM Studio</option>
</select>
</label>
<div class="extractor-options" id="extractorOptions">
<label>
Model
<input id="extractorModel" placeholder="예: local model or API model" />
</label>
<label>
Base URL
<input id="extractorBaseUrl" placeholder="optional provider endpoint" />
</label>
<button id="testExtractorBtn">연결 테스트</button>
</div>
<div class="button-grid">
<button id="discoverBtn">주소 발견</button>
<button id="crawlBtn" class="primary">수집 실행</button>
</div>
<div id="crawlResult" class="mini-log"></div>
<div id="discoveredLinks" class="discovered-links"></div>
</section>
</aside>
<section class="workspace">
<nav class="tabs" aria-label="Admin sections">
<button class="tab active" data-tab="overview">Overview</button>
<button class="tab" data-tab="ontology">Ontology</button>
<button class="tab" data-tab="entities">Entities</button>
<button class="tab" data-tab="claims">Claims</button>
<button class="tab" data-tab="tags">Tags</button>
<button class="tab" data-tab="recommend">Recommend</button>
</nav>
<section id="overview" class="tab-panel active">
<div class="summary-grid">
<div class="metric">
<span>Project</span>
<strong id="metricProject">-</strong>
</div>
<div class="metric">
<span>Domain</span>
<strong id="metricDomain">-</strong>
</div>
<div class="metric">
<span>Sources</span>
<strong id="metricSources">0</strong>
</div>
<div class="metric">
<span>Entities</span>
<strong id="metricEntities">0</strong>
</div>
</div>
<div class="wide-panel">
<h2>Sources</h2>
<div id="sourceTable" class="table"></div>
</div>
</section>
<section id="ontology" class="tab-panel">
<div class="split">
<div class="wide-panel">
<h2>Entity Types</h2>
<div id="ontologyEntities" class="chips"></div>
</div>
<div class="wide-panel">
<h2>Predicates</h2>
<div id="ontologyPredicates" class="chips"></div>
</div>
</div>
</section>
<section id="entities" class="tab-panel">
<div class="toolbar wrap">
<select id="entityTypeFilter"></select>
<button id="loadEntitiesBtn">조회</button>
</div>
<div class="merge-bar">
<input id="mergeSourceId" placeholder="병합할 Entity ID" aria-label="source entity id" />
<input id="mergeTargetId" placeholder="남길 Entity ID" aria-label="target entity id" />
<button id="mergeEntitiesBtn">병합</button>
</div>
<div id="entityTable" class="table"></div>
</section>
<section id="claims" class="tab-panel">
<div class="toolbar">
<button id="loadClaimsBtn">Claim 새로고침</button>
</div>
<div id="claimTable" class="claim-list"></div>
</section>
<section id="tags" class="tab-panel">
<div class="toolbar">
<button id="loadTagsBtn">태그 조회</button>
</div>
<div id="tagTable" class="table"></div>
</section>
<section id="recommend" class="tab-panel">
<div class="recommend-grid">
<label>
Preferred notes
<input id="preferredNotes" value="Bergamot, Musk" />
</label>
<label>
Avoided notes
<input id="avoidedNotes" value="" />
</label>
<label>
Preferred moods
<input id="preferredMoods" value="Fresh" />
</label>
<label>
Season
<input id="seasonContext" value="Summer" />
</label>
<label>
Occasion
<input id="occasionContext" value="Daily" />
</label>
</div>
<button id="recommendBtn" class="primary">추천 테스트</button>
<div id="recommendTable" class="table"></div>
</section>
</section>
</main>
<div id="toast" role="status" aria-live="polite"></div>
<script src="/static/app.js"></script>
</body>
</html>