Tabla - 간단한 태그 기반 템플릿 유틸리티
June 6th, 2008
Tabla는 간단한 태그 기반의 템플릿 유틸리티입니다. 컨텐츠의 특정부분을 마크업을 이용하여 컨텐츠의 내용을 가공하기 위해서 작성했었습니다. :-)
간단한 예제
- Tags tags = new Tags();
-
tags.addTag(new NamedTag() {
public String execute(ParseTag pt,TagContext tc) {
return "hello world!";
}
public String tagName() { return "t:hello"; }
- };
- Parser p = new Parser(tags);
- String result = p.parse("<t:hello />");
- >> 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을 구현하면 됩니다.
- Tag t = new Tag() {
- public String execute(ParseTag pt,TagContext tc) {
- return pt.getContent();
- }
- };
- Tags tags = new Tags();
- tags.addTag("t:*",t);
- ...
위의 코드는 t:으로 시작하는 모든 태그에 반응하게 됩니다. 물론 ParseTag.getTagName()으로는 정확한 태그 이름을 얻을수 있습니다.
파싱된 컨텐츠의 태그정보 - ParseTag
모든 태그는 ParseTag와 TagContext이라는 파라미터 객체를 얻게 됩니다. ParseTag은 Parser가 파싱한 컨텐츠중에 현재 태그에 해당하는 영역을 ParseTag에 담아서 전달하게 됩니다.
- class NewsDataTag implements NamedTag {
- public NewsDataTag(NewsDataService newsDataService) {
- this.newsDataService = newsDataService;
- }
- public String execute(ParseTag pt,TagContext tc) {
- String size = pt.getTagAttrMap("size");
- String category = pt.getTagAttrMap("category");
- List<NewsData> newsData = newsDataService.findBy(size,category);
- return newsData.toBuildHtml();
- }
- }
태그의 글로벌 영역? - TagContext
태그와 태그(중첩된 태그 등등)나 태그를 실행중으로 값을 전달할때가 있습니다.
- tags.add("t:container",new Tag() {
- public String execute(ParseTag pt,TagContext tc) {
- ...
- for(Item item : items) {
- tc.addLocalAttribute("itemTitle",item.getTitle());
- tc.addLocalAttribute("itemUrl",item.getUrl());
- result.append(pt.getContent());
- tc.clearLocalAttibutes();
- }
- return result.toString();
- }
- });
- tags.add("t:itemTitle",new Tag() {
- public String execute(ParseTag pt,TagContext tc) {
- String itemTitle = (String) tc.getLocalAttribute("itemTitle");
- if(itemTitle != null) {
- return itemTitle;
- }
- return pt.getContent();
- }
- });
- items: a,b,c
- <t:containter ><t:itemTitle />,</t:container>
- >> a,b,c,
기타
뭐 그리 잘 만들었다거 그런건 아니지만. 그리고 만든지 몇달이 지나서 그닥 머리속에 남아 있는 것이 별루 없긴 하네요. 좀더 수정할것은 많은 듯 합니다만. :-)

Leave a Reply