All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jp.vmi.html.result.UrlEncodeRenderer Maven / Gradle / Ivy

package jp.vmi.html.result;

import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.Charsets;

import com.floreysoft.jmte.NamedRenderer;
import com.floreysoft.jmte.RenderFormatInfo;

/**
 * URL encode renderer for JMTE.
 */
public class UrlEncodeRenderer implements NamedRenderer {

    // This pattern equivalent to JavaScript encodeURI().
    // see: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/encodeURI
    private static Pattern RE = Pattern.compile("[^;,/?:@&=+$A-Za-z0-9\\-_.!~*'()#]+");

    @Override
    public RenderFormatInfo getFormatInfo() {
        return null;
    }

    @Override
    public String getName() {
        return "u";
    }

    @Override
    public Class[] getSupportedClasses() {
        return new Class[] { Object.class };
    }

    private StringBuilder encode(StringBuilder sb, String s) {
        for (byte b : s.getBytes(Charsets.UTF_8))
            sb.append(String.format("%%%02x", b));
        return sb;
    }

    @Override
    public String render(Object o, String format, Locale locale) {
        StringBuilder result = new StringBuilder();
        String s = o.toString();
        Matcher matcher = RE.matcher(s);
        int index = 0;
        while (matcher.find(index)) {
            int start = matcher.start();
            if (index < start)
                result.append(s, index, start);
            encode(result, matcher.group());
            index = matcher.end();
        }
        if (index < s.length())
            result.append(s, index, s.length());
        return result.toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy