gze1206.net

헤딩 앵커·목차 픽스처 (.md)

헤딩 id · 앵커 · 목차 · 읽기 시간이 .md 렌더 경로에서 어떻게 나오는지 확인하는 픽스처 글입니다.

(수정 )읽는 시간 dev

이 글은 .md 렌더 경로(remark/rehype)의 헤딩 처리를 확인하기 위한 픽스처입니다. 같은 내용을 Markdoc 으로 쓴 .mdoc 판과 산출물이 같아야 합니다. 두 경로는 렌더러가 완전히 다르기 때문에, 한쪽만 보고 “됐다”고 판단하면 나머지 한쪽이 조용히 깨진 채로 배포됩니다. 그래서 같은 본문을 두 확장자로 나란히 두고 비교합니다.

설치하기

한글 헤딩은 한글 id 를 갖습니다. 카테고리·태그 슬러그와 같은 규칙을 씁니다. 영문 대문자는 소문자로 내려가고, 공백은 하이픈으로 합쳐지며, 유니코드 문자는 그대로 보존됩니다. #+ 같은 기호는 프로그래밍 언어 이름을 살리려고 음차합니다. 그래서 이 규칙으로 만들어진 주소는 브라우저 주소창에서 사람이 읽을 수 있는 형태로 남습니다.

헤딩 id 는 한 번 공개되면 남이 저장해 둔 링크가 되기 때문에, 규칙을 나중에 바꾸면 그 링크들이 조용히 깨집니다. 그래서 규칙을 라이브러리 기본값에 맡기지 않고 저장소 안에 고정해 두고, 두 렌더 경로가 같은 함수 하나만 쓰도록 묶어 두었습니다.

요구 사항

h3 는 목차에서 바로 앞 h2 아래로 들어갑니다. 목차의 깊이는 두 단계까지만 씁니다. 더 깊은 헤딩까지 담으면 목차가 본문만큼 길어져서, 훑어보기라는 목적 자체를 잃습니다.

더 깊은 헤딩

h4 부터는 앵커는 붙지만 목차에는 담지 않습니다. 앵커가 붙어 있으므로 직접 주소를 공유하는 것은 여전히 가능합니다.

설치하기

같은 텍스트의 헤딩이 두 번 나오는 경우입니다. 두 번째는 -2 가 붙어야 합니다. 중복 id 는 앵커 이동을 망가뜨리고 HTML 유효성도 깨뜨리기 때문에, 문서 안에서 등장 순서에 따라 결정적으로 유일화합니다. 같은 글을 다시 빌드해도 결과는 항상 같습니다.

C# 예제

기호가 섞인 헤딩입니다. C#c-sharp 로 음차합니다. 기호를 그냥 버리면 C#C 가 같은 주소로 합쳐져서, 서로 다른 절이 같은 링크를 갖게 됩니다.

var span = stackalloc int[4];
span[0] = 1;

코드블럭은 읽기 시간 계산에서 산문과 다르게 셉니다. 사람은 코드를 문장처럼 읽지 않고 훑기 때문에, 글자 수가 아니라 줄 수로 세고 블럭당 상한을 둡니다.

???

슬러그로 바꿀 수 없는 헤딩입니다. 빌드를 세우지 않고 대체 id 를 씁니다. 헤딩 하나가 기호뿐이라는 이유로 글 전체 빌드를 실패시키는 것은 과한 처사입니다.