четверг, 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 коммент.: