회원가입

[개선] 오늘의 교훈 영역 Markdown to HTML

Beany 2024-10-01

ChatGPT 요약

이 포스트에서는 웹사이트에서 Markdown 코드를 HTML로 변환하는 작업과 Markdown 라이브러리 선택에 관한 내용이 소개되었습니다. Markdown 라이브러리로 marked.js를 선택한 이유와 직접 JS 파일을 사용한 이유, 그리고 UI 개선 작업에 대한 내용이 포함되어 있습니다. 또한 코드 블록과 '자세히 보기' 버튼에 대한 수정 사항이 소개되었고, Markdown 스타일을 개선하는 방법도 소개되었습니다. 최종적으로 UI가 잘 개선되었다는 내용으로 마무리되었습니다.

지금 블로그 내부에 오늘의 교훈 부분이 있습니다.

이 부분은 하루에 한 번씩 ChatGPT API를 이용해 원하는 내용을 작성해주는 영역입니다.

 

현재 문제는 코드가 작성되는 부분에서, 코드 블록 등 Markdown으로 만들어진 영역이 제대로 표시되지 않는다는 점입니다.
이 문제를 해결하기 위해 Markdown을 HTML로 변환하는 라이브러리를 이용해 개선하려고 합니다.

해결을 위해 아래 두 가지 사항을 중점적으로 고려할 계획입니다:

  1. 간단하게 적용 가능한 라이브러리
  2. CDN 기반 라이브러리

결정은 marked.js로 했다. 그 이유는 세 가지 라이브러리 중에서 가장 많은 Star를 받은 점이 컸다. Star 수가 많고, 지속적으로 유지보수되고 있다는 점이 마음에 들어 이 라이브러리를 사용하기로 했다.

 

이제 적용해보자.

https://www.jsdelivr.com/package/npm/marked?tab=files를 참고하여 직접 JS 파일을 만들었다. 이렇게 한 이유는, 가끔 CDN에 문제가 발생할 수 있기 때문에 JS 파일을 직접 복사해 사용하기로 한 것이다.

python manage.py collectstatic

 

등록한 marked.js 파일을 이용해 기존의 "오늘의 교훈" 부분을 수정했다.

<script src="{% static 'markedjs_14_1_2.js' %}"></script>
<script>
    $(document).ready(function() {
        const normalText = document.getElementById('lesson_body').innerHTML;
        document.getElementById('lesson_body').innerHTML = marked.parse(normalText);

        $('#lesson_detail').on('click', function() {
            const $p = $(this).parent().parent().find('p');

            if ($p.hasClass('bottom_hidden_text')) {
                $p.removeClass('bottom_hidden_text')
                    .addClass('bottom_hidden_text-with-out-overflow')
                    .css('height', 'auto');

                let scrollHeight = $p.get(0).scrollHeight;

                $p.css('height', '150px');
                $p.stop().animate({ height: scrollHeight + "px" }, 500);

                $(this).text('접기');
            } else {
                $p.stop().animate({ height: "150px" }, 500, function() {
                    $p.removeClass('bottom_hidden_text-with-out-overflow')
                        .addClass('bottom_hidden_text');
                });

                $(this).text('자세히보기');
            }
        });
    });
</script>

 

그러나, 수정 후 문제가 발생했다.

"자세히 보기" 버튼이 정상적으로 작동하지 않았고, 코드 블록 영역의 스타일도 원하는 대로 디자인되지 않았다.
우선 "자세히 보기" 버튼을 고쳐보자.

 

자세히 보기 Fix

기존 UI가 마음에 들지 않아, 아래 부분을 흐리게 만드는 UI를 적용하려고 한다. 가끔 사이트에서 구매 후에 내용을 보여주는 방식처럼, 아래를 흐리게 처리하는 UI를 사용해 볼 계획이다.

 

<style>
...
.bottom_hidden_text {
    font-size: 15px;
    overflow: hidden;
    text-overflow: ellipsis;
    max-height: 150px;
    height: 150px;
    display: -webkit-box;
    transition: max-height 0.3s ease-out;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    mask-image: linear-gradient(to bottom, black 60%, transparent 100%);
    -webkit-mask-image: linear-gradient(to bottom, black 60%, transparent 100%);
}

.bottom_hidden_text-with-out-overflow {
    font-size: 15px;
    height: auto; /* 펼쳐질 때 높이를 자동으로 설정 */
    transition: none; /* jQuery 애니메이션이 적용되므로 transition은 해제 */
}
...
</style>
<h5 class="rounded-top border border-dark bg-light p-2">오늘의 교훈</h5>
    <div class="col-12">
    <div class="card">
        <div class="row g-0">
            <div class="col-12">
                <div class="card-body">
                    <h5 class="card-title">{{ lesson.summary }}</h5>
                    <p id="lesson_body" class="card-text bottom_hidden_text">{{ lesson.body }}</p>
                    <div class="fade-out"></div>
                    <div class="card-text text-center">
                        <span id="lesson_detail" style="cursor: pointer;">자세히보기</span>
                    </div>
                </div>
            </div>
        </div>
    </div>
    </div>

아주 잘 됐다.

 

이제 코드 블럭markdown 을 더 이쁘게 보여주자.

#lesson_body pre {
    background-color: #f8f9fa;
    border: 1px solid #e9ecef;
    border-radius: 0.25rem;
    padding: 1rem;
    overflow-x: auto;
}

완벽하다!!!

0 0
블로그 일기
제 블로그의 고도화 과정을 설명합니다. 이는 코드 리팩토링과 추가된 기능들에 대해 기록하기 위한 게시판입니다. 어떤 기능이 추가되었는지, 무엇이 개선되었는지 등 고도화되는 과정을 자세히 다룰 예정입니다.
Yesterday: 456
Today: 101