경로 기반 파비콘 지원
- ncue.net 및 하위 도메인에서 /{첫경로}/favicon.ico 우선 사용
- index.html 폴백 모드에서도 파비콘 이미지 렌더링 및 실패 시 글자 폴백
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
18
index.html
18
index.html
@@ -516,6 +516,18 @@
|
||||
const favTag = link.favorite ? `<span class="tag fav">★ 즐겨찾기</span>` : "";
|
||||
const lockTag = accessible ? "" : `<span class="tag lock">접근 제한</span>`;
|
||||
const letter = esc((link.title || d || "L").trim().slice(0, 1).toUpperCase());
|
||||
function faviconUrl(rawUrl) {
|
||||
try {
|
||||
const uu = new URL(String(rawUrl || ""));
|
||||
const host = String(uu.hostname || "").toLowerCase();
|
||||
const isNcue = host === "ncue.net" || host.endsWith(".ncue.net");
|
||||
const parts = uu.pathname.split("/").filter(Boolean);
|
||||
if (isNcue && parts.length) return `${uu.origin}/${parts[0]}/favicon.ico`;
|
||||
return `${uu.origin}/favicon.ico`;
|
||||
} catch {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
function buildOpenUrl(rawUrl) {
|
||||
const url0 = String(rawUrl || "").trim();
|
||||
if (!url0) return "";
|
||||
@@ -539,11 +551,15 @@
|
||||
? `<a class="btn mini" href="${openHref}" target="_blank" rel="noopener noreferrer">열기</a>`
|
||||
: `<button class="btn mini" type="button" disabled aria-disabled="true" title="이 링크는 현재 권한으로 접근할 수 없습니다.">열기</button>`;
|
||||
const copyAttrs = accessible ? "" : ` disabled aria-disabled="true" title="이 링크는 현재 권한으로 접근할 수 없습니다."`;
|
||||
const fav = faviconUrl(link.url);
|
||||
const faviconHtml = fav
|
||||
? `<img src="${esc(fav)}" alt="" loading="lazy" decoding="async" referrerpolicy="no-referrer" onerror="const p=this.parentNode; this.remove(); if(p) p.insertAdjacentHTML('beforeend','<div class="letter">${letter}</div>');" />`
|
||||
: `<div class="letter">${letter}</div>`;
|
||||
return `
|
||||
<article class="card${accessible ? "" : " disabled"}" data-id="${esc(link.id)}" data-access="${accessible ? "1" : "0"}">
|
||||
<div class="card-head">
|
||||
<div class="card-title">
|
||||
<div class="favicon" aria-hidden="true"><div class="letter">${letter}</div></div>
|
||||
<div class="favicon" aria-hidden="true">${faviconHtml}</div>
|
||||
<div class="title-wrap">
|
||||
<div class="title" title="${t}">${t}</div>
|
||||
<div class="domain" title="${d}">${d}</div>
|
||||
|
||||
@@ -184,6 +184,12 @@
|
||||
function faviconUrl(url) {
|
||||
try {
|
||||
const u = new URL(url);
|
||||
// default: site root favicon
|
||||
// special: allow per-path favicon like https://ncue.net/dsyoon/favicon.ico (internal only)
|
||||
const host = String(u.hostname || "").toLowerCase();
|
||||
const isNcue = host === "ncue.net" || host.endsWith(".ncue.net");
|
||||
const parts = u.pathname.split("/").filter(Boolean);
|
||||
if (isNcue && parts.length) return `${u.origin}/${parts[0]}/favicon.ico`;
|
||||
return `${u.origin}/favicon.ico`;
|
||||
} catch {
|
||||
return "";
|
||||
|
||||
Reference in New Issue
Block a user