플러그인을 위한 스킨 치환자와 가상 치환자

텍스트큐브 스킨 사양에 정의되지 않은 치환자 ([##_치환자_##] 의 형태를 하고 있습니다) 에 플러그인의 핸들러를 붙이기 위해서는 tag을 사용합니다.
또한 스킨을 직접 수정하지 않더라도 기본적으로 제공하는 치환자들이 있습니다. 스킨에도 보이지 않지만 마치 있는 것 처럼 동작하는 치환자들을 가상 치환자 (meta tag)라고 합니다.

기본 개념

tag방식은 주로 상황에 따라 쉽게 변하지 않는 내용을 스킨에 출력할 때 사용합니다. css파일의 링크를 출력하거나, 특정한 그림이나 배너, 주소등을 표기하기 위하여 유용하게 사용할 수 있습니다.
tag 방식의 플러그인 동작은 출력을 스킨에 끼워넣는 식으로 동작하기 때문에 tag을 통하여 플러그인의 함수와 스킨을 묶는 것은 굉장히 직관적입니다.

예제 : Hello World 플러그인

아래의 예제는 Hello World를 [##_HelloWorld_##]에 출력해주는 예제입니다.

  • index.xml
       <?xml version="1.0" encoding="utf-8"?>
       <plugin version="1.0">
         <title xml:lang="ko">안녕 세상아! (기본)</title>
         <link>http://www.example.com/</link>
         <version>1.0</version>
         <description xml:lang="ko">여기저기에 Hello world!를 출력해보는 예제 플러그인입니다.</description>
         <license>GPL</license>
         <author xml:lang="ko" link="http://www.example.com">슈퍼맨</author>
         <safety changeData="no" exposeData="no" accessLocal="no" accessRemote="no" accessRaw="no" />
         <requirements>
           <textcube>1.5</textcube>
         </requirements>
         <binding>
              <tag name="HelloWorld" handler="Helloworld_Show" />
         </binding>
       </plugin>
    
  • index.php
    <?php
         function Helloworld_Show($target) {
              return $target.'Hello World!';
         }
    ?>
    

listener와의 차이점

이벤트가 발생하는 시점을 파악하여 동작하는 listener 방식과는 달리, tag는 스킨이 출력되는 시점을 기준으로 빈 값, 또는 앞의 플러그인이 리턴한 결과값만을 인자로 보내줍니다. 또한 tag 방식의 플러그인이 동작하기 위해서는 스킨에 해당 치환자가 반드시 존재해야 하며, 존재하지 않는 경우에는 동작하지 않습니다.

가상 치환자

반드시 치환자가 존재해야만 동작한다는 tag 방식의 바인딩의 약점을 극복하기 위하여, 텍스트큐브는 스킨을 해석하며 특정한 위치에 가상으로 치환자가 있는 것 처럼 동작합니다. 이러한 가상 치환자를 사용하여, 스킨을 수정하는 번거로움을 감수하지 않고서도 스킨에 쉽게 html을 끼워 넣을 수 있습니다.

예를 들어, 웹 브라우저가 찾기 쉽도록 댓글 RSS의 주소를 스킨의 header 부분에 끼워넣고 싶은 경우를 가정해 보겠습니다. 이 경우 스킨의 <head> 태그 위치에

<head>
...
<link rel="alternate" type="application/rss+xml" title="TEST" href="/comment/rss" />
...
</head>

처럼 출력하기 위해서는 스킨을 직접 수정하거나 스킨에 [##_head_print_##] 등의 치환자를 추가한 다음

<?php
function print_comment_rss_link($target) {
     return $target.CRLF.'<link rel="alternate" type="application/rss+xml" title="TEST" href="/comment/rss" />'.CRLF;
}
?>

식의 핸들러를 만들어

     <binding>
          <tag name="head_print" handler="print_comment_rss_link" />
     </binding>

의 드라이버 xml을 사용하여 head_print()에 붙여야 할 것입니다. (CRLF는 텍스트큐브에서 사용할 수 있는 줄바꿈 문자입니다.)

가상 치환자를 이용하면 이런 경우 스킨에 치환자를 추가하지 않아도 됩니다. 위 예제의 경우, 치환자를 추가하지 않고

     <binding>
          <tag name="SKIN_head_end" handler="print_comment_rss_link" />
     </binding>

처럼 드라이버 xml을 만들면 실제로는 [##_SKIN_head_end_##]가 없음에도 불구하고 마치 있는 것 처럼 </head>태그의 윗줄에 붙습니다.

다음은 가상 치환자의 목록입니다.

  • SKIN_html_start - <html>태그의 밑 줄에 추가됩니다.
  • SKIN_head_start - <head>태그의 밑 줄에 추가됩니다.
  • SKIN_head_end - </head>태그의 윗 줄에 추가됩니다.
  • SKIN_body_start - <body>태그의 밑 줄에 추가됩니다.
  • SKIN_body_end - </body>태그의 윗 줄에 추가됩니다.
  • SKIN_html_end - </html>태그의 윗 줄에 추가됩니다.