/**
* Copyright 2010-2014 Three Crickets LLC.
* <p>
* The contents of this file are subject to the terms of a BSD license. See attached license.txt.
* <p>
* Alternatively, you can obtain a royalty free commercial license with less limitations,
* transferable or non-transferable, directly from Three Crickets at http://threecrickets.com/
*/
package org.sikuli.syntaxhighlight;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.CodeSource;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Tal Liron
*/
public class Util {
public static String literalRegEx(String expression) {
return "\\Q" + expression + "\\E";
}
public static String replace(String string, String occurence, String replacement) {
return string.replaceAll(literalRegEx(occurence), replacement);
}
public static String streamToString(InputStream stream) throws IOException {
StringBuilder builder = new StringBuilder();
String line;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
while ((line = reader.readLine()) != null) {
builder.append(line).append("\n");
}
} finally {
stream.close();
}
return builder.toString();
}
public static String rejsonToJson(InputStream stream) throws IOException {
String rejson = streamToString(stream);
String json = rejsonToJson(rejson, true);
json = rejsonToJson(json, false);
return json;
}
public static String rejsonToJson(String rejson, boolean doubleQuote) {
Matcher matcher = doubleQuote ? DOUBLE_QUOTED_STRING.matcher(rejson) : SINGLE_QUOTED_STRING.matcher(rejson);
StringBuilder json = new StringBuilder();
int start = 0, end = 0, lastEnd = 0;
while (matcher.find()) {
lastEnd = end;
start = matcher.start();
end = matcher.end();
if ((start > 0) && (rejson.charAt(start - 1) == 'r')) {
// Convert Python-style r"" string to Java-compatible pattern
String string = rejson.substring(start + 1, end - 1);
json.append(rejson.substring(lastEnd, start - 1));
json.append('\"');
json.append(pythonRegExToJavaPattern(string, doubleQuote));
json.append('\"');
} /*
* else if( !doubleQuote ) { // From single quote to double quote
* String string = rejson.substring( start + 1, end - 1 );
* json.append( rejson.substring( lastEnd, start - 1 ) );
* json.append( '\"' ); json.append( string.replaceAll( "\"",
* "\\\\\"" ) ); json.append( '\"' ); }
*/ else {
// As is
json.append(rejson.substring(lastEnd, end));
}
}
json.append(rejson.substring(end));
// System.out.println( json );
return json.toString();
}
public static String pythonRegExToJavaPattern(String pattern, boolean doubleQuote) {
pattern = pattern.replaceAll("\\\\", "\\\\\\\\");
pattern = pattern.replaceAll("\\{", "\\\\\\\\{");
pattern = pattern.replaceAll("\\}", "\\\\\\\\}");
if (!doubleQuote) {
pattern = pattern.replaceAll("\"", "\\\\\"");
}
// System.out.println( pattern );
return pattern;
}
public static String escapeHtml(String text) {
text = text.replace("&", "&");
text = text.replace("<", "<");
text = text.replace(">", ">");
text = text.replace("\"", """);
text = text.replace("'", "'");
return text;
}
public static String asHtml(String text) {
text = escapeHtml(text);
text = text.replace(" ", " ");
return text;
}
private static final Pattern DOUBLE_QUOTED_STRING = Pattern.compile("\"(?>\\\\.|.)*?\"");
private static final Pattern SINGLE_QUOTED_STRING = Pattern.compile("'(?>\\\\.|.)*?'");
public static String extJSON = ".jso";
private static CodeSource csJygments = Jygments.class.getProtectionDomain().getCodeSource();
public static InputStream getJsonFile(String pack, String sub, String name, String fullname) {
URI jarFileURI = null;
File jarFile = null;
InputStream stream = null;
String jsonname = name.replace('.', '/') + extJSON;
fullname = fullname.replace('.', '/') + extJSON;
File fileInPack = null;
File fileInRoot = null;
try {
jarFileURI = csJygments.getLocation().toURI();
} catch (URISyntaxException ex) {
System.out.println("Util: getJsonFile: URISyntaxException: " + ex.toString());
}
if (jarFileURI != null ) {
String jarFilePath = jarFileURI.getPath();
if (jarFileURI.getScheme().equals("file") && !jarFilePath.contains(".jar")) {
if (!pack.isEmpty()) {
pack = pack.replace(".", "/");
if (!sub.isEmpty()) {
sub = sub.replace(".", "/");
pack = pack + "/" + sub;
fileInRoot = new File(jarFilePath, sub + "/" + jsonname);
}
fileInPack = new File(jarFilePath, pack + "/" + jsonname);
}
if (fileInPack != null && fileInPack.exists()) {
jarFile = fileInPack;
} else if (fileInRoot != null && fileInRoot.exists()) {
jarFile = fileInRoot;
}
if (jarFile != null) {
try {
stream = new FileInputStream(jarFile);
} catch (FileNotFoundException ex) {
System.out.println("Jygments: Util: not found:\n" + jarFile) ;
}
}
} else {
stream = Jygments.class.getClassLoader().getResourceAsStream(fullname);
}
}
return stream;
}
}