Tabla - 간단한 태그 기반 템플릿 유틸리티

Tabla는 간단한 태그 기반의 템플릿 유틸리티입니다.  컨텐츠의 특정부분을 마크업을 이용하여 컨텐츠의 내용을 가공하기 위해서 작성했었습니다. :-)

간단한 예제

  1. Tags tags = new Tags();
  2. tags.addTag(new NamedTag() {

        public String execute(ParseTag pt,TagContext tc) {

          return "hello world!";

        }

        public String tagName() { return "t:hello"; } 

  3. };
  4.  
  5. Parser p = new Parser(tags);
  6. String result = p.parse("<t:hello />");
  7.  
  8. >> hello world!

 

클래스들

 1. Tag - 태그의 인터페이스.  태그의 행동을 정의합니다. 

 2. NamedTag - 태그(Tag)의 인터페이스 상속.  태그이름(tagName)을 등록할수 있습니다.  

 3. Tags - 태그들 

 4. TagBinding - 파싱된 컨텐츠(Parse)와 Tag을 바인딩(Binding)하는 책임이 있습니다. 

 5. TagContext - 외부 환경이나 태그 간의 문맥적으로 값을 전달할때 사용됩니다. 

 6. Parse - 파싱된 컨텐츠(Parse)

 7. ParseTag  - 파싱된 컨텐츠중 태그 정보 

 8. Parser - 파서 

 9. ParseFailureException - 파싱 실패 예외 상황 

 10. utils.ParseTagRemover - 태그 시그니처 제거자 유틸리티. 

 

태그 정의 하기

태그를 정의하는 건 매우 쉽습니다. Tag,NamedTag을 구현하면 됩니다. 

  1. Tag t = new Tag() {
  2.     public String execute(ParseTag pt,TagContext tc) {
  3.        return pt.getContent();
  4.     }
  5. };
  6. Tags tags = new Tags(); 
  7. tags.addTag("t:*",t);
  8. ...

위의 코드는 t:으로 시작하는 모든 태그에 반응하게 됩니다. 물론  ParseTag.getTagName()으로는 정확한 태그 이름을 얻을수 있습니다. 

 

파싱된 컨텐츠의 태그정보 - ParseTag

모든 태그는 ParseTag와 TagContext이라는 파라미터 객체를 얻게 됩니다. ParseTag은 Parser가 파싱한 컨텐츠중에 현재 태그에 해당하는 영역을 ParseTag에 담아서 전달하게 됩니다.  

  1. class NewsDataTag implements NamedTag {
  2.    public NewsDataTag(NewsDataService newsDataService) {
  3.       this.newsDataService = newsDataService;
  4.    }
  5.    public String execute(ParseTag pt,TagContext tc) {
  6.       String size = pt.getTagAttrMap("size");
  7.       String category = pt.getTagAttrMap("category");
  8.       List<NewsData> newsData = newsDataService.findBy(size,category);
  9.       return newsData.toBuildHtml();
  10.    }
  11. }

 

 

태그의 글로벌 영역? - TagContext

태그와 태그(중첩된 태그 등등)나 태그를 실행중으로 값을 전달할때가 있습니다.

  1. tags.add("t:container",new Tag() {
  2.    public String execute(ParseTag pt,TagContext tc) {
  3.       ...
  4.       for(Item item : items) {
  5.           tc.addLocalAttribute("itemTitle",item.getTitle());
  6.           tc.addLocalAttribute("itemUrl",item.getUrl());
  7.           result.append(pt.getContent());
  8.           tc.clearLocalAttibutes();
  9.       }
  10.       return result.toString();
  11.    } 
  12. });
  13.  
  14. tags.add("t:itemTitle",new Tag() {
  15.     public String execute(ParseTag pt,TagContext tc) {
  16.        String itemTitle = (String) tc.getLocalAttribute("itemTitle");
  17.        if(itemTitle != null) {
  18.            return itemTitle;
  19.        }
  20.        return pt.getContent();
  21.     }
  22. });
  23.  

 

  1. items: a,b,c 
  2. <t:containter ><t:itemTitle />,</t:container>   
  3. >> a,b,c,

 

기타

뭐 그리 잘 만들었다거 그런건 아니지만. 그리고 만든지 몇달이 지나서 그닥 머리속에 남아 있는 것이 별루 없긴 하네요. 좀더 수정할것은 많은 듯 합니다만. :-)

 

tabla-0.0.2-sources.jar

tabla-0.0.2.jar

 

 

 

 

 

Creative Commons License