From 7414a003058e6d3e51180970670bff9ddc8a56ef Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Sun, 25 Oct 2026 22:38:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=89=8D=E7=AB=AF=E7=95=8C=E9=9D=A2):=20?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=E5=8E=9F=E7=89=88=E7=95=8C=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E5=85=A8=E5=B1=9E=E6=80=A7=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/webui/index.html | 175 ++++++++++++++++------------------------ assets/webui/ofdgo.css | 83 ++----------------- assets/webui/ofdgo.js | 62 +++++--------- 3 files changed, 95 insertions(+), 225 deletions(-) diff --git a/assets/webui/index.html b/assets/webui/index.html index 19c5cda..ee6d0f2 100644 --- a/assets/webui/index.html +++ b/assets/webui/index.html @@ -801,116 +801,79 @@ - diff --git a/assets/webui/ofdgo.css b/assets/webui/ofdgo.css index 839a04e..9b95444 100644 --- a/assets/webui/ofdgo.css +++ b/assets/webui/ofdgo.css @@ -1885,43 +1885,6 @@ body[data-hide-meta] .meta-panel { border-left: 1px solid var(--line); } -.meta-panel[data-empty="true"] #metaDocumentPanel { - display: none; -} - -.meta-panel[data-empty="true"] > .font-panel { - margin-top: 0; - padding-top: 0; - border-top: 0; -} - -.meta-panel .panel-row { - display: grid; - grid-template-columns: auto minmax(0, 1fr); - align-items: start; - margin-bottom: 8px; -} - -.meta-panel .panel-title { - display: flex; - align-items: center; - min-height: 26px; -} - -.meta-panel .panel-actions { - min-width: 0; - justify-self: end; -} - -.meta-panel .count-pill { - justify-self: end; - max-width: 100%; - min-height: 26px; - height: auto; - white-space: normal; - overflow-wrap: anywhere; -} - .panel-title { margin-bottom: 10px; font-size: 12px; @@ -3833,52 +3796,24 @@ audio.page-media { .meta-list { display: grid; - gap: 8px; + gap: 12px; margin: 0; - font-size: 12px; - line-height: 1.5; } -.meta-list > div { +.meta-list div { display: grid; - grid-template-columns: 4em minmax(0, 1fr); - align-items: start; - gap: 8px; -} - -.security-panel .meta-list > div { - grid-template-columns: 2em minmax(0, 1fr); + gap: 3px; } .meta-list dt { + font-size: 12px; color: var(--text-muted); - overflow-wrap: anywhere; -} - -.meta-list:not(#metaCustomData) dt { - white-space: nowrap; } .meta-list dd { margin: 0; overflow-wrap: anywhere; - white-space: pre-wrap; -} - -.document-info .meta-list:not(#metaCustomData) dt { - text-align-last: justify; -} - -.document-info details:not(:has(.meta-list > div:not([hidden]))) { - display: none; -} - -.document-info details[open] > .meta-list { - margin-top: 8px; -} - -#metaKeywords > span { - display: block; + line-height: 1.35; } .font-panel, @@ -3886,7 +3821,7 @@ audio.page-media { .signature-panel, .structure-panel, .security-panel { - margin-top: 12px; + margin-top: 18px; padding-top: 12px; border-top: 1px solid var(--line); } @@ -3930,7 +3865,6 @@ audio.page-media { gap: 8px; } -.document-info, .doc-font-row, .signature-row { display: grid; @@ -4125,19 +4059,16 @@ audio.page-media { .meta-panel .info-line { grid-template-columns: 4em minmax(0, 1fr); - gap: 8px; } -.signature-row .info-label { +.meta-panel .info-label { text-align-last: justify; } -.document-info details, .signature-row details { font-size: 12px; } -.document-info summary, .signature-row summary { cursor: pointer; color: var(--accent-strong); diff --git a/assets/webui/ofdgo.js b/assets/webui/ofdgo.js index a741cb6..7a366a6 100644 --- a/assets/webui/ofdgo.js +++ b/assets/webui/ofdgo.js @@ -597,20 +597,13 @@ const el = { refreshAppButton: document.querySelector("#refreshAppButton"), metaFile: document.querySelector("#metaFile"), metaTitle: document.querySelector("#metaTitle"), - metaAuthor: document.querySelector("#metaAuthor"), + conversionNotice: document.querySelector("#conversionNotice"), + conversionWarnings: document.querySelector("#conversionWarnings"), metaSubject: document.querySelector("#metaSubject"), - metaAbstract: document.querySelector("#metaAbstract"), - metaKeywords: document.querySelector("#metaKeywords"), + metaAuthor: document.querySelector("#metaAuthor"), metaCreationDate: document.querySelector("#metaCreationDate"), metaModDate: document.querySelector("#metaModDate"), metaCreator: document.querySelector("#metaCreator"), - metaCreatorVersion: document.querySelector("#metaCreatorVersion"), - metaDocId: document.querySelector("#metaDocId"), - metaDocUsage: document.querySelector("#metaDocUsage"), - metaCover: document.querySelector("#metaCover"), - metaCustomData: document.querySelector("#metaCustomData"), - conversionNotice: document.querySelector("#conversionNotice"), - conversionWarnings: document.querySelector("#conversionWarnings"), metaType: document.querySelector("#metaType"), metaVersion: document.querySelector("#metaVersion"), metaSignatures: document.querySelector("#metaSignatures"), @@ -665,7 +658,6 @@ const el = { annotationClose: document.querySelector("#annotationClose"), annotationSubmit: document.querySelector("#annotationSubmit"), annotationDetail: document.querySelector("#annotationDetail"), - docFontPanel: document.querySelector("#docFontPanel"), docFontList: document.querySelector("#docFontList"), docFontSummary: document.querySelector("#docFontSummary"), availableFontSummary: document.querySelector("#availableFontSummary"), @@ -2944,6 +2936,7 @@ async function mountDocumentTab(tab) { if (view?.anchor) restoreScaleAnchor(view.anchor); showNavigation(view?.navigation || el.pagesTab); el.navigationContent.scrollTop = view?.navigationTop || 0; + el.metaPanel.scrollTop = view?.metaTop || 0; canvasEditor.setTool(view?.tool || ""); } else { renderPageList(); @@ -2954,7 +2947,6 @@ async function mountDocumentTab(tab) { } renderFontList(); updateFontSummary(); - el.metaPanel.scrollTop = tab.view?.metaTop || 0; updateControls(); tab.controlsPending = false; setStatus(tab.status); @@ -12638,43 +12630,23 @@ function renderMeta(keepDetails = false) { el.metaPanel.setAttribute("data-busy", String(!!doc.detailsPending)); document.title = `${nativeHost ? "OFDGo" : "OFDGo WebUI"} - ${state.doc ? state.fileName : "OFD编辑器"}`; el.metaFile.textContent = state.doc ? state.fileName : "-"; + el.metaTitle.textContent = doc.title || "-"; + el.metaAuthor.textContent = doc.author || "-"; for (const [field, value] of [ - [el.metaTitle, doc.title || ""], - [el.metaAuthor, doc.author || ""], - [el.metaSubject, doc.subject || ""], - [el.metaAbstract, doc.abstract || ""], + [el.metaSubject, (doc.subject || "").trim()], [el.metaCreationDate, formatDocumentTime(doc.creationDate)], [el.metaModDate, formatDocumentTime(doc.modDate)], - [el.metaCreator, doc.creator || ""], - [el.metaCreatorVersion, doc.creatorVersion || ""], - [el.metaDocId, doc.docId || ""], - [el.metaDocUsage, doc.docUsage || ""], - [el.metaCover, doc.cover || ""], - [el.metaType, doc.docType || ""], - [el.metaVersion, doc.version || ""], + [el.metaCreator, [doc.creator, doc.creatorVersion].filter(Boolean).join(" ")], ]) { field.textContent = value; field.parentElement.hidden = !value; } - el.metaKeywords.replaceChildren(...(doc.keywords || []).map(keyword => { - const item = document.createElement("span"); - item.textContent = keyword || "-"; - return item; - })); - el.metaKeywords.parentElement.hidden = !doc.keywords?.length; - el.metaCustomData.replaceChildren(...(doc.customData || []).map(field => { - const row = document.createElement("div"), name = document.createElement("dt"), value = document.createElement("dd"); - name.textContent = field.Name || "-"; - value.textContent = field.Value || "-"; - row.append(name, value); - return row; - })); - el.metaCustomData.hidden = !doc.customData?.length; + el.metaType.textContent = doc.docType || "-"; + el.metaVersion.textContent = doc.version || "-"; + el.metaFonts.textContent = String(doc.fontCount || 0); el.pageTotal.textContent = String(doc.pageCount || 0); if (keepDetails && doc.detailsPending) return; - const detailsStatus = doc.detailsPending ? "读取中" : doc.detailsError ? "读取失败" : ""; - el.metaSignatures.textContent = detailsStatus || String(doc.signatureCount || 0); - el.metaFonts.textContent = detailsStatus || String(doc.fontCount || 0); + el.metaSignatures.textContent = doc.detailsPending ? "正在检查签名" : doc.detailsError ? "读取失败" : String(doc.signatureCount || 0); renderMetaContent(el.signatureList, [doc.signatures, doc.signatureError], renderSignatures); updateStructureControls(); renderMetaContent(el.docFontList, doc.fonts || [], renderDocumentFonts); @@ -13266,10 +13238,15 @@ function mountAnnotationNotes(index, surface, annotations) { function renderDocumentFonts() { const fonts = state.doc?.fonts || []; - el.docFontPanel.hidden = !fonts.length; el.docFontList.replaceChildren(); el.docFontSummary.textContent = fontSummary(fonts); - if (!fonts.length) return; + if (!fonts.length) { + const empty = document.createElement("div"); + empty.className = "font-empty"; + empty.textContent = "暂无字体"; + el.docFontList.append(empty); + return; + } const fragment = document.createDocumentFragment(); for (const font of fonts) { const row = document.createElement("div"); @@ -13718,7 +13695,6 @@ function updateInvoiceControl(disabled) { function updateDocumentControls() { const count = state.doc?.documents?.length || 0, index = managedDocumentIndex(), manager = state.documentManagement; - el.metaPanel.setAttribute("data-empty", String(!state.doc)); const busy = document.body.hasAttribute("data-busy"); const disabled = !state.doc || !state.ready || state.exporting || busy; el.printButton.disabled = disabled;