From 403c846d3347773044974a3d24d1e40c3174c06d Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Tue, 4 Feb 2025 20:43:27 -0600 Subject: [PATCH] Improve/streamline camera text formatting --- __tests__/camera.test.ts | 19 +++++---- src/camera/index.ts | 40 +++++++++++-------- src/image-response/CameraImageResponse.tsx | 1 - .../FocalLengthImageResponse.tsx | 2 +- src/image-response/PhotoImageResponse.tsx | 4 +- src/image-response/TagImageResponse.tsx | 3 +- .../components/ImageCaption.tsx | 33 +++++++++------ 7 files changed, 60 insertions(+), 42 deletions(-) diff --git a/__tests__/camera.test.ts b/__tests__/camera.test.ts index 5edda712..03b8181b 100644 --- a/__tests__/camera.test.ts +++ b/__tests__/camera.test.ts @@ -14,19 +14,24 @@ const RICOH : Camera = { describe('Camera', () => { it('labels full text correctly', () => { expect(formatCameraText(APPLE)).toBe('iPhone 11 Pro'); - expect(formatCameraText(APPLE, 'always')).toBe('Apple iPhone 11 Pro'); - expect(formatCameraText(APPLE, 'if-not-apple')).toBe('iPhone 11 Pro'); - expect(formatCameraText(APPLE, 'never')).toBe('iPhone 11 Pro'); + expect(formatCameraText(APPLE, 'long')).toBe('Apple iPhone 11 Pro'); + expect(formatCameraText(APPLE, 'medium')).toBe('iPhone 11 Pro'); + expect(formatCameraText(APPLE, 'short')).toBe('11 Pro'); expect(formatCameraText(FUJIFILM)).toBe('Fujifilm X-T5'); expect(formatCameraText(CANON)).toBe('Canon EOS 800D'); + expect(formatCameraText(NIKON, 'long')) + .toBe('Nikon Corporation Nikon D7000'); expect(formatCameraText(NIKON)).toBe('Nikon D7000'); expect(formatCameraText(RICOH)).toBe('RICOH GR III'); }); it('labels models correctly', () => { - expect(formatCameraText(APPLE, 'never')).toBe('iPhone 11 Pro'); - expect(formatCameraText(APPLE, 'never', true)).toBe('11 Pro'); - expect(formatCameraText(APPLE_01, 'never', true)).toBe('iPhone 11'); - expect(formatCameraText(APPLE_02, 'never', true)).toBe('15 Pro Max'); + expect(formatCameraText(APPLE, 'medium')).toBe('iPhone 11 Pro'); + expect(formatCameraText(APPLE, 'short')).toBe('11 Pro'); + expect(formatCameraText(APPLE_01, 'short')).toBe('iPhone 11'); + expect(formatCameraText(APPLE_02, 'short')).toBe('15 Pro Max'); + expect(formatCameraText(FUJIFILM, 'short')).toBe('X-T5'); + expect(formatCameraText(RICOH, 'short')).toBe('GR III'); + expect(formatCameraText(NIKON, 'short')).toBe('D7000'); }); }); diff --git a/src/camera/index.ts b/src/camera/index.ts index 60bd7e0c..d909e972 100644 --- a/src/camera/index.ts +++ b/src/camera/index.ts @@ -57,8 +57,11 @@ export const cameraFromPhoto = ( export const formatCameraText = ( { make, model: modelRaw }: Camera, - includeMake: 'always' | 'never' | 'if-not-apple' = 'if-not-apple', - removeIPhoneOnLongModels?: boolean, + length: + 'long' | // Unmodified make and model + 'medium' | // Make and model, with modifiers removed + 'short' // Model only + = 'medium', ) => { // Capture simple make without modifiers like 'Corporation' or 'Company' const makeSimple = make.match(/^(\S+)/)?.[1]; @@ -67,20 +70,23 @@ export const formatCameraText = ( modelRaw.toLocaleLowerCase().startsWith(makeSimple.toLocaleLowerCase()) ); let model = modelRaw; - if ( - removeIPhoneOnLongModels && - model.includes('iPhone') && - model.length > 9 - ) { - model = model.replace(/iPhone\s*/i, ''); + switch (length) { + case 'long': + return `${make} ${model}`; + case 'medium': + return doesModelStartWithMake || make === 'Apple' + ? model + : `${make} ${model}`; + case 'short': + model = doesModelStartWithMake + ? model.replace(makeSimple, '').trim() + : model; + if ( + model.includes('iPhone') && + model.length > 9 + ) { + model = model.replace(/iPhone\s*/i, ''); + } + return model; } - return ( - includeMake === 'never' || - doesModelStartWithMake || - (includeMake === 'if-not-apple' && make === 'Apple') - ) ? model - : `${make} ${model}`; }; - -export const formatCameraModelTextShort = (camera: Camera) => - formatCameraText(camera, 'never', true); diff --git a/src/image-response/CameraImageResponse.tsx b/src/image-response/CameraImageResponse.tsx index e698bd0a..0ec26f6f 100644 --- a/src/image-response/CameraImageResponse.tsx +++ b/src/image-response/CameraImageResponse.tsx @@ -40,7 +40,6 @@ export default function CameraImageResponse({ icon: , diff --git a/src/image-response/FocalLengthImageResponse.tsx b/src/image-response/FocalLengthImageResponse.tsx index d2435272..fc78c4a1 100644 --- a/src/image-response/FocalLengthImageResponse.tsx +++ b/src/image-response/FocalLengthImageResponse.tsx @@ -39,7 +39,7 @@ export default function FocalLengthImageResponse({ icon: , diff --git a/src/image-response/PhotoImageResponse.tsx b/src/image-response/PhotoImageResponse.tsx index 943188a9..c636527f 100644 --- a/src/image-response/PhotoImageResponse.tsx +++ b/src/image-response/PhotoImageResponse.tsx @@ -5,7 +5,7 @@ import ImagePhotoGrid from './components/ImagePhotoGrid'; import ImageContainer from './components/ImageContainer'; import { OG_TEXT_BOTTOM_ALIGNMENT } from '@/site/config'; import { NextImageSize } from '@/services/next-image'; -import { cameraFromPhoto, formatCameraModelTextShort } from '@/camera'; +import { cameraFromPhoto, formatCameraText } from '@/camera'; export default function PhotoImageResponse({ photo, @@ -22,7 +22,7 @@ export default function PhotoImageResponse({ }) { const caption = [ photo.model - ? formatCameraModelTextShort(cameraFromPhoto(photo)) + ? formatCameraText(cameraFromPhoto(photo), 'short') : undefined, photo.focalLengthFormatted, photo.fNumberFormatted, diff --git a/src/image-response/TagImageResponse.tsx b/src/image-response/TagImageResponse.tsx index fe895823..df63269c 100644 --- a/src/image-response/TagImageResponse.tsx +++ b/src/image-response/TagImageResponse.tsx @@ -40,7 +40,6 @@ export default function TagImageResponse({ ? , diff --git a/src/image-response/components/ImageCaption.tsx b/src/image-response/components/ImageCaption.tsx index 498136c3..f025b837 100644 --- a/src/image-response/components/ImageCaption.tsx +++ b/src/image-response/components/ImageCaption.tsx @@ -28,7 +28,7 @@ export default function ImageCaption({ fontFamily, fontSize: height *.08, gap: '1rem', // Mimic mono font space metric - lineHeight: 1, + lineHeight: 1.2, left: 0, right: 0, ...OG_TEXT_BOTTOM_ALIGNMENT @@ -45,17 +45,26 @@ export default function ImageCaption({ top: 0, }, }}> - {icon} -
- {children} +
+ {icon} +
+ {children} +
);