четверг, 15 июля 2010 г.

Расширяем gwtwiki своими тегами

gwtwiki - это проект на Java, предоставляющий API, для преобразования Wiki разметки в html. Основан он на движке Bliki engine.

Несколько полезных ссылок:
    - Домашняя страница проекта gwtwiki. Java Wikipedia API (Bliki engine).
    - Захотелось попробовать, пожалуста - http://w-i-k-i.appspot.com/

API очень простое, но вот документация скудновата. Так как код написан хорошо, то заглянув в исходники, можно разобраться с любым функционалом. Хочу сэкономить ваше время и раcказать как быстро расширить движок своими wiki тегами.

Создание Wiki тег


Основой для моего wiki тега возьму NowikiTag. Все что вам нужно, так это переопределить метод renderHTML.

import info.bliki.htmlcleaner.TagNode;
import info.bliki.wiki.filter.ITextConverter;
import info.bliki.wiki.model.IWikiModel;
import info.bliki.wiki.tags.NowikiTag;

import java.io.IOException;
import java.util.Map;

public class MyTag extends NowikiTag {
 
 public MyTag(){
  super("my");
 }
 
 @Override
 public void renderHTML(ITextConverter converter, Appendable buf, IWikiModel model) throws IOException {
  
  TagNode node = this;

  //Список атрибутов, которые присутствуют в теге
  Map<String, String> tagAtttributes = node.getAttributes();
  
  //Контент, который находится внутри тега
  String content = getBodyString();
  
  buf.append('<p>My wiki tag.</p>');
  buf.append('\n');
  buf.append('<p>'+content</p>);
  buf.append('\n');
 }

 @Override
 public boolean isReduceTokenStack() {
  return true;
 }
}


Для того чтобы движок использовал наш wiki тег, необходимо его добавить в конфигурацию. Пишем наш класс конфигурации.

import info.bliki.wiki.addon.model.AddonConfiguration;

public class MyConfiguration extends AddonConfiguration {
 
 static {
  TAG_TOKEN_MAP.put("my", new MyTag());
 }

 public static MyConfiguration DEFAULT_CONFIGURATION = new MyConfiguration();

 public MyConfiguration() {
 }
}


Преобразование wiki разметки в html


Все кирпичики готовы, теперь можно использовать:
import info.bliki.wiki.model.WikiModel;
import info.bliki.wiki.model.Configuration;

public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  WikiModel wikiModel = 
            new WikiModel(new MyConfiguration(), "http://www.mywiki.com/wiki/${image}", "http://www.mywiki.com/wiki/${title}");
  String htmlStr = wikiModel.render("This is a simple [[Hello World]] <my>Wow!</my>");
  System.out.print(htmlStr);
 }

}


Вот и вся магия :).

1 комментарий: