2025년 11월 22일 토요일

블로그스팟 - 목차 만들기(+Blogger 테마에 자동 목차 생성,JavaScript 위젯 프로그램)

블로그스팟 - 목차 만들기(+Blogger 테마에 자동 목차 생성,JavaScript 위젯 프로그램)

Blogger 테마에 자동 목차 생성 기능을 추가하기 위한 JavaScript 위젯 프로그램입니다.

이 코드는 게시물 본문 내의 H2, H3, H4 태그를 자동으로 스캔하여 클릭 가능한 목차(Table of Contents)를 생성하고, 이를 게시물 제목 아래에 삽입합니다.

구현 난이도 '상'을 포함하는 이유는, 이 코드를 Blogger 테마의 HTML 편집 영역에 직접 삽입하고, 사용자의 테마 구조에 따라 특정 CSS 선택자(postBody 변수)를 조정해야 할 수도 있기 때문입니다.

아래 파일을 다운로드하여 내용을 복사한 후, Blogger 대시보드 -> 테마 -> HTML 편집으로 이동하여 </body> 닫는 태그 바로 위에 붙여넣으시면 됩니다.


<!--============================================================
Blogger 자동 목차 생성 위젯 (Automatic Table of Contents Widget)
============================================================
[사용 방법]
1. 이 전체 코드를 복사합니다.
2. Blogger 대시보드에서 [테마] -> [HTML 편집]으로 이동합니다.
3. </body> 닫는 태그 바로 위에 이 코드를 붙여넣습니다.
4. (선택 사항) 사용 중인 테마에 따라 '.post-body' 선택자가 다를 수 있습니다.
   만약 목차가 생성되지 않으면 JavaScript 코드 내의 'postBody' 변수 설정을
   게시물 본문 영역의 정확한 CSS 선택자로 변경해야 합니다.-->
<style>
/* ============================================================
목차 위젯 기본 스타일 (Custom Styles)
============================================================
*/
#auto-toc-container {
    border: 1px solid #e0e0e0;
    padding: 15px;
    margin: 20px 0;
    border-radius: 8px;
    background-color: #f9f9f9;
    font-family: 'Noto Sans', sans-serif;
}

#auto-toc-container h2 {
    font-size: 1.3em;
    color: #333;
    margin-top: 0;
    margin-bottom: 10px;
    border-bottom: 2px solid #ddd;
    padding-bottom: 5px;
    font-weight: 700;
}

#auto-toc-container ol {
    list-style-type: decimal; /* 숫자 목록 */
    padding-left: 20px;
    margin: 0;
}

#auto-toc-container ol li {
    margin-bottom: 5px;
    line-height: 1.5;
}

#auto-toc-container a {
    text-decoration: none;
    color: #007bff; /* 링크 색상 */
    transition: color 0.2s;
}

#auto-toc-container a:hover {
    color: #0056b3; /* 호버 색상 */
    text-decoration: underline;
}

/* 계층별 들여쓰기 */
.toc-list-level-2 {
    padding-left: 25px; /* H3는 더 깊게 들여쓰기 */
}
.toc-list-level-3 {
    padding-left: 45px; /* H4는 더 깊게 들여쓰기 */
}
</style>

<script>
//<![CDATA[
// JavaScript를 이용한 자동 목차 생성 로직
function generateTOC() {
    // 1. 블로그 게시물 본문 요소를 찾습니다.
    // 대부분의 Blogger 테마에서 작동하는 일반적인 선택자입니다.
    // 만약 목차가 생성되지 않으면, 사용 중인 테마의 게시물 본문 영역 클래스로 변경해야 합니다.
    const postBody = document.querySelector('.post-body') || document.querySelector('.entry-content') || document.querySelector('.post-content');

    // 게시물 본문을 찾지 못하거나 목차 생성 제외 태그가 발견되면 종료
    if (!postBody) return;
    
    // 이 코드를 추가하여 목차 생성을 원하지 않는 글을 제외할 수 있습니다.
    // <div class="no-toc"></div>를 글 본문에 추가하면 목차가 생성되지 않습니다.
    if (postBody.querySelector('.no-toc')) return;


    // 2. H2, H3, H4 태그를 모두 찾습니다. (H1은 게시물 제목이므로 제외)
    const headings = postBody.querySelectorAll('h2, h3, h4');
    if (headings.length < 2) return; // 최소 두 개 이상의 제목이 있어야 목차를 생성합니다.

    // 3. 목차(TOC) 컨테이너 생성
    const tocContainer = document.createElement('div');
    tocContainer.id = 'auto-toc-container';
    tocContainer.innerHTML = '<h2>목차 (Contents)</h2>'; 

    // 최상위 리스트 (H2 레벨) 시작
    let tocList = document.createElement('ol'); 
    tocList.className = 'toc-list-level-1';
    tocContainer.appendChild(tocList);

    let currentList = tocList; // 현재 작업 중인 리스트 요소 (ol)
    let currentLevel = 2;      // 현재 H 태그 레벨 (H2로 시작)

    headings.forEach((heading, index) => {
        const level = parseInt(heading.tagName.substring(1)); // 2, 3, or 4
        
        // 4. 고유 ID 생성 및 할당 (앵커 링크 연결을 위해 필수)
        const headingId = 'toc-heading-' + (index + 1) + '-' + heading.textContent.replace(/[^a-z0-9]/gi, '').substring(0, 10).toLowerCase();
        heading.id = headingId;

        // 5. 계층 구조에 맞게 리스트 조정 (들여쓰기)
        while (currentLevel < level) {
            // 하위 레벨로 내려가기 (예: H2 -> H3)
            const newList = document.createElement('ol');
            newList.className = `toc-list-level-${level}`;
            if (currentList.lastChild) {
                currentList.lastChild.appendChild(newList);
            } else {
                 // H2가 바로 H4로 넘어가는 등 비정상적인 구조일 때 대비
                currentList.appendChild(document.createElement('li')).appendChild(newList);
            }
            currentList = newList;
            currentLevel++;
        }

        while (currentLevel > level) {
            // 상위 레벨로 올라가기 (예: H4 -> H2)
            currentList = currentList.parentNode.closest('ol');
            if (!currentList) {
                // 안전 장치: 최상위 리스트까지 올라왔다면 break
                currentList = tocList;
                break;
            }
            currentLevel--;
        }

        // 6. 목차 항목 (li) 생성 및 현재 리스트에 추가
        const listItem = document.createElement('li');
        const link = document.createElement('a');
        link.href = '#' + headingId;
        link.textContent = heading.textContent;
        listItem.appendChild(link);
        currentList.appendChild(listItem);
        currentLevel = level; // 현재 레벨 업데이트
    });

    // 7. 목차를 게시물 본문의 시작 부분에 삽입 (H1 바로 아래)
    postBody.insertBefore(tocContainer, postBody.firstChild);
}

// 페이지 로드 후 generateTOC 함수를 실행합니다.
// 앵커 링크 충돌을 막기 위해 DOMContentLoaded가 아닌 window.onload를 사용합니다.
window.onload = function() {
    // 딜레이를 주어 테마 로딩 완료 후 실행되도록 보장합니다.
    setTimeout(generateTOC, 500); 
};
//]]>
</script><br />

이 코드는 H2, H3, H4 태그의 들여쓰기를 정확히 반영하여 계층적인 목차를 생성해 독자가 글의 구조를 한눈에 파악할 수 있도록 돕습니다.

추가 팁:

  • 성능: window.onload 후 500ms의 딜레이(setTimeout)를 주어 다른 스크립트나 테마 요소가 먼저 로드된 후 목차를 생성하도록 하여 페이지 로딩 안정성을 높였습니다.

  • 제외 기능: 특정 글에 목차 생성을 원하지 않을 경우, 해당 글의 HTML 편집 모드에서 본문 아무 곳에 <div class="no-toc"></div> 태그를 삽입하면 목차 생성이 자동으로 건너뛰어집니다.

2025년 11월 11일 화요일

🎙️ 팟캐스트/숏츠 스크립트: 알리/테무 직구의 '뒷이야기'::할인코드 다 써도 폭탄 맞을 수 있습니다!" 알리/테무 직구의 숨겨진 함정 4가지

🎙️ 팟캐스트/숏츠 스크립트: 알리/테무 직구의 '뒷이야기'::  할인코드 다 써도 폭탄 맞을 수 있습니다!" 알리/테무 직구의 숨겨진 함정 4가지

정말 재미있는 형식으로 블로그 내용을 전환하는 아이디어입니다! 팟캐스트 또는 숏폼(Short-form, 숏츠) 형식의 스크립트는 시청자/청취자의 몰입도를 높일 수 있습니다.

1.팟캐스트: 스크립트는 이렇게

정보 전달자 '제이(J, 명확한 정보 제공 및 분석 담당)'와 청취자의 궁금증을 대변하는 '케이(K, 질문 및 경험 공유 담당)' 두 명의 대화로 구성된 스크립트를 작성합니다.

구분캐릭터스크립트 (어조: 빠르고 경쾌하게, 중요한 정보는 강조)
제목(인트로)[BGM 시작] 💸 "할인코드 다 써도 폭탄 맞을 수 있습니다!" 알리/테무 직구의 숨겨진 함정 4가지
오프닝K와, 제이님. 광군제라고 알리에서 뭘 엄청 샀는데, 솔직히 기분은 좋은데 찝찝해요. 가격이 너무 싸니까.
(1) 통관J그 찝찝함, 맞습니다. 대부분 가격만 보죠. 하지만 진짜 리스크는 배송이 아니라 '통관'에 있어요.
K통관이요? 그냥 세관 통과하는 거 아닌가요?
J아닙니다. '합산 과세'라는 지뢰밭이 있습니다. 여러 셀러에게 주문한 게 같은 날 세관에 도착해서 총 금액이 $150를 넘으면?
K아... 관세 폭탄?
J네. 알리가 배송 효율 높이려고 여러 개를 '합포장' 하는데, 그때 합산 과세가 터지기 쉽습니다. 여러 개 샀다면, 꼭 결제 시차를 두세요. 이게 첫 번째 뒷이야기입니다.
(2) 환불K혹시 물건이 깨져서 오거나 가품이면요? 환불 절차는 너무 복잡할 것 같아요.
J복잡한 게 아니라 증거 싸움입니다. 알리의 숨겨진 룰이 있어요. 물건 받고 '7일 이내'에 분쟁(Dispute) 제기하는 게 유리합니다.
K7일 이내. 왜죠?
J7일 지나면 셀러한테 돈이 넘어가거든요. 그리고 환불 확률 99% 높이는 팁이 있어요.
K뭔데요?
J'언박싱 영상'을 처음부터 끝까지 끊김 없이 촬영하는 겁니다. 파손이나 누락 증거로 영상만 한 게 없어요. 이게 두 번째 뒷이야기입니다.
(3) 전략K근데 테무는 왜 그렇게까지 돈을 써가면서 싸게 팔까요? 진짜 자선사업인가요?
J절대 아니죠. 테무의 진짜 목표는 '데이터 학습'입니다. 초저가로 일단 사람을 끌어와서, 그 사람이 뭘 클릭하고 뭘 검색하는지 행동 데이터를 수집하는 거죠.
K아, 결국 마케팅 비용이 아니라 데이터 수집 비용이네요.
J정확합니다. 반면 알리는 'Choice' 같은 걸로 신뢰도를 높이려 노력 중입니다. 아마존처럼 되려는 전략이죠. 이게 세 번째 뒷이야기고요.
(4) 꿀팁K그럼 마지막으로, 실패 없이 득템하려면 뭘 봐야 하나요?
J후기 점수보다 '판매량'과 '한국인 후기'의 실물 사진이 답입니다. 그리고 하나 더! 규격 오류가 엄청 많습니다.
K규격 오류요?
J네. 국내와 다른 110V 플러그나, 앱 연동이 중국 서버만 되는 제품이 많아요. 상세 페이지 끝까지 내려서 플러그 타입사용 전압을 꼭 확인하세요.
클로징K와, 가격에 숨겨진 진실이 많네요. 이제 직구할 때 결제창 말고 통관과 환불 규정부터 봐야겠어요.
J그렇죠. 싸게 사고, 안전하게 받는 것까지가 쇼핑의 완성입니다.
(아웃트로)[BGM 마무리]'

2. Suno BGM/오디오 아이디어는 이렇게

Suno 프롬프트는 [음악 스타일], [주요 악기], [분위기], [가사/내레이션] 순으로 구체화하는 것이 효과적입니다.

1. 🎤 인트로 (Intro) 아이디어: 호기심 유발 및 기대감 조성

인트로는 청취자의 귀를 사로잡고 '이 시리즈를 들어야 하는 이유'를 명확히 제시해야 합니다.

아이디어프롬프트 스타일 (Suno 입력용)핵심 내용 및 효과
A. 퓨처 테크 스타일[Synthwave / Energetic Upbeat EDM] [Heavy Synth, Driving Beat] [Futuristic, Exciting] Lyrics: "SEO Wars! Yoast or Rank Math? Stop guessing. The Ultimate WordPress SEO Showdown starts now! Unlock your traffic potential."효과: 빠르고 트렌디한 분위기로, SEO라는 기술적인 주제를 흥미롭게 포장하여 청취자의 집중도를 즉시 높입니다.
B. 전문가 분석 스타일[Jazzy Lo-Fi Beat / Smooth Groove] [Fender Rhodes Piano, Light Drum Kit] [Thoughtful, Professional] Lyrics: "The right tool changes everything. Deep dive into WordPress SEO giants. Yoast's legacy versus Rank Math's speed. Which one wins? Detailed analysis begins."효과: 전문적이고 차분한 분위기로, 신뢰감을 주며 분석 콘텐츠라는 점을 강조합니다.

2. 🎬 마무리 (Outro) 아이디어: 행동 촉구 (CTA) 및 다음 편 예고

마무리는 정보 전달 후 여운을 남기고, 청취자가 다음 단계로 이동하거나 다음 에피소드를 기다리도록 유도해야 합니다.

아이디어프롬프트 스타일 (Suno 입력용)핵심 내용 및 효과
A. 미션 완료 스타일[Uplifting Cinematic Score / Warm Piano] [String Ensemble, Gentle Percussion] [Satisfied, Concluding] Lyrics: "Decision made. You now know the winning strategy. Next week: We dive deep into the winner's settings. Don't just choose it, master it. See you in the next episode!"효과: 목표 달성 후의 성취감을 전달하며, 다음 편이 '실제 설정 가이드'임을 명확히 예고하여 구독을 유도합니다.
B. 행동 유도 스타일[Punchy Indie Rock / Driving Bassline] [Electric Guitar Riff, Vocal Melody] Lyrics: "Stop reading, start doing! Click the link below to install your chosen plugin now. If you choose Yoast, prepare for Part Two. If you choose Rank Math, get ready for Part Three! Let's optimize!"효과: 에너지를 높여 청취자에게 '지금 바로 행동하라'고 독려하며, 시청/청취 후 행동으로 이어지도록 CTA를 강조합니다.

이러한 아이디어를 Suno에 입력하실 때, [Music Style] 부분을 가장 중요하게 생각하고 그에 맞는 분위기(Lyrics)를 선택하시면 됩니다.