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 {
export default function AsciidocArticle({ export default function AsciidocArticle({
event, event,
className, className,
hideImagesAndInfo = false hideImagesAndInfo = false,
parentImageUrl
}: { }: {
event: Event event: Event
className?: string className?: string
hideImagesAndInfo?: boolean hideImagesAndInfo?: boolean
parentImageUrl?: string
}) { }) {
const { push } = useSecondaryPage() const { push } = useSecondaryPage()
const { navigateToHashtag } = useSmartHashtagNavigation() const { navigateToHashtag } = useSmartHashtagNavigation()
@ -560,6 +562,7 @@ export default function AsciidocArticle({
// Filter tag media to only show what's not in content // Filter tag media to only show what's not in content
const leftoverTagMedia = useMemo(() => { const leftoverTagMedia = useMemo(() => {
const metadataImageUrl = metadata.image ? cleanUrl(metadata.image) : null const metadataImageUrl = metadata.image ? cleanUrl(metadata.image) : null
const parentImageUrlCleaned = parentImageUrl ? cleanUrl(parentImageUrl) : null
return tagMedia.filter(media => { return tagMedia.filter(media => {
const cleaned = cleanUrl(media.url) const cleaned = cleanUrl(media.url)
if (!cleaned) return false if (!cleaned) return false
@ -567,9 +570,11 @@ export default function AsciidocArticle({
if (mediaUrlsInContent.has(cleaned)) return false if (mediaUrlsInContent.has(cleaned)) return false
// Skip if this is the metadata image (shown separately) // Skip if this is the metadata image (shown separately)
if (metadataImageUrl && cleaned === metadataImageUrl && !hideImagesAndInfo) return false 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 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 // Filter tag YouTube URLs to only show what's not in content
const leftoverTagYouTubeUrls = useMemo(() => { const leftoverTagYouTubeUrls = useMemo(() => {
@ -1907,10 +1912,15 @@ export default function AsciidocArticle({
{/* Metadata image */} {/* Metadata image */}
{!hideImagesAndInfo && metadata.image && (() => { {!hideImagesAndInfo && metadata.image && (() => {
const cleanedMetadataImage = cleanUrl(metadata.image) const cleanedMetadataImage = cleanUrl(metadata.image)
const parentImageUrlCleaned = parentImageUrl ? cleanUrl(parentImageUrl) : null
// Don't show if already in content // Don't show if already in content
if (cleanedMetadataImage && mediaUrlsInContent.has(cleanedMetadataImage)) { if (cleanedMetadataImage && mediaUrlsInContent.has(cleanedMetadataImage)) {
return null 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) 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
export default function MarkdownArticle({ export default function MarkdownArticle({
event, event,
className, className,
hideMetadata = false hideMetadata = false,
parentImageUrl
}: { }: {
event: Event event: Event
className?: string className?: string
hideMetadata?: boolean hideMetadata?: boolean
parentImageUrl?: string
}) { }) {
const { push } = useSecondaryPage() const { push } = useSecondaryPage()
const { navigateToHashtag } = useSmartHashtagNavigation() const { navigateToHashtag } = useSmartHashtagNavigation()
@ -3273,6 +3275,7 @@ export default function MarkdownArticle({
// Filter tag media to only show what's not in content // Filter tag media to only show what's not in content
const leftoverTagMedia = useMemo(() => { const leftoverTagMedia = useMemo(() => {
const metadataImageUrl = metadata.image ? cleanUrl(metadata.image) : null const metadataImageUrl = metadata.image ? cleanUrl(metadata.image) : null
const parentImageUrlCleaned = parentImageUrl ? cleanUrl(parentImageUrl) : null
return tagMedia.filter(media => { return tagMedia.filter(media => {
const cleaned = cleanUrl(media.url) const cleaned = cleanUrl(media.url)
if (!cleaned) return false if (!cleaned) return false
@ -3286,9 +3289,12 @@ export default function MarkdownArticle({
// Skip if this is the metadata image (shown separately) // Skip if this is the metadata image (shown separately)
if (metadataImageUrl && cleaned === metadataImageUrl && !hideMetadata) return false 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 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 // Filter tag YouTube URLs to only show what's not in content
const leftoverTagYouTubeUrls = useMemo(() => { const leftoverTagYouTubeUrls = useMemo(() => {
@ -3482,6 +3488,7 @@ export default function MarkdownArticle({
{/* Metadata image */} {/* Metadata image */}
{!hideMetadata && metadata.image && (() => { {!hideMetadata && metadata.image && (() => {
const cleanedMetadataImage = cleanUrl(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) // Don't show if already in content (check by URL and by identifier)
if (cleanedMetadataImage) { if (cleanedMetadataImage) {
if (mediaUrlsInContent.has(cleanedMetadataImage)) return null if (mediaUrlsInContent.has(cleanedMetadataImage)) return null
@ -3489,6 +3496,9 @@ export default function MarkdownArticle({
if (identifier && mediaUrlsInContent.has(`__img_id:${identifier}`)) return null 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) const metadataImageIndex = imageIndexMap.get(cleanedMetadataImage)
return ( return (

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

@ -15,6 +15,7 @@ import { isReplaceableEvent } from '@/lib/event'
import { useSecondaryPage } from '@/PageManager' import { useSecondaryPage } from '@/PageManager'
import { extractBookMetadata } from '@/lib/bookstr-parser' import { extractBookMetadata } from '@/lib/bookstr-parser'
import { dTagToTitleCase } from '@/lib/event-metadata' import { dTagToTitleCase } from '@/lib/event-metadata'
import Image from '@/components/Image'
interface PublicationReference { interface PublicationReference {
coordinate?: string coordinate?: string
@ -49,11 +50,13 @@ interface PublicationMetadata {
export default function PublicationIndex({ export default function PublicationIndex({
event, event,
className, className,
isNested = false isNested = false,
parentImageUrl
}: { }: {
event: Event event: Event
className?: string className?: string
isNested?: boolean isNested?: boolean
parentImageUrl?: string
}) { }) {
const { push } = useSecondaryPage() const { push } = useSecondaryPage()
// Parse publication metadata from event tags // Parse publication metadata from event tags
@ -1341,6 +1344,19 @@ export default function PublicationIndex({
<p className="break-words">{metadata.summary}</p> <p className="break-words">{metadata.summary}</p>
</blockquote> </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"> <div className="text-sm text-muted-foreground space-y-1">
{metadata.author && ( {metadata.author && (
<div> <div>
@ -1538,6 +1554,8 @@ export default function PublicationIndex({
if (eventKind === ExtendedKind.PUBLICATION) { if (eventKind === ExtendedKind.PUBLICATION) {
// Recursively render nested 30040 publication index // 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 ( return (
<div key={index} id={sectionId} className="border-l-4 border-primary pl-6 scroll-mt-24 pt-6 relative"> <div key={index} id={sectionId} className="border-l-4 border-primary pl-6 scroll-mt-24 pt-6 relative">
{!isNested && ( {!isNested && (
@ -1552,11 +1570,14 @@ export default function PublicationIndex({
ToC ToC
</Button> </Button>
)} )}
<PublicationIndex event={ref.event} isNested={true} /> <PublicationIndex event={ref.event} isNested={true} parentImageUrl={effectiveParentImageUrl} />
</div> </div>
) )
} else if (eventKind === ExtendedKind.PUBLICATION_CONTENT || eventKind === ExtendedKind.WIKI_ARTICLE) { } else if (eventKind === ExtendedKind.PUBLICATION_CONTENT || eventKind === ExtendedKind.WIKI_ARTICLE) {
// Render 30041 or 30818 content as AsciidocArticle // 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 ( return (
<div key={index} id={sectionId} className="scroll-mt-24 pt-6 relative"> <div key={index} id={sectionId} className="scroll-mt-24 pt-6 relative">
{!isNested && ( {!isNested && (
@ -1571,11 +1592,14 @@ export default function PublicationIndex({
ToC ToC
</Button> </Button>
)} )}
<AsciidocArticle event={ref.event} hideImagesAndInfo={true} /> <AsciidocArticle event={ref.event} hideImagesAndInfo={true} parentImageUrl={effectiveParentImageUrl} />
</div> </div>
) )
} else if (eventKind === ExtendedKind.WIKI_ARTICLE_MARKDOWN) { } else if (eventKind === ExtendedKind.WIKI_ARTICLE_MARKDOWN) {
// Render 30817 content as MarkdownArticle // 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 ( return (
<div key={index} id={sectionId} className="scroll-mt-24 pt-6 relative"> <div key={index} id={sectionId} className="scroll-mt-24 pt-6 relative">
{!isNested && ( {!isNested && (
@ -1590,7 +1614,7 @@ export default function PublicationIndex({
ToC ToC
</Button> </Button>
)} )}
<MarkdownArticle event={ref.event} hideMetadata={true} /> <MarkdownArticle event={ref.event} hideMetadata={true} parentImageUrl={effectiveParentImageUrl} />
</div> </div>
) )
} else { } else {

Loading…
Cancel
Save