Jekyll-Potion

code

code 는 markdown 에서 작성된 코드 블럭을 확장하여, 코드 제목, 복사기능과 더불어 블럭 내 {{ ~ }} 등의 liquid tag 문법 사용이 가능하도록 합니다.

기본적인 선언은 다음과 같습니다.

복사성공!
1
2
3
4
5
{% code title="test.java" %}
```
{content}
```
{% endcode %}

code tag 내 {content} 는 반드시 하나의 코드블럭 ```{content}``` 와 같이 구성되어야만 정확히 표현됩니다. 만일 코드블럭 바깥쪽에 컨텐츠가 존재할 경우 문법 오류가 발생하고, 빌드되지 않습니다.

codeproto theme 의 기본 template, javascript, stylesheet 는 다음과 같습니다.

이 값은 새로운 theme 작성시 용도에 맞게 변경이 가능합니다.

  • template
  • javascript
  • stylesheet
code.liquid
복사성공!
1
2
3
4
5
6
7
8
<div class="{{ code_class }}">
    <div class="header">
        <div class="title">{{ title }}</div>
        <div class="copy" data-code-copy-target-id></div>
        <div class="{{ success_class }}" data-skip-search-index>복사성공!</div>
    </div>
    <div class="body">{{ body }}</div>
</div>

template 작성 항목

변수명 필수여부 설명
code_class Y code 태그로 인해 생성되는 HTML Root 태그에 부여할 class name
title   code 블럭 Title
data-code-copy-target-id   code 블럭 복사 기능을 위한 key
만일 복사 기능을 사용하지 않을 경우 필요하지 않음
success_class   code 복사 성공시 노출될 main class name
data-skip-search-index   data-skip-search-indexmake_search_index_processor를 통해 검색 index 생성을 피하기 위한 keyword 입니다.
복사 성공시 노출되는 키워드이기 때문에 검색 index 를 만들 필요 없음
body Y code 본문
code.js
복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(($) => {
  class Code {
    constructor(options) {
      this.options = options
    }

    init() {
      let copy_codes = $('.{{ code_class }}').find('[data-code-copy-target-id]:not([data-potion-handled])')

      copy_codes.attr('data-potion-handled', 'true')
        .on('click', e => {
          e.preventDefault()

          let $clicked = $(e.currentTarget)

          parent = $clicked.parents('.{{ code_class }}')
          let code = parent.find('td.rouge-code').text().trim()

          navigator.clipboard.writeText(code).then(() => {
            let $success = parent.find('.{{ success_class }}')

            if ($success[0]) {
              $success.addClass('{{ success_show_class }}')
              setTimeout(() => $success.removeClass('{{ success_show_class }}'), 1000)
            }
          })
        })

      return copy_codes
    }
  }

  $.code = (options) => {
    return new Code(options)
  }
})(jQuery)

jekyll-potionjquery 를 사용합니다.

javascript 는 {{ ~ }} 을 포함한 template 이며, 설정에서 결정한 값을 매핑하여 javascript 파일을 생성합니다.

{{ ~ }} 구문은 태그 설정theme[].tags.code 항목을 참고해 주세요.

함수 설명

함수명 설명
init HTML 요소 내 code_class 로 설정한 class 를 찾고, 코드 블럭 복사 기능을 click 이벤트에 추가합니다.
event 를 추가한 다음 data-potion-handled attribute 를 추가하며, data-potion-handled attribute 가 추가된 HTML 요소에 대해서는 더 이상 event 를 추가하지 않습니다.

사용법

복사성공!
1
2
3
let code = $.code()

code.init() // 문서의 load, 갱신 시 호출해줍니다.
복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
div.tabs {
  @extend %box;
  @extend %item-width;

  & > ul {
    display: flex;
    column-gap: 0.5em;
    padding: 0;
    margin: 0 0 -1px;

    & > li.tab-title {
      @extend %title-fixed;
      display: block;
      padding: 0 2em;
      border-block-end: none;

      &.active {
        background-color: white;
      }

      &:hover {
        cursor: pointer;
      }
    }
  }

  & > div.tab-content {
    @include border(border);
    @extend %shadow;

    border-radius: 0 0.5em 0.5em 0.5em;
    padding: 1em 0.5em;
    display: none;

    &.active {
      display: block;
    }

    & > div.content {
      @extend %gap-grid-row;

      & > .code {
        width: 100%;
      }
    }
  }
}