/******************************************************************************* * Copyright 2013 Ivan Shubin http://mindengine.net * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package net.mindengine.blogix.markup; import java.io.StringWriter; import net.java.textilej.parser.MarkupParser; import net.java.textilej.parser.builder.HtmlDocumentBuilder; import net.java.textilej.parser.markup.textile.TextileDialect; import net.mindengine.blogix.markup.converters.Converter; import org.apache.commons.lang3.text.translate.AggregateTranslator; import org.apache.commons.lang3.text.translate.CharSequenceTranslator; import org.apache.commons.lang3.text.translate.LookupTranslator; public class TextileConverter implements Converter { private static final String AMP_CONVERTED = "$#$amp$#$"; private static final String LESS_THAN_CONVERTER = "$#$lt$#$"; private static final String GREATER_THAN_CONVERTER = "$#$gt$#$"; @Override public String convert(String definition, String text) { MarkupParser parser = createParser(); StringWriter sw = new StringWriter(); HtmlDocumentBuilder builder = new HtmlDocumentBuilder(sw); builder.setEmitAsDocument(false); builder.setEmitDtd(false); parser.setBuilder(builder); parser.parse(encode(text)); return decode(sw.toString()); } public static final CharSequenceTranslator ESCAPE_XML = new AggregateTranslator( new LookupTranslator(new String[][]{ {"&", AMP_CONVERTED}, {"<", LESS_THAN_CONVERTER}, {">", GREATER_THAN_CONVERTER}, }) ); public static final CharSequenceTranslator UNESCAPE_XML = new AggregateTranslator( new LookupTranslator(new String[][]{ {AMP_CONVERTED, "&"}, {LESS_THAN_CONVERTER, "<"}, {GREATER_THAN_CONVERTER, ">"}, }) ); private String encode(String text) { return ESCAPE_XML.translate(text); } private String decode(String text) { return UNESCAPE_XML.translate(text); } private MarkupParser createParser() { MarkupParser parser = new MarkupParser(); parser.setDialect(new TextileDialect()); return parser; } }