본문 바로가기
스크립트

티스토리 북클럽 스킨 목차 자동 생성 스크립트

by treeview_officail 2025. 8. 5.

티스토리 북클럽 스킨 목차 자동 생성 스크립트

티스토리 북클럽 스킨에서 본문 내용의 제목 태그(h2, h3, h4)를 자동으로 감지하여, 페이지 상단에 목차(TOC)를 생성하는 JavaScript 스크립트입니다.

개요

이 스크립트는 티스토리 북클럽 스킨의 특정 본문 영역(.entry-content > .tt_article_useless_p_margin)을 선택하여, 그 안에 있는 h2, h3, h4 태그를 찾아냅니다. 각 제목 태그에 고유한 ID를 부여하고, 제목 텍스트를 추출하여 동적으로 목차를 생성합니다. 생성된 목차는 본문 내용의 가장 첫 부분에 삽입됩니다.

참고

이 스크립트는 HTML과 CSS를 따로 수정할 필요 없이, 티스토리 스킨의 script.js 파일이나 별도의 JavaScript 파일에 추가하여 사용할 수 있습니다.

코드 분석

제공된 JavaScript 코드를 각 부분별로 자세히 설명합니다.

변수 및 상수 정의

목차 생성에 필요한 변수와 상수를 초기화합니다.

JavaScript
let arr_id = [];
let arr_title = [];
const headers = ['h2', 'h3', 'h4'];
const contentElement = document.querySelector('.entry-content > .tt_article_useless_p_margin');
  • arr_id, arr_title: 제목 태그의 ID와 텍스트를 저장할 배열입니다.
  • headers: 목차로 만들 HTML 제목 태그를 정의합니다.
  • contentElement: 스크립트가 동작할 본문 영역을 선택합니다.
제목 태그 찾기 및 ID 부여

지정된 제목 태그를 찾아서 고유 ID를 부여하고, ID와 제목을 배열에 저장합니다.

JavaScript
headers.forEach(tag => {
    const elements = contentElement.querySelectorAll(tag);
    elements.forEach((element, index) => {
        const newId = ${tag}${index};
        element.id = newId;
        arr_id.push(newId);
        arr_title.push(element.innerText);
    });
});
  • forEach: headers 배열을 순회하며 각 제목 태그(h2, h3, h4)를 처리합니다.
  • querySelectorAll(tag): 현재 처리 중인 제목 태그를 모두 찾아냅니다.
  • element.id = newId: h20, h31 등 고유한 ID를 부여하여 목차 링크가 이동할 기준점을 만듭니다.
목차 HTML 생성 및 삽입

저장된 ID와 제목으로 HTML 목차 리스트를 만들고, 본문 맨 앞에 삽입합니다.

JavaScript
const liItems = arr_id.map((id, index) =>
    `<li><a href="#${id}">${arr_title[index]}</a></li>`
).join("");
const tocList = <ul class="list_box_de">${liItems}</ul>;
contentElement.insertAdjacentHTML('afterbegin', tocList);
  • map, join: arr_id 배열을 순회하며 <li><a> 형태의 HTML 문자열을 생성하고, 이를 합쳐 하나의 문자열로 만듭니다.
  • insertAdjacentHTML('afterbegin', ...): contentElement의 시작 부분에 생성된 목차 HTML을 삽입합니다.

사용 예제

아래 코드를 티스토리 스킨 편집기의 HTML 탭 맨 아래 <script> 태그 내부에 붙여넣으면 됩니다. 이 스크립트는 페이지 로드 후 자동으로 실행됩니다.

HTML
<!-- 스킨 편집기 </HTML> 바로 앞에 추가 -->
<script>
    window.onload = function() {
        let arr_id = [];
        let arr_title = [];
        const headers = ['h2', 'h3', 'h4'];
        const contentElement = document.querySelector('.entry-content > .tt_article_useless_p_margin');

        if (contentElement) {
            headers.forEach(tag => {
                const elements = contentElement.querySelectorAll(tag);
                elements.forEach((element, index) => {
                    const newId = ${tag}${index};
                    element.id = newId;
                    arr_id.push(newId);
                    arr_title.push(element.innerText);
                });
            });

            const liItems = arr_id.map((id, index) =>
                `<li><a href="#${id}">${arr_title[index]}</a></li>`
            ).join("");

            if (liItems) {
                const tocList = <ul class="list_box_de">${liItems}</ul>;
                contentElement.insertAdjacentHTML('afterbegin', tocList);
            }
        }
    };
</script>

주의사항 및 팁

  • CSS 스타일링: 생성된 목차는 <ul class="list_box_de"> 클래스를 가집니다. 스킨 편집기의 CSS 파일에서 이 클래스를 사용하여 목차의 디자인을 자유롭게 꾸밀 수 있습니다.
  • 제목 태그 커스터마이징: 목차에 포함하고 싶은 제목 태그가 h2, h3, h4 외에 다른 태그라면, 코드의 const headers = ['h2', 'h3', 'h4']; 부분을 수정하여 사용하세요.
  • 본문 영역 변경 시: 티스토리 스킨이 업데이트되어 본문 영역을 나타내는 클래스명이 변경될 경우, document.querySelector('.entry-content > .tt_article_useless_p_margin') 부분을 새로운 클래스명으로 수정해야 합니다.
주의

이 스크립트는 `window.onload`를 통해 문서 전체 로딩이 끝난 후 실행됩니다. 다른 스크립트와 충돌이 발생할 경우, 실행 시점을 조정해야 할 수도 있습니다.

댓글