Browse Source

surppress redunant images in publications

imwald
Silberengel 3 months ago
parent
commit
4580227e01
  1. 14
      src/components/Note/AsciidocArticle/AsciidocArticle.tsx
  2. 14
      src/components/Note/MarkdownArticle/MarkdownArticle.tsx
  3. 32
      src/components/Note/PublicationIndex/PublicationIndex.tsx

14
src/components/Note/AsciidocArticle/AsciidocArticle.tsx

@ -329,11 +329,13 @@ function convertMarkdownToAsciidoc(content: string): string { @@ -329,11 +329,13 @@ function convertMarkdownToAsciidoc(content: string): string {
export default function AsciidocArticle({
event,
className,
hideImagesAndInfo = false
hideImagesAndInfo = false,
parentImageUrl
}: {
event: Event
className?: string
hideImagesAndInfo?: boolean
parentImageUrl?: string
}) {
const { push } = useSecondaryPage()
const { navigateToHashtag } = useSmartHashtagNavigation()
@ -560,6 +562,7 @@ export default function AsciidocArticle({ @@ -560,6 +562,7 @@ export default function AsciidocArticle({
// Filter tag media to only show what's not in content
const leftoverTagMedia = useMemo(() => {
const metadataImageUrl = metadata.image ? cleanUrl(metadata.image) : null
const parentImageUrlCleaned = parentImageUrl ? cleanUrl(parentImageUrl) : null
return tagMedia.filter(media => {
const cleaned = cleanUrl(media.url)
if (!cleaned) return false
@ -567,9 +570,11 @@ export default function AsciidocArticle({ @@ -567,9 +570,11 @@ export default function AsciidocArticle({
if (mediaUrlsInContent.has(cleaned)) return false
// Skip if this is the metadata image (shown separately)
if (metadataImageUrl && cleaned === metadataImageUrl && !hideImagesAndInfo) return false
// Skip if this matches the parent publication's image (to avoid duplicate cover images)
if (parentImageUrlCleaned && cleaned === parentImageUrlCleaned) return false
return true
})
}, [tagMedia, mediaUrlsInContent, metadata.image, hideImagesAndInfo])
}, [tagMedia, mediaUrlsInContent, metadata.image, hideImagesAndInfo, parentImageUrl])
// Filter tag YouTube URLs to only show what's not in content
const leftoverTagYouTubeUrls = useMemo(() => {
@ -1907,10 +1912,15 @@ export default function AsciidocArticle({ @@ -1907,10 +1912,15 @@ export default function AsciidocArticle({
{/* Metadata image */}
{!hideImagesAndInfo && metadata.image && (() => {
const cleanedMetadataImage = cleanUrl(metadata.image)
const parentImageUrlCleaned = parentImageUrl ? cleanUrl(parentImageUrl) : null
// Don't show if already in content
if (cleanedMetadataImage && mediaUrlsInContent.has(cleanedMetadataImage)) {
return null
}
// Don't show if it matches the parent publication's image (to avoid duplicate cover images)
if (parentImageUrlCleaned && cleanedMetadataImage === parentImageUrlCleaned) {
return null
}
const metadataImageIndex = imageIndexMap.get(cleanedMetadataImage)

14
src/components/Note/MarkdownArticle/MarkdownArticle.tsx

@ -3022,11 +3022,13 @@ function parseInlineMarkdown(text: string, keyPrefix: string, _footnotes: Map<st @@ -3022,11 +3022,13 @@ function parseInlineMarkdown(text: string, keyPrefix: string, _footnotes: Map<st
export default function MarkdownArticle({
event,
className,
hideMetadata = false
hideMetadata = false,
parentImageUrl
}: {
event: Event
className?: string
hideMetadata?: boolean
parentImageUrl?: string
}) {
const { push } = useSecondaryPage()
const { navigateToHashtag } = useSmartHashtagNavigation()
@ -3273,6 +3275,7 @@ export default function MarkdownArticle({ @@ -3273,6 +3275,7 @@ export default function MarkdownArticle({
// Filter tag media to only show what's not in content
const leftoverTagMedia = useMemo(() => {
const metadataImageUrl = metadata.image ? cleanUrl(metadata.image) : null
const parentImageUrlCleaned = parentImageUrl ? cleanUrl(parentImageUrl) : null
return tagMedia.filter(media => {
const cleaned = cleanUrl(media.url)
if (!cleaned) return false
@ -3286,9 +3289,12 @@ export default function MarkdownArticle({ @@ -3286,9 +3289,12 @@ export default function MarkdownArticle({
// Skip if this is the metadata image (shown separately)
if (metadataImageUrl && cleaned === metadataImageUrl && !hideMetadata) return false
// Skip if this matches the parent publication's image (to avoid duplicate cover images)
if (parentImageUrlCleaned && cleaned === parentImageUrlCleaned) return false
return true
})
}, [tagMedia, mediaUrlsInContent, metadata.image, hideMetadata])
}, [tagMedia, mediaUrlsInContent, metadata.image, hideMetadata, parentImageUrl])
// Filter tag YouTube URLs to only show what's not in content
const leftoverTagYouTubeUrls = useMemo(() => {
@ -3482,6 +3488,7 @@ export default function MarkdownArticle({ @@ -3482,6 +3488,7 @@ export default function MarkdownArticle({
{/* Metadata image */}
{!hideMetadata && metadata.image && (() => {
const cleanedMetadataImage = cleanUrl(metadata.image)
const parentImageUrlCleaned = parentImageUrl ? cleanUrl(parentImageUrl) : null
// Don't show if already in content (check by URL and by identifier)
if (cleanedMetadataImage) {
if (mediaUrlsInContent.has(cleanedMetadataImage)) return null
@ -3489,6 +3496,9 @@ export default function MarkdownArticle({ @@ -3489,6 +3496,9 @@ export default function MarkdownArticle({
if (identifier && mediaUrlsInContent.has(`__img_id:${identifier}`)) return null
}
// Don't show if it matches the parent publication's image (to avoid duplicate cover images)
if (parentImageUrlCleaned && cleanedMetadataImage === parentImageUrlCleaned) return null
const metadataImageIndex = imageIndexMap.get(cleanedMetadataImage)
return (

32
src/components/Note/PublicationIndex/PublicationIndex.tsx

@ -15,6 +15,7 @@ import { isReplaceableEvent } from '@/lib/event' @@ -15,6 +15,7 @@ import { isReplaceableEvent } from '@/lib/event'
import { useSecondaryPage } from '@/PageManager'
import { extractBookMetadata } from '@/lib/bookstr-parser'
import { dTagToTitleCase } from '@/lib/event-metadata'
import Image from '@/components/Image'
interface PublicationReference {
coordinate?: string
@ -49,11 +50,13 @@ interface PublicationMetadata { @@ -49,11 +50,13 @@ interface PublicationMetadata {
export default function PublicationIndex({
event,
className,
isNested = false
isNested = false,
parentImageUrl
}: {
event: Event
className?: string
isNested?: boolean
parentImageUrl?: string
}) {
const { push } = useSecondaryPage()
// Parse publication metadata from event tags
@ -1341,6 +1344,19 @@ export default function PublicationIndex({ @@ -1341,6 +1344,19 @@ export default function PublicationIndex({
<p className="break-words">{metadata.summary}</p>
</blockquote>
)}
{/* Display image for top-level 30040 publication */}
{metadata.image && (
<div className="mb-4">
<Image
image={{ url: metadata.image, pubkey: event.pubkey }}
className="max-w-[400px] w-full h-auto rounded-lg"
classNames={{
wrapper: 'rounded-lg',
errorPlaceholder: 'aspect-square h-[30vh]'
}}
/>
</div>
)}
<div className="text-sm text-muted-foreground space-y-1">
{metadata.author && (
<div>
@ -1538,6 +1554,8 @@ export default function PublicationIndex({ @@ -1538,6 +1554,8 @@ export default function PublicationIndex({
if (eventKind === ExtendedKind.PUBLICATION) {
// Recursively render nested 30040 publication index
// Use the top-level publication's image as parent for nested publications
const effectiveParentImageUrl = !isNested ? metadata.image : parentImageUrl
return (
<div key={index} id={sectionId} className="border-l-4 border-primary pl-6 scroll-mt-24 pt-6 relative">
{!isNested && (
@ -1552,11 +1570,14 @@ export default function PublicationIndex({ @@ -1552,11 +1570,14 @@ export default function PublicationIndex({
ToC
</Button>
)}
<PublicationIndex event={ref.event} isNested={true} />
<PublicationIndex event={ref.event} isNested={true} parentImageUrl={effectiveParentImageUrl} />
</div>
)
} else if (eventKind === ExtendedKind.PUBLICATION_CONTENT || eventKind === ExtendedKind.WIKI_ARTICLE) {
// Render 30041 or 30818 content as AsciidocArticle
// Pass parent image URL to avoid showing duplicate cover images
// Use the top-level publication's image as parent, or the passed parentImageUrl for nested publications
const effectiveParentImageUrl = !isNested ? metadata.image : parentImageUrl
return (
<div key={index} id={sectionId} className="scroll-mt-24 pt-6 relative">
{!isNested && (
@ -1571,11 +1592,14 @@ export default function PublicationIndex({ @@ -1571,11 +1592,14 @@ export default function PublicationIndex({
ToC
</Button>
)}
<AsciidocArticle event={ref.event} hideImagesAndInfo={true} />
<AsciidocArticle event={ref.event} hideImagesAndInfo={true} parentImageUrl={effectiveParentImageUrl} />
</div>
)
} else if (eventKind === ExtendedKind.WIKI_ARTICLE_MARKDOWN) {
// Render 30817 content as MarkdownArticle
// Pass parent image URL to avoid showing duplicate cover images
// Use the top-level publication's image as parent, or the passed parentImageUrl for nested publications
const effectiveParentImageUrl = !isNested ? metadata.image : parentImageUrl
return (
<div key={index} id={sectionId} className="scroll-mt-24 pt-6 relative">
{!isNested && (
@ -1590,7 +1614,7 @@ export default function PublicationIndex({ @@ -1590,7 +1614,7 @@ export default function PublicationIndex({
ToC
</Button>
)}
<MarkdownArticle event={ref.event} hideMetadata={true} />
<MarkdownArticle event={ref.event} hideMetadata={true} parentImageUrl={effectiveParentImageUrl} />
</div>
)
} else {

Loading…
Cancel
Save