feat: 增加获取图片源地址功能
This commit is contained in:
@@ -5,6 +5,8 @@
|
|||||||
export interface PinData {
|
export interface PinData {
|
||||||
/** 相对路径,如 "/pins/7118240882" */
|
/** 相对路径,如 "/pins/7118240882" */
|
||||||
url: string;
|
url: string;
|
||||||
|
/** 图片缩略图地址 */
|
||||||
|
imgSmallSrc: string;
|
||||||
/** 图片源地址 */
|
/** 图片源地址 */
|
||||||
imgSrc: string;
|
imgSrc: string;
|
||||||
/** 图片原始宽度 */
|
/** 图片原始宽度 */
|
||||||
@@ -120,9 +122,12 @@ export class PinCollector {
|
|||||||
const width = parseFloat(img.getAttribute('width') || '0');
|
const width = parseFloat(img.getAttribute('width') || '0');
|
||||||
const height = parseFloat(img.getAttribute('height') || '0');
|
const height = parseFloat(img.getAttribute('height') || '0');
|
||||||
|
|
||||||
|
const originalSrc = img.src.replace(/_fw\d+(webp)?/, '');
|
||||||
|
|
||||||
return {
|
return {
|
||||||
url: href,
|
url: href,
|
||||||
imgSrc: img.src,
|
imgSmallSrc: img.src,
|
||||||
|
imgSrc: originalSrc,
|
||||||
imgWidth: width,
|
imgWidth: width,
|
||||||
imgHeight: height,
|
imgHeight: height,
|
||||||
alt: altText,
|
alt: altText,
|
||||||
|
|||||||
@@ -9,15 +9,12 @@ export default defineContentScript({
|
|||||||
|
|
||||||
const collector = new PinCollector();
|
const collector = new PinCollector();
|
||||||
// 首次加载自动收集并存储
|
// 首次加载自动收集并存储
|
||||||
const pins = collector.collect();
|
|
||||||
if (pins.length > 0) {
|
|
||||||
collector.saveToStorage();
|
|
||||||
}
|
|
||||||
// 允许 popup 主动触发重新收集
|
// 允许 popup 主动触发重新收集
|
||||||
browser.runtime.onMessage.addListener((msg, sender, sendResponse) => {
|
browser.runtime.onMessage.addListener((msg, sender, sendResponse) => {
|
||||||
if (msg.type === 'COLLECT_PINS') {
|
if (msg.type === 'COLLECT_PINS') {
|
||||||
const updatedPins = collector.collect();
|
const pins = collector.collect();
|
||||||
sendResponse({ success: true, count: updatedPins.length });
|
sendResponse({ success: true, count: pins.length, pins });
|
||||||
return true; // 异步响应
|
return true; // 异步响应
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -26,11 +26,13 @@ document.getElementById('collectBtn')!.addEventListener('click', async () => {
|
|||||||
type: 'COLLECT_PINS',
|
type: 'COLLECT_PINS',
|
||||||
});
|
});
|
||||||
if (response?.success) {
|
if (response?.success) {
|
||||||
await loadAndRender();
|
await browser.storage.local.set({ collectedPins: response.pins });
|
||||||
|
renderPins(response.pins as PinData[]);
|
||||||
showStatus(`✅ 已收集 ${response.count} 个 Pin`, 'success');
|
showStatus(`✅ 已收集 ${response.count} 个 Pin`, 'success');
|
||||||
}
|
}
|
||||||
} catch {
|
} catch (e) {
|
||||||
showStatus('请在花瓣网页面使用此功能', 'error');
|
const errMsg = e instanceof Error ? e.message : String(e);
|
||||||
|
showStatus(`错误: ${errMsg}`, 'error');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -64,11 +66,12 @@ function renderPins(pins: PinData[]): void {
|
|||||||
.map(
|
.map(
|
||||||
(pin) => `
|
(pin) => `
|
||||||
<div class="pin-item">
|
<div class="pin-item">
|
||||||
<img src="${pin.imgSrc}" loading="lazy" alt="${escapeHtml(pin.alt)}" />
|
<img src="${pin.imgSmallSrc}" loading="lazy" alt="${escapeHtml(pin.alt)}" />
|
||||||
<div class="pin-info">
|
<div class="pin-info">
|
||||||
<div class="pin-author">${escapeHtml(pin.author || '未知作者')} · ${escapeHtml(pin.time || '')}</div>
|
<div class="pin-author">${escapeHtml(pin.author || '未知作者')} · ${escapeHtml(pin.time || '')}</div>
|
||||||
<div class="pin-tags">${pin.tags.map(t => `#${escapeHtml(t)}`).join(' ')}</div>
|
<div class="pin-tags">${pin.tags.map(t => `#${escapeHtml(t)}`).join(' ')}</div>
|
||||||
<a class="pin-link" href="https://huaban.com${pin.url}" target="_blank">查看原图</a>
|
<a class="pin-link" href="https://huaban.com${pin.url}" target="_blank">查看详情</a>
|
||||||
|
<a class="pin-link" href="${escapeHtml(pin.imgSrc)}" target="_blank">查看原图</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
@@ -80,7 +83,7 @@ function showStatus(msg: string, type: 'info' | 'success' | 'error'): void {
|
|||||||
const statusEl = document.getElementById('status')!;
|
const statusEl = document.getElementById('status')!;
|
||||||
statusEl.textContent = msg;
|
statusEl.textContent = msg;
|
||||||
statusEl.className = `status ${type}`;
|
statusEl.className = `status ${type}`;
|
||||||
setTimeout(() => (statusEl.textContent = ''), 3000);
|
setTimeout(() => (statusEl.textContent = ''), 8000);
|
||||||
}
|
}
|
||||||
|
|
||||||
function escapeHtml(str: string): string {
|
function escapeHtml(str: string): string {
|
||||||
|
|||||||
Reference in New Issue
Block a user