지면이 다 되면 셰어카드를 뽑는다. 선수마다 1080×1350 한 장과 캡션 파일 하나다. 인스타 피드가 가장 크게 싣는 세로비가 4:5라 그 치수로 뒀다. 올리는 일은 손으로 한다.
카드를 새로 디자인하지는 않았다. /baseball 인덱스에 서 있는 트레이딩 카드를 그대로 옮겼다. 사이트에서 뽑은 카드가 손에 쥔 한 장이 되게 하고 싶었다. 같은 4:5 초상, 같은 팀색, 같은 배지.
그래서 규칙을 다시 구현하지 않았다. 팀 팔레트와 카드 파생값과 대표 초상은 velite가 빌드할 때 확정해서 싣고, 생성기는 그 값을 읽기만 한다. 규칙을 두 번 적으면 카드가 사이트와 어긋나는 날이 오고, 그때 이미 올라간 카드는 못 고친다.
전시품은 레코드에서 뽑는다. 프론트매터의 요약 묶음에서 안 읽는다. 그 요약에는 위업 자리가 없어서, 요약을 읽으면 노히터가 카드에 못 올라간다.
선반을 줄여서 싣는다
카드도 지면과 같은 선반을 쓴다. 선반마다 한 줄, 한 줄에 세 항목까지, 마일스톤 스탬프는 넷까지.
두 선반은 카드에 안 올린다. 시즌 클럽은 가장 잘게 쪼갠 층이라 지면의 것이다. 시대의 상은 다른 이유로 뺐다. 그걸 올리면 데드볼 카드가 TSN 올스타×14 하나에 먹힌다. 지금 읽는 사람이 무게를 가늠할 수 없는 자격이고, 시대에 묶여 있어서 모든 선수에게 같게 읽히라고 만든 기준을 깬다.
코드 둘도 뺐다. 명예의 전당은 두 카드가 이미 금색 인장을 찍고 있어서 칩으로 또 적으면 같은 사실이 두 번 실린다. 페넌트는 WS · 페넌트가 같은 말로 읽힌다. 반지와 페넌트의 차이는 실재하는데, 그건 지면에서 읽을 것이고 카드에서 읽을 것은 아니다.
한 줄 안의 순서
같은 줄 안에서 무엇을 앞에 둘지도 정해야 했다.
수상은 종류에 위계가 있다. 월드시리즈가 페넌트보다 위고 MVP가 올스타 선정보다 위다. 레지스트리에 적힌 순서를 그대로 쓴다. 횟수로만 정렬하면 페넌트×10이 WS×7 앞에 서고, 카드가 거짓말을 한다.
타이틀은 위계가 없다. 홈런왕이 타격왕보다 위일 이유가 없다. 횟수가 정하고, 그 선수의 가장 요란한 왕관이 앞에 선다.
타이틀 줄을 합계로 안 접는다. 타이틀×38은 읽는 사람이 쓸 수 있는 정보가 아니다. 홈런왕×12는 그 사람 자체다.
줄머리에 이름 대신 아이콘을 둔다
줄머리에 선반 이름을 안 적고 아이콘을 둔다. 카드의 너비를 칩에 쓰고, 뜻은 지면이 쓰는 도상이 지게 했다. 지면의 전시대가 쓰는 것과 같은 모양이다. 마일스톤 줄에만 아이콘을 하나 새로 만들었다. 동심원인데, 그 아래에 찍히는 각인 스탬프를 되울린 모양이다.
여기서 한 번 막혔다. 아이콘이 카드에서 아예 안 그려졌다.
원인은 필터였다. 지면의 아이콘이 비뚤한 선을 내려고 SVG 필터를 참조하는데, 그 필터는 지면의 <defs>에만 있다. 없는 필터를 참조하는 SVG는 조금 이상하게 그려지는 게 아니라 통째로 안 그려진다. 그래서 카드 변형은 필터를 끄고, 셰어카드 생성기는 같은 도형을 필터 없이 다시 그린다.
마일스톤은 칩으로 안 바꾸고 각인 스탬프로 남겼다. 그 모양이 그 기록이 무엇인지의 일부다.
손글씨 글자가 이름 중간에서 갈렸다
초상은 테이프를 붙인 폴라로이드 안에 서고, 그 여백에 한글 이름이 손글씨로 들어간다.
사이트가 서빙하는 손글씨 폰트는 리뷰 본문에 맞춰 503자만 남긴 것이다. 거기 없는 음절이 나오면 명조로 폴백해서 이름 한가운데서 서체가 갈린다. 카드는 어떤 선수가 큐에 들어올지 모른 채 발행되니 그 503자로는 감당이 안 된다. 카드만 원본 폰트를 base64로 심는다.
브랜드는 ∅ 마크 하나가 진다. 워드마크도 주소도 안 올린다. 쓸 수 있는 사진이 없는 선수는 같은 프레임에 그린 실루엣과 미공개 초상이라는 표기가 들어간다.
저작자 표시는 캡션에 싣는다
카드 면에는 크레딧을 안 얹는다. 지면을 어지럽히는 것도 있지만, 카드는 한 장의 그림으로 읽히는 게 일이라 그렇다.
라이선스가 요구하는 건 함께 나가는 캡션 파일에 싣는다. 저작자 표시가 필요한 라이선스는 크레딧과 출처 주소를 적는다. 동일조건변경허락인 사진을 쓴 카드는 그 카드 자체가 같은 조건으로 배포된다는 사실을 한국어로 적는다. 동일조건 사진을 합성하면 카드가 2차적 저작물이 된다. 받아들였고 피해 가지 않았다.
퍼블릭 도메인이나 CC0, 알려진 제한 없음인 사진은 크레딧 줄이 없다. 의무가 없으니 캡션이 그만큼 짧아진다. 없는 의무를 지키는 척하지 않는다.
// 카드에 올릴 수 있는 사진 라이선스 = velite PHOTO_LICENSES와 같은 목록(정직성 백스톱).
// 스키마가 이미 거르지만 카드는 사이트와 다른 배포물이라 허용 목록을 스스로 물어야 한다 —
// 목록 밖 라이선스가 닿으면 렌더하지 않고 멈춘다.
const CARD_LICENSES = new Set(['PD', 'CC0', 'No-known-restrictions', 'CC-BY', 'CC-BY-SA'])
목록을 두 번 적은 셈인데 일부러 그랬다. 스키마가 거르는 건 사이트에 실리는 자산이고, 카드는 인스타로 나가는 다른 배포물이다. 자기 배포물의 조건은 자기가 묻는 게 맞다고 봤다.
캡션은 별명으로 연다
캡션 첫 줄을 무엇으로 열지에서 한 번 바꿨다.
처음에는 이름 아래 한 줄을 그대로 썼다. 그런데 그 줄은 이미 카드 면에 인쇄돼 있다. 피드에서 카드와 캡션이 같은 말로 두 번 시작한다.
그래서 별명으로 열게 했다. 피드는 판단보다 이름을 먼저 읽는다. 그다음에 지면 주소와 태그가 온다. 별명이 없는 선수는 한 줄로 연다.
연재 번호를 다시 매기지 않는다
카드에 연재 번호가 No.004로 찍힌다. 데뷔 연도와 다른 축이다. 진열대는 커리어 순서로 서고, 번호는 쓴 순서를 센다.
목록의 위치로 번호를 매기면 데드볼 선수를 하나 새로 넣을 때 그 뒤의 카드가 전부 다시 번호를 받는다. 이미 올린 셰어카드가 그날부터 틀린 번호를 달고 있게 된다. 그래서 번호는 프론트매터에 적어 고정하고, 중복이면 빌드가 막는다. 중간이 비는 건 괜찮다.