블로그 테마를 수정하던 중, yml 파일 내에서 Liquid 코드를 사용해야 하는 상황을 만나게 되었다.
1
2
3
4
5
<a href="https://twitter.com/intent/tweet?{% if site.twitter.username %}via={{ site.twitter.username | url_encode }}&{% endif %}text={{ page.title | url_encode }}%20{{ page.url | absolute_url | url_encode }}" class="page__share__btn--twitter">Twitter</a>
<a href="https://www.facebook.com/sharer/sharer.php?u={{ page.url | absolute_url | url_encode }}" class="page__share__btn--facebook">Facebook</a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url={{ page.url | absolute_url | url_encode }}" class="page__share__btn--linkedin">LinkedIn</a>
위 코드는 내 블로그 포스트 화면 아래에 있는 공유하기 링크 영역에 대한 HTML 코드임. a 요소들은 하드코딩으로 들어간 똑같은 Liquid 코드를 가지고 있는 상황인데, 저런 중복 코드를 개선해보려고 yml 파일에 데이터를 넣은 다음, Liquid로 반복문을 돌려서 a 요소를 뿌려주는 로직을 구상, 실행에 옮겨 보았음.
1
2
3
4
5
6
7
sns:
- link: https://twitter.com/intent/tweet?{% if site.twitter.username %}via={{ site.twitter.username | url_encode }}&{% endif %}text={{ page.title | url_encode }}%20{{ page.url | absolute_url | url_encode }}
label: "Twitter"
- link: https://www.facebook.com/sharer/sharer.php?u={{ page.url | absolute_url | url_encode }}
label: "Facebook"
- link: https://www.linkedin.com/shareArticle?mini=true&url={{ page.url | absolute_url | url_encode }}
label: "LinkedIn"
1
2
3
{% for link in site.sns %}
<a href="{{ link.url }}" class="page__share__btn--{{ link.label }}">{{ link.label }}</a>
{% endfor %}
된 줄 알았지만 아니다.. 우선 yml 파일 안에서는 Liquid 코드가 인식되지 않는다. 즉 위 코드의 출력 결과는 Liquid 코드가 그대로 출력되는 것임.. link.label
은 순수 문자열을 담고 있으므로 정상 출력된다.
찾아본 방법
검색을 해보니 비슷한 상황에 직면한 이가 올린 질문이 있었다. 어느 답변자가 자신이 만든 Ruby 플러그인 사용을 권했는데, 다운로드 후 적용을 해봤다.
1
2
3
{% for link in site.sns %}
<a href="{{ link.url | liquify }}" class="page__share__btn--{{ link.label }}">{{ link.label }}</a>
{% endfor %}
liquify
로 해당 플러그인을 사용하여 Liquid 코드를 변환해준다.
결과
로컬에서 정상 작동을 확인했으나, 실서버에서는 적용되지 않은 듯 Liquid 코드가 그대로 출력되는 것을 확인했다. 중요한 것 하나를 잊고 있었는데, Github pages는 Jekyll 플러그인 빌드를 허용하지 않는다는 사실.. 몇 번을 생각하는 거지만 처음부터 Netlify를 썼어야 했다..
대안
굳이 하드코딩으로 넣어도 되는 것이긴 한데, 코드 중복에 대한 강박관념(?) 같은 게 있어서 머리를 좀 굴려봤다. 우선 href 속성값에 들어가는 url은 하드코딩으로 넣고, 클래스를 Liquid 변수에 담아서 a 요소에 넣는 로직을 적용해봤음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{% capture commonClass %}
page__share__btn--
{% endcapture %}
{% capture commonAttribute %}
title="{{ site.data.ui-text[site.locale].target_blank }}"
rel="noopener noreferrer nofollow"
onclick="window.open(this.href, 'window', 'left=20, top=20, width=500, height=500, toolbar=1, resizable=0'); return false;"
{% endcapture %}
<a href="" class="{{ commonClass }}twitter" {{ commonAttribute }}>Twitter</a>
<a href="" class="{{ commonClass }}facebook" {{ commonAttribute }}>Facebook</a>
<a href="" class="{{ commonClass }}linkedin" {{ commonAttribute }}>LinkedIn</a>
url은 너무 길어서 예시에서 생략했고, 처음에 들었던 예시에서 다 쓰면 너무 길어져서 생략했던 title, rel, onclick 속성도 예시에 넣었음. title 속성값에는 yml 파일에서 불러오는 “새창”이라는 텍스트가 들어가고, rel 속성값은 보안 관련 유명한 사항이니 설명 패스, onclick 이벤트에는 해당 a 요소의 url을 윈도우 팝업으로 여는 핸들러가 들어간다. 이렇게 해서 정상 적용되었고 오늘의 삽질은 여기까지.. -_-