MT용 플러그인 - Korean Trim To and From - 한글 정확히 자르기 
MT에서는 Global Tag Attributes 인 trim_to="N"이라는 속성을 이용해 원하는 크기로 어떤 문자열이든 잘라서 일부분만 표시할 수 있습니다.
Recent Trackbacks/Comments 등에서 일정한 크기로 메인 인덱스에 표시할 때 일반적으로 많이 사용하고 내부적으로는 Excerpt를 별도로 적지 않은 엔트리를 트랙백 보낼 때, 본문의 일정 부분을 이 기능으로 잘라서 사용합니다.
다행히 Gratia 님이 만드신 패치를 통해 블로그 설치 초기에 적용해 잘 사용해 왔습니다. 무버블타입의 운용에 필수적인 몇몇 기능에 대한 플럭인 작성을 하다가, 이 루틴을 다시 보게 되었는데, 예전에 설치할 때 조금 이상하다 싶었던 부분(글자가 조금 덜 나타나는 것 같은...)의 동작을 조금 자세히 테스트해보니, UTF-8부분의 검사루틴이 조금 부정확하다는것을 알아냈습니다.
일단 UTF-8로 '한'이라는 글자는 3바이트로 구성되는데, 이 루틴에선 모두 2바이트로 구성된다고 가정하고 있고 또 그 값이 하한선 코드값도 실제보다 좀 큰 거 같더군요. 물론 정확히 N개의 글자를 딱 자른다는 목적이 아니라, 끝에 한 글자가 깨지지만 않으면 된다라는 목적하에선 문제없습니다. 그래서 일본 무버블타입의 경우 어떻게 처리하고 있을까를 파일을 받아 알아보고, 비슷한 방법을 적용하고 그외 추가적인 기능을 조금 덧붙여서 플러그인 형태로 만들게 되었습니다.
Description
일본의 무버블타입 소스를 보니, 이 trim_to 를 우리의 EUC-KR에 해당한다고 할 수 있는 EUC-JP로 무조건 변환한 후에, 그 값을 기준으로 일정부분을 취한 후, 다시 원래의 인코딩으로 변환해서 반환하는 구조더군요. 분명, 코드 자체의 범위를 기준으로 쉽게(코드 상으로는 간단하지만, UTF-8에 대해 정확하게 구현하는건 EUC만큼 쉽지 않고, 또 그보단 그 외의 한글 인코딩에 대해선 별도로 처리루틴을 만들어줘야 한다는 단점) 알아내는 것보다 조금 둘러가는 느낌입니다. UTF-8의 경우 4바이트까지(보통은 한글 3바이트) 크기가 올 수 있는 반면, EUC-KR은 조금 단순무식하게 모두 2바이트 구조라 바이트스트림내에서 한 캐릭터의 영/한 구분이 쉽습니다. 또 EUC-KR과 UTF-8 이외의 한글 인코딩에 대해서도 별도의 상하한 코드값에 의한 추가없이, Encoding 모듈이 처리만 해주면, 자동으로 가능한 구조라는게 장점입니다. 어쨋거나 일본 무버블타입처럼 인코딩모듈(Encode 혹은 Text::Iconv)을 이용한 trim_to 플럭인을 만들었습니다.
기존 MT의 디폴트 trim_to와 패치의 한계 부분
- 정확한 영문 1, 한글 1개의 글자단위로 자르지 못한 다는 점(한글은 그냥 크기 2로 계산)
- UTF-8의 경우, 실제 정한 크기 보다 더 잘리는 점
들어온 트랙백의 Excerpt부분을 예로 들면, 이 부분은 보통 본문의 앞부분을 취해 보내게 되는데, 이때 여기에 <a>태그 등 HTML태그가 포함되게 되면, 이 태그 자체의 내용도 모두 카운트해서 자르는 바람에, 정작 실제 화면에는 정한 글 수보다 훨씬 적은 내용만 찍히는 문제
간단한 기능 정리
- trim_to 뿐만 아니라, trim_from 도 가능합니다.
- trim_to="N" 으로 줬을 경우, 정확히 영/한 한 문자씩을 한 글자로 취급합니다.
- trim할 문자열 중에 포함된 HTML태그를 무시할 수도 있습니다.
- 별도의 설정없이 플럭인 내부에서 블로그 인코딩에 관계없이 알아서 변환해 줍니다.
- 인코딩 변환 모듈은 Encode 혹은 Text::Iconv를 사용하는데 먼저 Encode 모듈을 찾고 없으면 Text::Iconv 모듈을 이용하는 순입니다.
- 사용하는 인코딩모듈이 처리하는 한글 인코딩에 대해선 모두, 한글 한 글자 단위로 세어서 자를수 있습니다.
Installation
압축파일을 다운받아 푼 후, 그 파일을 mt/plugins 폴더에 둡니다.
Tag Usage
- <MTEntryBody trim_to="8">
가장 일반적인 형태의 사용예인데, 이렇게 만약 8이라는 값을 주면, 영문 한글자/한글 한글자씩 카운트해서 공백포함해서 정확히 여덟 글자를 잘라서 보여줍니다. 만약 trim할 문자열 중에 엔터키에 의한 입력값(10,13)의 값이 포함되어 있다면, 이는 세지 않습니다. 눈에 보이는 문자와 공백(space)만 카운팅합니다.
- <MTEntryBody trim_to="8 texts"> 혹은 <MTEntryBody trim_to="8texts">
숫자와 texts 사이에 공백을 넣어도 상관없습니다. 이렇게 속성을 주면, texts가 의미하는 대로, trim 할 문자열 중에서 HTML태그값은 카운팅 하지 않고 일반 텍스트만 카운팅해서 여덟 문자를 표시하라는 의미입니다.
예를 들어, 트림할 문자열(Incoming Trackback의 Excerpt) 내용이,
"<p>많은 블로그중에 <a href="http : //alogblog.com" title="알록블록">알록블록</a>이 제일 좋아요</p>" (실제 화면 상에는 "많은 블로그중에 알록블록이 제일 좋아요" 처럼 보일 문자열 )
라 한다면, 기존의 trim_to 는 이 문자열에 포함된 모든 문자(태그 <p>, <a href...> )에 대해 다 카운팅해서 자름니다. 그래서 만약 트랙백 맛보기로 30문자를 나타내기 위해, trim_to="30"으로 줬을 경우, 요약문에 태그가 없는 순수한 텍스트면 30문자 전후로 내용이 나타나지만, 위처럼 긴 HTML태그가 포함되어 있다면 실제 화면에 나타나는 글자는 훨씬 적을 수 있습니다.(가끔 트랙백보기에서 보셨을 겁니다.)
이럴 경우 trim_to="N texts" 라고 주면 실제 카운팅하는 문자열이, 위의 경우엔, "많은 블로그 중에 알록블록이 제일 좋아요" 처럼 화면에 표시되는 글자(즉 태그 내용 제외된)를 기준으로 카운팅해서 자름니다.
이렇게 사용함으로서 얻는 또하나의 장점은 혹시 N개의 문자열이 닫히는 HTML태그 전에 끝나서 태그가 불완전해지는 효과를 아예 차단해 줍니다. 위의 태그 포함된 트랙백 요약문에서 트림할 N개의 문자가 <a href="..." title="....여기서 끝나는 경우도 기존의 trim_to에선 생길 수 있습니다. 이럴 경우 HTML 유효성이 깨어지는 데, texts 옵션을 주면 이런 문제가 없어집니다. 이 texts 옵션을 그냥 디폴트로서 숫자면 줬을 경우에 작동하도록 하는게 더 사용상은 타당하지만, MT내부적으로 사용하는 형태를 보호한다는 측면에서 이를 옵션으로 처리했습니다.
- <MTEntryBody trim_to="8 texts....."> 혹은 <MTEntryBody trim_to="8.....">
디폴트로 trim이 적용되면 (공백+...) 문자열이 붙습니다. 만약 템플릿 태그 적용시에 이 디폴트 값 외에 다른 문자 등을 사용하고 싶다면 위처럼 숫자 바로 뒤, texts 바로 뒤에 내용을 적어주면 됩니다. 별 쓸 일 없을 것입니다.
- <MTEntryBody trim_from="8">
이 플럭인을 설치하면 trim_from 이라는 별도의 글로벌 속성이 추가됩니다. trim_from 이라는 말 자체의 의미랑은 조금 반대되는 기능이지만, trim_to 에 대구되는 기능으로서, 이 /alog 블로그 템플릿 디자인시에도 사용된 기능입니다.
이 trim_from 도 위의 trim_to 와 똑같이 댓구되는 모든 옵션(texts등)을 적용할 수 있습니다. trim_from="N" 을 적용하면, 주어진 문자열의 처음부터 N번째 글자(마찬가지로 영문 한글자, 한글 한문자식 세어서)까지를 짤라내 버리고, 그 후부터(N+1) 끝까지의 문자를 반환하는 기능입니다. 이 또한 일반적으로 잘 사용되지 않을 겁니다.
제 블로그에 적용한 한 예를 들면, Main Index 페이지의 최근 N개 엔트리 리스트에는 글의 첫부분에 이미지가 삽입되는 경우가 있습니다. 실제 엔트리 작성시에 이 이미지를 삽입한게 아닙니다. 개별 엔트리를 보면, 그 이미지가 나타나지 않으니까요. 그냥 인덱스 페이지에서 엔트리를 출력할 때만 이미지를 삽입한 것인데, 만약 이런 의도를 가질 경우 현재의 디폴트 태그 상태로는 구현이 거의 불가합니다. 왜냐면, 엔트리 입력시에 Text Formatting을 Convert Line Breaks로 둘 경우에, 본문 전후에 <p>태그가 자동으로 둘러 쌓여지기 때문에, Main Index Template의 <MTEntryBody>태그 앞에 이미지를 삽입하면, 글 자체에 이미지가 둘러 쌓여지지 않고 <p>태그 때문에 단락이 생겨, 이미지 단락 밑에 본문이 시작하는 조금 우스운 형태가 됩니다.(<img src="..."><p>본문...</p>) 이럴 경우에 trim_from 을 이용해서 trim_from="3" (<p>가 모두 3글자 이므로)을 주면, P태그가 잘린 형태가 되니까 메인 인덱스 템플릿에서 <p><img src="..."><MTEntryBody trim_from="3"> 식으로 하면 원하는 디자인을 얻을 수 있게 됩니다. (결과는 <p><img src="...">본문...</p> )
